From dd29e963a7cb22751cec50d9aad77dbea15ca1c5 Mon Sep 17 00:00:00 2001 From: Redouane BENYOUSSEF Date: Tue, 27 Jun 2023 16:56:10 +0200 Subject: [PATCH] fix(server): save campaign - scenario link at scenario execution end --- .../domain/execution/ExecutionRequest.java | 14 +++++++++----- .../ScenarioExecutionEngineAsync.java | 4 ++-- .../campaign/CampaignExecutionEngine.java | 18 +++++++++--------- .../DatabaseExecutionHistoryRepository.java | 14 ++++++++++++-- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ExecutionRequest.java b/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ExecutionRequest.java index b2fb1fcda..e4d26d70f 100644 --- a/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ExecutionRequest.java +++ b/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ExecutionRequest.java @@ -2,6 +2,7 @@ import com.chutneytesting.server.core.domain.dataset.DataSet; import com.chutneytesting.server.core.domain.scenario.TestCase; +import com.chutneytesting.server.core.domain.scenario.campaign.CampaignExecutionReport; public class ExecutionRequest { @@ -9,19 +10,22 @@ public class ExecutionRequest { public final String environment; public final String userId; public final DataSet dataset; + public final CampaignExecutionReport campaignExecutionReport; - public ExecutionRequest(TestCase testCase, String environment, String userId, DataSet dataset) { + public ExecutionRequest(TestCase testCase, String environment, String userId, DataSet dataset, CampaignExecutionReport campaignExecutionReport) { this.testCase = testCase; this.environment = environment; this.userId = userId; this.dataset = dataset; + this.campaignExecutionReport = campaignExecutionReport; + } + + public ExecutionRequest(TestCase testCase, String environment, String userId, DataSet dataset) { + this(testCase, environment, userId,dataset, null); } public ExecutionRequest(TestCase testCase, String environment, String userId) { - this.testCase = testCase; - this.environment = environment; - this.userId = userId; - this.dataset = DataSet.NO_DATASET; + this(testCase, environment, userId,DataSet.NO_DATASET, null); } } diff --git a/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ScenarioExecutionEngineAsync.java b/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ScenarioExecutionEngineAsync.java index 3fdf277d6..90f48c1dc 100644 --- a/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ScenarioExecutionEngineAsync.java +++ b/server-core/src/main/java/com/chutneytesting/server/core/domain/execution/ScenarioExecutionEngineAsync.java @@ -84,7 +84,7 @@ public ScenarioExecutionEngineAsync(ExecutionHistoryRepository executionHistoryR */ public Long execute(ExecutionRequest executionRequest) { // Compile testcase for execution - ExecutionRequest executionRequestProcessed = new ExecutionRequest(testCasePreProcessors.apply(executionRequest), executionRequest.environment, executionRequest.userId, executionRequest.dataset); + ExecutionRequest executionRequestProcessed = new ExecutionRequest(testCasePreProcessors.apply(executionRequest), executionRequest.environment, executionRequest.userId, executionRequest.dataset, executionRequest.campaignExecutionReport); // Initialize execution history ExecutionHistory.Execution storedExecution = storeInitialReport(executionRequestProcessed); // Start engine execution @@ -112,6 +112,7 @@ private ExecutionHistory.Execution storeInitialReport(ExecutionRequest execution .testCaseTitle(executionRequest.testCase.metadata().title()) .environment(executionRequest.environment) .user(executionRequest.userId) + .campaignReport(ofNullable(executionRequest.campaignExecutionReport)) .build(); return executionHistoryRepository.store(executionRequest.testCase.id(), detachedExecution); @@ -165,7 +166,6 @@ private void setExecutionToFailed(String scenarioId, ExecutionHistory.Execution } - public Observable followExecution(String scenarioId, Long executionId) { if (scenarioExecutions.containsKey(executionId)) { return scenarioExecutions.get(executionId).getLeft(); diff --git a/server/src/main/java/com/chutneytesting/execution/domain/campaign/CampaignExecutionEngine.java b/server/src/main/java/com/chutneytesting/execution/domain/campaign/CampaignExecutionEngine.java index 710b637d7..0aa34bed3 100644 --- a/server/src/main/java/com/chutneytesting/execution/domain/campaign/CampaignExecutionEngine.java +++ b/server/src/main/java/com/chutneytesting/execution/domain/campaign/CampaignExecutionEngine.java @@ -205,10 +205,10 @@ private Consumer executeScenarioInCampaign(Campaign campaign, Campaign // Init scenario execution in campaign report campaignExecutionReport.startScenarioExecution(testCase, campaign.executionEnvironment(), campaignExecutionReport.userId); // Execute scenario - ScenarioExecutionReportCampaign scenarioExecutionReport = executeScenario(campaign, testCase, campaignExecutionReport.userId); + ScenarioExecutionReportCampaign scenarioExecutionReport = executeScenario(campaign, testCase, campaignExecutionReport); // Retry one time if failed if (campaign.retryAuto && ServerReportStatus.FAILURE.equals(scenarioExecutionReport.status())) { - scenarioExecutionReport = executeScenario(campaign, testCase, campaignExecutionReport.userId); + scenarioExecutionReport = executeScenario(campaign, testCase, campaignExecutionReport); } // Add scenario report to campaign's one ofNullable(scenarioExecutionReport) @@ -222,12 +222,12 @@ private Consumer executeScenarioInCampaign(Campaign campaign, Campaign }; } - private ScenarioExecutionReportCampaign executeScenario(Campaign campaign, TestCase testCase, String userId) { + private ScenarioExecutionReportCampaign executeScenario(Campaign campaign, TestCase testCase, CampaignExecutionReport campaignExecutionReport) { Long executionId; String scenarioName; try { LOGGER.trace("Execute scenario {} for campaign {}", testCase.id(), campaign.id); - ExecutionRequest executionRequest = buildExecutionRequest(campaign, testCase, userId); + ExecutionRequest executionRequest = buildExecutionRequest(campaign, testCase, campaignExecutionReport); ScenarioExecutionReport scenarioExecutionReport = scenarioExecutionEngine.execute(executionRequest); executionId = scenarioExecutionReport.executionId; scenarioName = scenarioExecutionReport.scenarioName; @@ -245,12 +245,12 @@ private ScenarioExecutionReportCampaign executeScenario(Campaign campaign, TestC return new ScenarioExecutionReportCampaign(testCase.id(), scenarioName, execution.summary()); } - private ExecutionRequest buildExecutionRequest(Campaign campaign, TestCase testCase, String userId) { + private ExecutionRequest buildExecutionRequest(Campaign campaign, TestCase testCase, CampaignExecutionReport campaignExecutionReport) { // Only composable test cases can use an external dataset, which can be override if set on the campaign if (isNotBlank(campaign.externalDatasetId) && testCase.id().contains("-")) { // TODO remove after component deprecation - return executionWithDatasetIdOverrideByCampaign(campaign, testCase, userId); + return executionWithDatasetIdOverrideByCampaign(campaign, testCase, campaignExecutionReport.userId); } else { - return executionWithCombinedParametersFromCampaignAndTestCase(campaign, testCase, userId); + return executionWithCombinedParametersFromCampaignAndTestCase(campaign, testCase, campaignExecutionReport); } } @@ -263,13 +263,13 @@ private ExecutionRequest executionWithDatasetIdOverrideByCampaign(Campaign campa ); } - private ExecutionRequest executionWithCombinedParametersFromCampaignAndTestCase(Campaign campaign, TestCase testCase, String userId) { + private ExecutionRequest executionWithCombinedParametersFromCampaignAndTestCase(Campaign campaign, TestCase testCase, CampaignExecutionReport campaignExecutionReport) { Map executionParameters = new HashMap<>(testCase.executionParameters()); executionParameters.putAll(campaign.executionParameters); DataSet dataset = ofNullable(campaign.externalDatasetId) .map(datasetRepository::findById) .orElseGet(() -> datasetRepository.findById(testCase.metadata().defaultDataset())); - return new ExecutionRequest(testCase.usingExecutionParameters(executionParameters), campaign.executionEnvironment(), userId, dataset); + return new ExecutionRequest(testCase.usingExecutionParameters(executionParameters), campaign.executionEnvironment(), campaignExecutionReport.userId, dataset, campaignExecutionReport); } private CampaignExecutionReport executeCampaign(Campaign campaign, String userId) { diff --git a/server/src/main/java/com/chutneytesting/execution/infra/storage/DatabaseExecutionHistoryRepository.java b/server/src/main/java/com/chutneytesting/execution/infra/storage/DatabaseExecutionHistoryRepository.java index 250e7d666..476653b99 100644 --- a/server/src/main/java/com/chutneytesting/execution/infra/storage/DatabaseExecutionHistoryRepository.java +++ b/server/src/main/java/com/chutneytesting/execution/infra/storage/DatabaseExecutionHistoryRepository.java @@ -4,7 +4,9 @@ import static java.util.Collections.emptyList; import static java.util.Optional.ofNullable; +import com.chutneytesting.campaign.infra.CampaignExecutionJpaRepository; import com.chutneytesting.campaign.infra.CampaignJpaRepository; +import com.chutneytesting.campaign.infra.jpa.CampaignExecution; import com.chutneytesting.execution.infra.storage.jpa.ScenarioExecution; import com.chutneytesting.execution.infra.storage.jpa.ScenarioExecutionReport; import com.chutneytesting.scenario.infra.raw.ScenarioJpaRepository; @@ -19,6 +21,7 @@ import com.chutneytesting.server.core.domain.scenario.campaign.CampaignExecutionReport; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; import java.util.stream.StreamSupport; import org.springframework.stereotype.Component; @@ -31,17 +34,20 @@ class DatabaseExecutionHistoryRepository implements ExecutionHistoryRepository { private final DatabaseExecutionJpaRepository scenarioExecutionsJpaRepository; private final ScenarioExecutionReportJpaRepository scenarioExecutionReportJpaRepository; private final CampaignJpaRepository campaignJpaRepository; + private final CampaignExecutionJpaRepository campaignExecutionJpaRepository; private final TestCaseRepository testCaseRepository; DatabaseExecutionHistoryRepository( DatabaseExecutionJpaRepository scenarioExecutionsJpaRepository, ScenarioExecutionReportJpaRepository scenarioExecutionReportJpaRepository, ScenarioJpaRepository scenarioJpaRepository, - CampaignJpaRepository campaignJpaRepository, TestCaseRepository testCaseRepository) { + CampaignJpaRepository campaignJpaRepository, TestCaseRepository testCaseRepository, + CampaignExecutionJpaRepository campaignExecutionJpaRepository) { this.scenarioExecutionsJpaRepository = scenarioExecutionsJpaRepository; this.scenarioExecutionReportJpaRepository = scenarioExecutionReportJpaRepository; this.campaignJpaRepository = campaignJpaRepository; this.testCaseRepository = testCaseRepository; + this.campaignExecutionJpaRepository = campaignExecutionJpaRepository; } @Override @@ -87,10 +93,14 @@ private ExecutionSummary scenarioExecutionToExecutionSummary(ScenarioExecution s @Override public Execution store(String scenarioId, DetachedExecution detachedExecution) throws IllegalStateException { - if(invalidScenarioId(scenarioId)) { + if (invalidScenarioId(scenarioId)) { throw new IllegalStateException("Scenario id is null or empty"); } ScenarioExecution scenarioExecution = ScenarioExecution.fromDomain(scenarioId, detachedExecution); + if (detachedExecution.campaignReport().isPresent()) { + Optional campaignExecution = campaignExecutionJpaRepository.findById(detachedExecution.campaignReport().get().executionId.longValue()); + scenarioExecution.forCampaignExecution(campaignExecution.get()); + } scenarioExecution = scenarioExecutionsJpaRepository.save(scenarioExecution); scenarioExecutionReportJpaRepository.save(new ScenarioExecutionReport(scenarioExecution, detachedExecution.report())); Execution execution = detachedExecution.attach(scenarioExecution.id());