Skip to content

Commit

Permalink
feat(ui, server): add button with modal that allow the user to … (#141)
Browse files Browse the repository at this point in the history
---------

Co-authored-by: nbrouand <[email protected]>
  • Loading branch information
DelaunayAlex and nbrouand authored Aug 23, 2024
1 parent 73fe367 commit 7172cc2
Show file tree
Hide file tree
Showing 22 changed files with 237 additions and 219 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@ public class Campaign {
public final List<CampaignScenario> scenarios;
public final boolean parallelRun;
public final boolean retryAuto;
public final String externalDatasetId;
public final List<String> tags;

private String environment;
private String externalDatasetId;

public Campaign(Long id,
String title,
Expand All @@ -47,10 +47,18 @@ public void executionEnvironment(String environment) {
this.environment = environment;
}

public void executionDataset(String dataset) {
this.externalDatasetId = dataset;
}

public String executionEnvironment() {
return this.environment;
}

public String executionDataset() {
return this.externalDatasetId;
}

@Override
public boolean equals(Object o) {
if (this == o) return true;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public CampaignBuilder from(Campaign campaign) {
this.environment = campaign.executionEnvironment();
this.parallelRun = campaign.parallelRun;
this.retryAuto = campaign.retryAuto;
this.externalDatasetId = campaign.externalDatasetId;
this.externalDatasetId = campaign.executionDataset() ;
this.tags = campaign.tags;

return this;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public static CampaignDto toDtoWithoutReport(Campaign campaign) {
campaign.executionEnvironment(),
campaign.parallelRun,
campaign.retryAuto,
campaign.externalDatasetId,
campaign.executionDataset(),
campaign.tags);
}

Expand All @@ -42,7 +42,7 @@ public static CampaignDto toDto(Campaign campaign, List<CampaignExecution> campa
campaign.executionEnvironment(),
campaign.parallelRun,
campaign.retryAuto,
campaign.externalDatasetId,
campaign.executionDataset(),
campaign.tags);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public void renameEnvironment(String oldName, String newName) {
newName,
existingCampaign.parallelRun,
existingCampaign.retryAuto,
existingCampaign.externalDatasetId,
existingCampaign.executionDataset(),
existingCampaign.tags
);
campaignRepository.createOrUpdate(campaign);
Expand All @@ -49,7 +49,7 @@ public void deleteEnvironment(String environmentName) {
null,
existingCampaign.parallelRun,
existingCampaign.retryAuto,
existingCampaign.externalDatasetId,
existingCampaign.executionDataset(),
existingCampaign.tags
);
campaignRepository.createOrUpdate(campaign);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public static CampaignEntity fromDomain(Campaign campaign, Integer version) {
campaign.executionEnvironment(),
campaign.parallelRun,
campaign.retryAuto,
campaign.externalDatasetId,
campaign.executionDataset(),
campaign.tags,
version,
CampaignScenarioEntity.fromDomain(campaign)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ private void updateScenarios(String oldId, String newId) {

private void updateCampaigns(String oldId, String newId) {
campaignRepository.findAll().stream()
.filter(c -> oldId.equals(c.externalDatasetId))
.filter(c -> oldId.equals(c.executionDataset()))
.forEach(c -> campaignRepository.createOrUpdate(
CampaignBuilder.builder()
.from(c)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

Expand Down Expand Up @@ -69,13 +70,8 @@ public CampaignExecutionReportSummaryDto getLastCampaignExecution(@PathVariable(
@PreAuthorize("hasAuthority('CAMPAIGN_EXECUTE')")
@GetMapping(path = {"/{campaignName}", "/{campaignName}/{env}"}, produces = MediaType.APPLICATION_JSON_VALUE)
public List<CampaignExecutionReportDto> executeCampaignByName(@PathVariable("campaignName") String campaignName, @PathVariable("env") Optional<String> environment) {
List<CampaignExecution> reports;
String userId = userService.currentUser().getId();
if (environment.isPresent()) {
reports = campaignExecutionEngine.executeByName(campaignName, environment.get(), userId);
} else {
reports = campaignExecutionEngine.executeByName(campaignName, userId);
}
List<CampaignExecution> reports = campaignExecutionEngine.executeByName(campaignName, environment.orElse(null), userId);
return reports.stream()
.map(CampaignExecutionReportMapper::toDto)
.collect(Collectors.toList());
Expand All @@ -94,12 +90,7 @@ public CampaignExecutionReportDto replayFailedScenario(@PathVariable("campaignEx
public byte[] executeCampaignsByPatternWithSurefireReport(HttpServletResponse response, @PathVariable("campaignPattern") String campaignPattern, @PathVariable("env") Optional<String> environment) {
String userId = userService.currentUser().getId();
response.addHeader("Content-Disposition", "attachment; filename=\"surefire-report.zip\"");
List<CampaignExecution> reports;
if (environment.isPresent()) {
reports = campaignExecutionEngine.executeByName(campaignPattern, environment.get(), userId);
} else {
reports = campaignExecutionEngine.executeByName(campaignPattern, userId);
}
List<CampaignExecution> reports = campaignExecutionEngine.executeByName(campaignPattern, environment.orElse(null), userId);
return surefireCampaignExecutionReportBuilder.createReport(reports);
}

Expand All @@ -113,14 +104,10 @@ public void stopExecution(@PathVariable("executionId") Long executionId) {

@PreAuthorize("hasAuthority('CAMPAIGN_EXECUTE')")
@GetMapping(path = {"/byID/{campaignId}", "/byID/{campaignId}/{env}"}, produces = MediaType.APPLICATION_JSON_VALUE)
public CampaignExecutionReportDto executeCampaignById(@PathVariable("campaignId") Long campaignId, @PathVariable("env") Optional<String> environment) {
public CampaignExecutionReportDto executeCampaignById(@PathVariable("campaignId") Long campaignId, @PathVariable("env") Optional<String> environment, @RequestParam("dataset") Optional<String> dataset) {
String userId = userService.currentUser().getId();
CampaignExecution report;
if (environment.isPresent()) {
report = campaignExecutionEngine.executeById(campaignId, environment.get(), userId);
} else {
report = campaignExecutionEngine.executeById(campaignId, userId);
}
report = campaignExecutionEngine.executeById(campaignId, environment.orElse(null), dataset.orElse(null), userId);
return toDto(report);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -98,37 +98,38 @@ public CampaignExecution getLastCampaignExecution(Long campaignId) {
return campaignExecutionRepository.getLastExecution(campaign.id);
}

public List<CampaignExecution> executeByName(String campaignName, String userId) {
return executeByName(campaignName, null, userId);
}

public List<CampaignExecution> executeByName(String campaignName, String environment, String userId) {
public List<CampaignExecution> executeByName(String campaignName, String environment, String dataset, String userId) {
List<Campaign> campaigns = campaignRepository.findByName(campaignName);
return campaigns.stream()
.map(campaign -> selectExecutionEnvironment(campaign, environment))
.map(campaign -> selectExecutionDataset(campaign, dataset))
.map(campaign -> executeScenarioInCampaign(campaign, userId))
.collect(Collectors.toList());
}

public CampaignExecution executeById(Long campaignId, String userId) {
return executeById(campaignId, null, userId);
public List<CampaignExecution> executeByName(String campaignName, String environment, String userId) {
return executeByName(campaignName, environment, null, userId);
}

public CampaignExecution executeById(Long campaignId, String environment, String userId) {
public CampaignExecution executeById(Long campaignId, String environment, String dataset, String userId) {
return ofNullable(campaignRepository.findById(campaignId))
.map(campaign -> selectExecutionEnvironment(campaign, environment))
.map(campaign -> selectExecutionDataset(campaign, dataset))
.map(campaign -> executeScenarioInCampaign(campaign, userId))
.orElseThrow(() -> new CampaignNotFoundException(campaignId));
}

public CampaignExecution executeById(Long campaignId, String userId) {
return executeById(campaignId, null, null, userId);
}

public Optional<CampaignExecution> currentExecution(Long campaignId, String environment) {
return campaignExecutionRepository.currentExecutions(campaignId)
.stream()
.filter(exec -> exec.executionEnvironment.equals(environment))
.findAny();
}


public void stopExecution(Long executionId) {
LOGGER.trace("Stop requested for {}", executionId);
ofNullable(currentCampaignExecutionsStopRequests.computeIfPresent(executionId, (aLong, aBoolean) -> Boolean.TRUE))
Expand All @@ -143,6 +144,7 @@ public CampaignExecution replayFailedScenariosExecutionsForExecution(Long campai
}
Campaign campaign = campaignRepository.findById(campaignExecution.campaignId);
campaign.executionEnvironment(campaignExecution.executionEnvironment);
campaign.executionDataset(campaignExecution.dataSetId);
return executeScenarioInCampaign(failedExecutions, campaign, userId);
}

Expand All @@ -161,7 +163,7 @@ CampaignExecution executeScenarioInCampaign(List<ScenarioExecutionCampaign> fail
.campaignName(campaign.title)
.partialExecution(!failedExecutions.isEmpty())
.environment(campaign.executionEnvironment())
.dataSetId(isNotBlank(campaign.externalDatasetId) ? campaign.externalDatasetId : null)
.dataSetId(isNotBlank(campaign.executionDataset()) ? campaign.executionDataset() : null)
.userId(userId)
.build();

Expand Down Expand Up @@ -299,7 +301,7 @@ private ScenarioExecutionCampaign executeScenario(Campaign campaign, TestCaseDat
private ExecutionRequest buildExecutionRequest(Campaign campaign, TestCaseDataset testCaseDataset, CampaignExecution campaignExecution) {
// TODO if dataset null should throw exception ?
DataSet dataset = ofNullable(testCaseDataset.datasetId())
.or(() -> ofNullable(campaign.externalDatasetId))
.or(() -> ofNullable(campaign.executionDataset()))
.map(datasetRepository::findById)
.orElse(null);
return new ExecutionRequest(testCaseDataset.testcase(), campaign.executionEnvironment(), campaignExecution.userId, dataset, campaignExecution, campaign.tags);
Expand All @@ -322,4 +324,9 @@ private Campaign selectExecutionEnvironment(Campaign campaign, String environmen
ofNullable(environment).ifPresent(campaign::executionEnvironment);
return campaign;
}

private Campaign selectExecutionDataset(Campaign campaign, String dataset) {
ofNullable(dataset).ifPresent(campaign::executionDataset);
return campaign;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -310,26 +310,6 @@ public void should_execute_campaign_in_parallel_on_two_different_envs() {
assertDoesNotThrow(() -> sut.executeScenarioInCampaign(campaign, "user"));
}

@Test
public void should_generate_campaign_execution_id_when_executed() {
// Given
Campaign campaign = createCampaign(firstTestCase, secondTestCase);

when(campaignRepository.findByName(campaign.title)).thenReturn(singletonList(campaign));
when(campaignRepository.findById(campaign.id)).thenReturn(campaign);

// When
sut.executeById(campaign.id, "");
sut.executeByName(campaign.title, "");

// Then
verify(campaignRepository).findById(campaign.id);
verify(campaignRepository).findByName(campaign.title);

verify(campaignExecutionRepository, times(2)).generateCampaignExecutionId(campaign.id, campaign.executionEnvironment());
}


@Test
public void should_return_last_existing_campaign_execution_for_existing_campaign() {
// Given
Expand Down Expand Up @@ -368,22 +348,6 @@ public void should_throw_exception_when_campaign_does_not_exists() {
verify(campaignRepository).findById(campaign.id);
}

@Test
public void should_execute_campaign_with_given_environment_when_executed_by_id() {
// Given
Campaign campaign = createCampaign(firstTestCase, secondTestCase);
when(campaignRepository.findById(campaign.id)).thenReturn(campaign);

// When
String executionEnv = "executionEnv";
String executionUser = "executionUser";
sut.executeById(campaign.id, executionEnv, executionUser);

// Then
verify(campaignRepository).findById(campaign.id);
assertThat(campaign.executionEnvironment()).isEqualTo(executionEnv);
}

@Test
public void should_execute_campaign_with_given_environment_when_executed_by_name() {
// Given
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static java.util.Collections.singletonList;
import static java.util.stream.Collectors.toList;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
Expand Down Expand Up @@ -170,8 +171,8 @@ void should_execute_sequentially_when_executing_periodic_scheduled_campaigns() {

sut.executeScheduledCampaigns();

inOrder.verify(campaignExecutionEngine).executeById(periodicScheduledCampaign.get(0).campaignsId.get(0), "auto");
inOrder.verify(campaignExecutionEngine).executeById(periodicScheduledCampaign.get(0).campaignsId.get(1), "auto");
inOrder.verify(campaignExecutionEngine).executeById(eq(periodicScheduledCampaign.get(0).campaignsId.get(0)), eq("auto"));
inOrder.verify(campaignExecutionEngine).executeById(eq(periodicScheduledCampaign.get(0).campaignsId.get(1)), eq("auto"));
verify(campaignExecutionEngine, times(2)).executeById(any(), any());
}

Expand Down
6 changes: 3 additions & 3 deletions chutney/ui/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 21 additions & 20 deletions chutney/ui/src/app/core/services/campaign.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,17 @@ export class CampaignService {

findAllScenarios(id: number): Observable<Array<ScenarioIndex>> {
return this.http.get<Array<ScenarioIndex>>(environment.backend + this.resourceUrl + `/${id}/scenarios`)
.pipe(map((res: Array<any>) => {
return res.map(s => new ScenarioIndex(
s.metadata.id,
s.metadata.title,
s.metadata.description,
s.metadata.repositorySource,
s.metadata.creationDate,
s.metadata.tags,
s.metadata.executions
));
}));
.pipe(map((res: Array<any>) => {
return res.map(s => new ScenarioIndex(
s.metadata.id,
s.metadata.title,
s.metadata.description,
s.metadata.repositorySource,
s.metadata.creationDate,
s.metadata.tags,
s.metadata.executions
));
}));
}

findAllCampaignsForScenario(id: number): Observable<Array<Campaign>> {
Expand All @@ -66,12 +66,12 @@ export class CampaignService {

findExecution(id: number): Observable<CampaignExecutionFullReport> {
return this.http.get<CampaignExecutionFullReport>(`${environment.backend}${this.resourceUrl}/execution/${id}`)
.pipe(
map(campaignExecutionFullReport => ({
...campaignExecutionFullReport,
scenarioExecutionReports: Execution.deserializeExecutions(campaignExecutionFullReport.scenarioExecutionReports)
}))
);
.pipe(
map(campaignExecutionFullReport => ({
...campaignExecutionFullReport,
scenarioExecutionReports: Execution.deserializeExecutions(campaignExecutionFullReport.scenarioExecutionReports)
}))
);
}

create(campaign: Campaign): Observable<Campaign> {
Expand All @@ -88,14 +88,15 @@ export class CampaignService {
return this.http.put<Campaign>(environment.backend + this.resourceUrl, copy);
}

executeCampaign(campaignId: number, env: string): Observable<CampaignExecutionReport> {
return this.http.get<CampaignExecutionReport>(environment.backend + `${this.ressourceUrlExecution}/byID/${campaignId}/${env}`);
executeCampaign(campaignId: number, env: string, dataset?: string): Observable<CampaignExecutionReport> {
const params = dataset ? { params: { dataset: dataset } } : {};
return this.http.get<CampaignExecutionReport>(`${environment.backend}${this.ressourceUrlExecution}/byID/${campaignId}/${env}`, params);
}

stopExecution(campaignId: number, executionId: number): Observable<void> {
return this.http.post(environment.backend +
`${this.ressourceUrlExecution}/${executionId}/stop`, {}).pipe(map((res: Response) => {
}));
}));
}

replayFailedScenario(executionId: number): Observable<Object> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
-->

@if (campaign) {
<chutney-campaign-execution-menu [campaign]="campaign"></chutney-campaign-execution-menu>
<chutney-campaign-execution-menu [campaign]="campaign" [canReplay]="canReplay"></chutney-campaign-execution-menu>
@if (errors.length > 0) {
<div class="alert alert-dismissible alert-danger mt-4">
<button type="button" class="btn-close" data-bs-dismiss="alert" (click)="errors = []"></button>
Expand Down
Loading

0 comments on commit 7172cc2

Please sign in to comment.