All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.testit.writers.HttpWriter Maven / Gradle / Ivy

package ru.testit.writers;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.testit.client.invoker.ApiException;
import ru.testit.client.model.*;
import ru.testit.clients.ApiClient;
import ru.testit.clients.ClientConfiguration;
import ru.testit.models.ClassContainer;
import ru.testit.models.ItemStatus;
import ru.testit.models.MainContainer;
import ru.testit.models.TestResult;
import ru.testit.services.ResultStorage;

import java.util.*;

public class HttpWriter implements Writer {
    private static final Logger LOGGER = LoggerFactory.getLogger(HttpWriter.class);
    private final Map testResults;
    private final ApiClient apiClient;
    private final ResultStorage storage;
    private final ClientConfiguration config;
    private final int maxTestsForWrite = 100;

    public HttpWriter(ClientConfiguration config, ApiClient client, ResultStorage storage) {
        this.config = config;
        this.apiClient = client;
        this.storage = storage;
        this.testResults = new HashMap<>();
    }

    @Override
    public void writeTest(TestResult testResult) {
        if (!config.shouldImportRealtime())
        {
            return;
        }

        writeTestRealtime(testResult);
    }

    private void writeTestRealtime(TestResult testResult) {
        try {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Write the auto test {}", testResult.getExternalId());
            }

            AutoTestModel autotest = apiClient.getAutoTestByExternalId(testResult.getExternalId());
            String autoTestId;

            if (autotest != null) {
                if (LOGGER.isDebugEnabled()) {
                    LOGGER.debug("The auto test {} is exist", testResult.getExternalId());
                }

                AutoTestPutModel autoTestPutModel = prepareToUpdateAutoTest(testResult, autotest);

                apiClient.updateAutoTest(autoTestPutModel);
                autoTestId = autotest.getId().toString();
            } else {
                AutoTestPostModel model = prepareToCreateAutoTest(testResult);
                autoTestId = apiClient.createAutoTest(model);
            }

            List workItemIds = testResult.getWorkItemIds();

            if (!workItemIds.isEmpty()) {
                updateTestLinkToWorkItems(autoTestId, workItemIds);
            }

            AutoTestResultsForTestRunModel autoTestResultsForTestRunModel = prepareTestResultForTestRun(testResult);

            List results = new ArrayList<>();
            results.add(autoTestResultsForTestRunModel);
            List ids = apiClient.sendTestResults(config.getTestRunId(), results);
            testResults.put(testResult.getUuid(), ids.get(0));
        } catch (ApiException e) {
            LOGGER.error("Can not write the autotest: " + (e.getMessage()));
        }
    }

    private AutoTestPostModel prepareToCreateAutoTest(TestResult testResult) throws ApiException {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Preparing to create the auto test {}", testResult.getExternalId());
        }

        AutoTestPostModel model = Converter.testResultToAutoTestPostModel(testResult);
        model.setProjectId(UUID.fromString(config.getProjectId()));

        //TODO: add WorkItemIds to AutoTestPutModel and AutoTestPostModel models after fixing the API
        List workItemUuids = apiClient.GetWorkItemUuidsByIds(testResult.getWorkItemIds());

        model.setWorkItemIdsForLinkWithAutoTest(new HashSet<>(workItemUuids));

        return model;
    }

    private AutoTestPutModel prepareToUpdateAutoTest(TestResult testResult, AutoTestModel autotest) throws ApiException {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Preparing to update the auto test {}", testResult.getExternalId());
        }

        AutoTestPutModel model;

        if (testResult.getItemStatus() == ItemStatus.FAILED) {
            model = Converter.autoTestModelToAutoTestPutModel(autotest);
            model.links(Converter.convertPutLinks(testResult.getLinkItems()));
        } else {
            model = Converter.testResultToAutoTestPutModel(testResult);
            model.setProjectId(UUID.fromString(config.getProjectId()));
        }

        model.setIsFlaky(autotest.getIsFlaky());

        //TODO: add WorkItemIds to AutoTestPutModel and AutoTestPostModel models after fixing the API
        List workItemUuids = apiClient.GetWorkItemUuidsByIds(testResult.getWorkItemIds());

        workItemUuids = prepareWorkItemUuidsForUpdateAutoTest(workItemUuids, autotest.getId().toString());

        model.setWorkItemIdsForLinkWithAutoTest(new HashSet<>(workItemUuids));

        return model;
    }

    private List prepareWorkItemUuidsForUpdateAutoTest(List workItemUuids, String autoTestId) throws ApiException {
        List linkedWorkItems = apiClient.getWorkItemsLinkedToTest(autoTestId);

        for (WorkItemIdentifierModel linkedWorkItem : linkedWorkItems) {
            UUID linkedWorkItemUuid = linkedWorkItem.getId();

            if (workItemUuids.contains(linkedWorkItemUuid) || config.shouldAutomaticUpdationLinksToTestCases()) {
                continue;
            }

            workItemUuids.add(linkedWorkItemUuid);
        }

        return workItemUuids;
    }

    private AutoTestResultsForTestRunModel prepareTestResultForTestRun(TestResult testResult)
    {
        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Preparing the test result for the auto test {}", testResult.getExternalId());
        }

        AutoTestResultsForTestRunModel model = Converter.testResultToAutoTestResultsForTestRunModel(testResult);
        model.setConfigurationId(UUID.fromString(config.getConfigurationId()));

        return model;
    }

    private void updateTestLinkToWorkItems(String autoTestId, List workItemIds) throws ApiException {
        List linkedWorkItems = apiClient.getWorkItemsLinkedToTest(autoTestId);

        for (WorkItemIdentifierModel linkedWorkItem : linkedWorkItems) {
            String linkedWorkItemId = linkedWorkItem.getGlobalId().toString();

            if (workItemIds.contains(linkedWorkItemId)) {
                workItemIds.remove(linkedWorkItemId);

                continue;
            }

            if (config.shouldAutomaticUpdationLinksToTestCases()) {
                apiClient.unlinkAutoTestToWorkItem(autoTestId, linkedWorkItemId);
            }
        }

        apiClient.linkAutoTestToWorkItems(autoTestId, workItemIds);
    }

    @Override
    public void writeClass(ClassContainer container) {
        if (!config.shouldImportRealtime())
        {
            return;
        }

        for (final String testUuid : container.getChildren()) {
            storage.getTestResult(testUuid).ifPresent(test -> {
                try {
                    AutoTestModel autoTestModel = apiClient.getAutoTestByExternalId(test.getExternalId());

                    if (autoTestModel == null) {
                        return;
                    }

                    AutoTestPutModel autoTestPutModel = Converter.autoTestModelToAutoTestPutModel(autoTestModel);

                    List beforeClass = Converter.convertFixture(container.getBeforeClassMethods(), null);
                    List beforeEach = Converter.convertFixture(container.getBeforeEachTest(), testUuid);
                    beforeClass.addAll(beforeEach);

                    List afterClass = Converter.convertFixture(container.getAfterClassMethods(), null);
                    List afterEach = Converter.convertFixture(container.getAfterEachTest(), testUuid);
                    afterClass.addAll(afterEach);

                    autoTestPutModel.setSetup(beforeClass);
                    autoTestPutModel.setTeardown(afterClass);

                    autoTestPutModel.setIsFlaky(autoTestModel.getIsFlaky());

                    apiClient.updateAutoTest(autoTestPutModel);
                } catch (ApiException e) {
                    LOGGER.error("Can not write the class: " + (e.getMessage()));
                }
            });
        }
    }

    @Override
    public void writeTests(MainContainer container) {
        if (config.shouldImportRealtime())
        {
            updateTestResults(container);

            return;
        }

        writeTestsAfterAll(container);
    }

    private void updateTestResults(MainContainer container) {
        List beforeAll = Converter.convertFixture(container.getBeforeMethods(), null);
        List afterAll = Converter.convertFixture(container.getAfterMethods(), null);
        List beforeResultAll = Converter.convertResultFixture(container.getBeforeMethods(), null);
        List afterResultAll = Converter.convertResultFixture(container.getAfterMethods(), null);

//        List results = new ArrayList<>();

        for (final String classUuid : container.getChildren()) {
            storage.getClassContainer(classUuid).ifPresent(cl -> {
                List afterClass = Converter.convertFixture(cl.getAfterClassMethods(), null);
                List beforeResultClass = Converter.convertResultFixture(cl.getBeforeClassMethods(), null);
                List afterResultClass = Converter.convertResultFixture(cl.getAfterClassMethods(), null);

                for (final String testUuid : cl.getChildren()) {
                    storage.getTestResult(testUuid).ifPresent(test -> {
                        try {
                            AutoTestModel autoTestModel = apiClient.getAutoTestByExternalId(test.getExternalId());

                            if (autoTestModel == null) {
                                return;
                            }

                            AutoTestPutModel autoTestPutModel = Converter.autoTestModelToAutoTestPutModel(autoTestModel);

                            List beforeFinish = new ArrayList<>(beforeAll);
                            beforeFinish.addAll(autoTestPutModel.getSetup());
                            autoTestPutModel.setSetup(beforeFinish);

                            List afterFinish = autoTestPutModel.getTeardown();
                            afterFinish.addAll(afterClass);
                            afterFinish.addAll(afterAll);
                            autoTestPutModel.setTeardown(afterFinish);

                            autoTestPutModel.setIsFlaky(autoTestModel.getIsFlaky());

                            apiClient.updateAutoTest(autoTestPutModel);

                            AutoTestResultsForTestRunModel autoTestResultsForTestRunModel = Converter.testResultToAutoTestResultsForTestRunModel(test);

                            List beforeResultEach = Converter.convertResultFixture(cl.getBeforeEachTest(), testUuid);
                            List beforeResultFinish = new ArrayList<>();
                            beforeResultFinish.addAll(beforeResultAll);
                            beforeResultFinish.addAll(beforeResultClass);
                            beforeResultFinish.addAll(beforeResultEach);

                            List afterResultEach = Converter.convertResultFixture(cl.getAfterEachTest(), testUuid);
                            List afterResultFinish = new ArrayList<>();
                            afterResultFinish.addAll(afterResultEach);
                            afterResultFinish.addAll(afterResultClass);
                            afterResultFinish.addAll(afterResultAll);

                            autoTestResultsForTestRunModel.setSetupResults(beforeResultFinish);
                            autoTestResultsForTestRunModel.setTeardownResults(afterResultFinish);

                            UUID testResultId = testResults.get(test.getUuid());

                            TestResultResponse resultModel = apiClient.getTestResult(testResultId);
                            TestResultUpdateV2Request model = Converter.testResultToTestResultUpdateModel(resultModel);
                            model.setSetupResults(beforeResultFinish);
                            model.setTeardownResults(afterResultFinish);

                            apiClient.updateTestResult(testResultId, model);

                        } catch (ApiException e) {
                            LOGGER.error("Can not update the autotest: " + (e.getMessage()));
                        }
                    });
                }
            });
        }
    }

    private void writeTestsAfterAll(MainContainer container) {
        List beforeAll = Converter.convertFixture(container.getBeforeMethods(), null);
        List afterAll = Converter.convertFixture(container.getAfterMethods(), null);
        List beforeResultAll = Converter.convertResultFixture(container.getBeforeMethods(), null);
        List afterResultAll = Converter.convertResultFixture(container.getAfterMethods(), null);

        List autotestsForCreate = new ArrayList<>();
        List autotestsForUpdate = new ArrayList<>();
        List resultsForAutotestsBeingCreated = new ArrayList<>();
        List resultsForAutotestsBeingUpdated = new ArrayList<>();

        for (final String classUuid : container.getChildren()) {
            storage.getClassContainer(classUuid).ifPresent(cl -> {
                List beforeClass = Converter.convertFixture(cl.getBeforeClassMethods(), null);
                List beforeResultClass = Converter.convertResultFixture(cl.getBeforeClassMethods(), null);
                List afterClass = Converter.convertFixture(cl.getAfterClassMethods(), null);
                List afterResultClass = Converter.convertResultFixture(cl.getAfterClassMethods(), null);

                for (final String testUuid : cl.getChildren()) {
                    storage.getTestResult(testUuid).ifPresent(test -> {
                        try {
                            List beforeEach = Converter.convertFixture(cl.getBeforeEachTest(), testUuid);
                            List beforeResultEach = Converter.convertResultFixture(cl.getBeforeEachTest(), testUuid);
                            List beforeResultFinish = new ArrayList<>();
                            beforeResultFinish.addAll(beforeResultAll);
                            beforeResultFinish.addAll(beforeResultClass);
                            beforeResultFinish.addAll(beforeResultEach);

                            List afterEach = Converter.convertFixture(cl.getAfterEachTest(), testUuid);
                            List afterResultEach = Converter.convertResultFixture(cl.getAfterEachTest(), testUuid);
                            List afterResultFinish = new ArrayList<>();
                            afterResultFinish.addAll(afterResultEach);
                            afterResultFinish.addAll(afterResultClass);
                            afterResultFinish.addAll(afterResultAll);

                            List beforeFinish = new ArrayList<>();
                            beforeFinish.addAll(beforeAll);
                            beforeFinish.addAll(beforeClass);
                            beforeFinish.addAll(beforeEach);

                            List afterFinish = new ArrayList<>();
                            afterFinish.addAll(afterEach);
                            afterFinish.addAll(afterClass);
                            afterFinish.addAll(afterAll);

                            AutoTestModel autoTestModel = apiClient.getAutoTestByExternalId(test.getExternalId());
                            AutoTestResultsForTestRunModel autoTestResultsForTestRunModel = prepareTestResultForTestRun(test);

                            autoTestResultsForTestRunModel.setSetupResults(beforeResultFinish);
                            autoTestResultsForTestRunModel.setTeardownResults(afterResultFinish);

                            if (autoTestModel == null) {
                                AutoTestPostModel model = prepareToCreateAutoTest(test);

                                model.setSetup(beforeFinish);
                                model.setTeardown(afterFinish);

                                autotestsForCreate.add(model);
                                resultsForAutotestsBeingCreated.add(autoTestResultsForTestRunModel);

                                if (autotestsForCreate.size() >= maxTestsForWrite)
                                {
                                    apiClient.createAutoTests(autotestsForCreate);
                                    apiClient.sendTestResults(config.getTestRunId(), resultsForAutotestsBeingCreated);

                                    autotestsForCreate.clear();
                                    resultsForAutotestsBeingCreated.clear();
                                }
                            } else {
                                AutoTestPutModel model = prepareToUpdateAutoTest(test, autoTestModel);

                                model.setSetup(beforeFinish);
                                model.setTeardown(afterFinish);

                                autotestsForUpdate.add(model);
                                resultsForAutotestsBeingUpdated.add(autoTestResultsForTestRunModel);

                                if (autotestsForUpdate.size() >= maxTestsForWrite)
                                {
                                    apiClient.updateAutoTests(autotestsForUpdate);
                                    apiClient.sendTestResults(config.getTestRunId(), resultsForAutotestsBeingUpdated);

                                    autotestsForUpdate.clear();
                                    resultsForAutotestsBeingUpdated.clear();
                                }
                            }
                        } catch (ApiException e) {
                            LOGGER.error(e.getMessage());
                        }
                    });
                }
            });
        }

        try {
            if (!autotestsForCreate.isEmpty()) {
                apiClient.createAutoTests(autotestsForCreate);
                apiClient.sendTestResults(config.getTestRunId(), resultsForAutotestsBeingCreated);

                autotestsForCreate.clear();
                resultsForAutotestsBeingCreated.clear();
            }
            if (!autotestsForUpdate.isEmpty())
            {
                apiClient.updateAutoTests(autotestsForUpdate);
                apiClient.sendTestResults(config.getTestRunId(), resultsForAutotestsBeingUpdated);

                autotestsForUpdate.clear();
                resultsForAutotestsBeingUpdated.clear();
            }
        } catch (ApiException e) {
            LOGGER.error(e.getMessage());
        }
    }

    @Override
    public String writeAttachment(String path) {
        try {
            return apiClient.addAttachment(path);
        } catch (ApiException e) {
            LOGGER.error("Can not write attachment: " + (e.getMessage()));

            return "";
        }
    }

    void addUuid(String key, UUID uuid) {
        this.testResults.put(key, uuid);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy