Skip to content

Commit 365e5d1

Browse files
authored
feat(ui) : Use the id instead of the name for scenario dataset in cam… (#117)
1 parent d875d87 commit 365e5d1

File tree

7 files changed

+72
-10
lines changed

7 files changed

+72
-10
lines changed

chutney/server-core/src/main/java/com/chutneytesting/server/core/domain/dataset/DataSetNotFoundException.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,8 @@ public class DataSetNotFoundException extends RuntimeException {
2020
public DataSetNotFoundException(String id) {
2121
super("Dataset [" + id + "] could not be found");
2222
}
23+
24+
public DataSetNotFoundException(String id, Throwable throwable) {
25+
super("Dataset [" + id + "] could not be found", throwable);
26+
}
2327
}

chutney/server/src/main/java/com/chutneytesting/RestExceptionHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ public ResponseEntity<Object> _500(RuntimeException ex, WebRequest request) {
9797
ReportNotFoundException.class,
9898
ScenarioNotFoundException.class,
9999
ScenarioNotRunningException.class,
100-
TargetNotFoundException.class
100+
TargetNotFoundException.class,
101+
DataSetNotFoundException.class
101102
})
102103
protected ResponseEntity<Object> notFound(RuntimeException ex, WebRequest request) {
103104
return handleExceptionInternalWithExceptionMessageAsBody(ex, HttpStatus.NOT_FOUND, request);

chutney/server/src/main/java/com/chutneytesting/campaign/api/CampaignController.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.chutneytesting.campaign.domain.CampaignExecutionRepository;
3030
import com.chutneytesting.campaign.domain.CampaignRepository;
3131
import com.chutneytesting.campaign.domain.CampaignService;
32+
import com.chutneytesting.dataset.domain.DatasetService;
3233
import com.chutneytesting.scenario.api.raw.dto.TestCaseIndexDto;
3334
import com.chutneytesting.scenario.infra.TestCaseRepositoryAggregator;
3435
import com.chutneytesting.server.core.domain.execution.history.ExecutionHistory;
@@ -39,6 +40,7 @@
3940
import java.util.Comparator;
4041
import java.util.List;
4142
import java.util.stream.Collectors;
43+
import java.util.stream.Stream;
4244
import org.apache.commons.lang3.StringUtils;
4345
import org.springframework.http.MediaType;
4446
import org.springframework.security.access.prepost.PreAuthorize;
@@ -61,19 +63,20 @@ public class CampaignController {
6163

6264
private final TestCaseRepositoryAggregator repositoryAggregator;
6365
private final CampaignRepository campaignRepository;
64-
66+
private final DatasetService datasetService;
6567
private final CampaignExecutionRepository campaignExecutionRepository;
6668
private final ExecutionHistoryRepository executionHistoryRepository;
6769
private final CampaignService campaignService;
6870

6971
public CampaignController(TestCaseRepositoryAggregator repositoryAggregator,
7072
CampaignRepository campaignRepository,
71-
CampaignExecutionRepository campaignExecutionRepository,
73+
DatasetService datasetService, CampaignExecutionRepository campaignExecutionRepository,
7274
ExecutionHistoryRepository executionHistoryRepository,
7375
CampaignService campaignService) {
7476

7577
this.repositoryAggregator = repositoryAggregator;
7678
this.campaignRepository = campaignRepository;
79+
this.datasetService = datasetService;
7780
this.campaignExecutionRepository = campaignExecutionRepository;
7881
this.executionHistoryRepository = executionHistoryRepository;
7982
this.campaignService = campaignService;
@@ -83,13 +86,15 @@ public CampaignController(TestCaseRepositoryAggregator repositoryAggregator,
8386
@PostMapping(path = "", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
8487
public CampaignDto saveCampaign(@RequestBody CampaignDto campaign) {
8588
hasEnvironment(campaign);
89+
validateDataset(campaign);
8690
return toDtoWithoutReport(campaignRepository.createOrUpdate(fromDto(campaign)));
8791
}
8892

8993
@PreAuthorize("hasAuthority('CAMPAIGN_WRITE')")
9094
@PutMapping(path = "", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
9195
public CampaignDto updateCampaign(@RequestBody CampaignDto campaign) {
9296
hasEnvironment(campaign);
97+
validateDataset(campaign);
9398
return toDtoWithoutReport(campaignRepository.createOrUpdate(fromDto(campaign)));
9499
}
95100

@@ -160,4 +165,14 @@ private void hasEnvironment(CampaignDto campaign) {
160165
throw new IllegalArgumentException("Environment is missing for campaign with name " + campaign.getTitle());
161166
}
162167
}
168+
169+
private void validateDataset(CampaignDto campaign) {
170+
Stream.concat(
171+
Stream.of(campaign.getDatasetId()),
172+
campaign.getScenarios().stream().map(CampaignDto.CampaignScenarioDto::datasetId)
173+
)
174+
.filter(StringUtils::isNotBlank)
175+
.distinct()
176+
.forEach(datasetService::findById);
177+
}
163178
}

chutney/server/src/main/java/com/chutneytesting/dataset/infra/FileDatasetRepository.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.chutneytesting.dataset.domain.DataSetRepository;
2626
import com.chutneytesting.server.core.domain.dataset.DataSet;
2727
import com.chutneytesting.server.core.domain.dataset.DataSetAlreadyExistException;
28+
import com.chutneytesting.server.core.domain.dataset.DataSetNotFoundException;
2829
import com.chutneytesting.tools.file.FileUtils;
2930
import com.fasterxml.jackson.databind.ObjectMapper;
3031
import com.fasterxml.jackson.databind.SerializationFeature;
@@ -83,7 +84,7 @@ private boolean alreadyExists(DataSet dataSet) {
8384
try {
8485
DataSet byId = findById(dataSet.name);
8586
return !byId.equals(DataSet.NO_DATASET);
86-
} catch (UncheckedIOException e) {
87+
} catch (DataSetNotFoundException e) {
8788
return false;
8889
}
8990
}
@@ -95,12 +96,12 @@ public DataSet findById(String fileName) {
9596
}
9697

9798
Path file = this.storeFolderPath.resolve(fileName + FILE_EXTENSION);
98-
String content = FileUtils.readContent(file);
9999
try {
100+
String content = FileUtils.readContent(file);
100101
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
101102
return fromDto(objectMapper.readValue(content, DatasetDto.class), attr.creationTime().toInstant());
102-
} catch (IOException e) {
103-
throw new UncheckedIOException("Cannot read " + file.toUri(), e);
103+
} catch (IOException | UncheckedIOException e) {
104+
throw new DataSetNotFoundException("Cannot read " + file.toUri(), e);
104105
}
105106
}
106107

chutney/server/src/test/java/com/chutneytesting/campaign/api/CampaignControllerTest.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
import com.chutneytesting.campaign.api.dto.ScenarioExecutionReportOutlineDto;
3636
import com.chutneytesting.campaign.domain.CampaignService;
3737
import com.chutneytesting.campaign.infra.FakeCampaignRepository;
38+
import com.chutneytesting.dataset.domain.DatasetService;
3839
import com.chutneytesting.scenario.api.raw.dto.ImmutableTestCaseIndexDto;
3940
import com.chutneytesting.scenario.api.raw.dto.TestCaseIndexDto;
4041
import com.chutneytesting.scenario.infra.TestCaseRepositoryAggregator;
42+
import com.chutneytesting.server.core.domain.dataset.DataSetNotFoundException;
4143
import com.chutneytesting.server.core.domain.execution.history.ExecutionHistory;
4244
import com.chutneytesting.server.core.domain.execution.history.ExecutionHistoryRepository;
4345
import com.chutneytesting.server.core.domain.execution.report.ServerReportStatus;
@@ -78,6 +80,7 @@ public class CampaignControllerTest {
7880
private TestCaseRepositoryAggregator repositoryAggregator;
7981

8082
private final ExecutionHistoryRepository executionHistoryRepository = mock(ExecutionHistoryRepository.class);
83+
private final DatasetService datasetService = mock(DatasetService.class);
8184
private MockMvc mockMvc;
8285
private ResultExtractor resultExtractor;
8386
private CampaignDto existingCampaign;
@@ -88,7 +91,7 @@ public void setUp() throws Exception {
8891
resultExtractor = new ResultExtractor();
8992

9093
repositoryAggregator = mock(TestCaseRepositoryAggregator.class);
91-
CampaignController campaignController = new CampaignController(repositoryAggregator, repository, repository, executionHistoryRepository, new CampaignService(repository));
94+
CampaignController campaignController = new CampaignController(repositoryAggregator, repository, datasetService, repository, executionHistoryRepository, new CampaignService(repository));
9295
mockMvc = MockMvcBuilders.standaloneSetup(campaignController)
9396
.setControllerAdvice(new RestExceptionHandler(Mockito.mock(ChutneyMetrics.class)))
9497
.build();
@@ -380,6 +383,36 @@ public void should_retrieve_scenarios_of_a_campaign() throws Exception {
380383
);
381384
}
382385

386+
@Test
387+
public void should_throw_exception_if_campaign_dataset_is_not_found() throws Exception {
388+
// When
389+
CampaignDto campaignDto = new CampaignDto(null, "test", "desc",
390+
List.of(new CampaignScenarioDto("1")), emptyList(), "env", false, false, "UNKNOWN_DATASET", emptyList());
391+
392+
when(datasetService.findById("UNKNOWN_DATASET")).thenThrow(new DataSetNotFoundException("UNKNOWN_DATASET"));
393+
394+
// Then
395+
execute(post(BASE_URL)
396+
.content(om.writeValueAsString(campaignDto))
397+
.contentType(APPLICATION_JSON_VALUE))
398+
.andExpect(MockMvcResultMatchers.status().isNotFound());
399+
}
400+
401+
@Test
402+
public void should_throw_exception_if_scenario_dataset_is_not_found() throws Exception {
403+
// When
404+
CampaignDto campaignDto = new CampaignDto(null, "test", "desc",
405+
List.of(new CampaignScenarioDto("1", "UNKNOWN_DATASET")), emptyList(), "env", false, false, null, emptyList());;
406+
407+
when(datasetService.findById("UNKNOWN_DATASET")).thenThrow(new DataSetNotFoundException("UNKNOWN_DATASET"));
408+
409+
// Then
410+
execute(post(BASE_URL)
411+
.content(om.writeValueAsString(campaignDto))
412+
.contentType(APPLICATION_JSON_VALUE))
413+
.andExpect(MockMvcResultMatchers.status().isNotFound());
414+
}
415+
383416
private void createExistingCampaign() throws Exception {
384417
existingCampaign = insertCampaign(SAMPLE_CAMPAIGN);
385418
}

chutney/server/src/test/java/com/chutneytesting/dataset/infra/FileDatasetRepositoryTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.chutneytesting.dataset.domain.DataSetRepository;
2323
import com.chutneytesting.server.core.domain.dataset.DataSet;
2424
import com.chutneytesting.server.core.domain.dataset.DataSetAlreadyExistException;
25+
import com.chutneytesting.server.core.domain.dataset.DataSetNotFoundException;
2526
import com.chutneytesting.tools.file.FileUtils;
2627
import java.io.File;
2728
import java.io.IOException;
@@ -55,6 +56,13 @@ void should_create_and_update_dataset() {
5556
assertThat(toValid.description).isEqualTo("new description");
5657
}
5758

59+
@Test
60+
void should_throw_exception_when_dataset_not_found() {
61+
String datasetId = "UNKNOWED_DATASET";
62+
assertThatThrownBy(() -> sut.findById(datasetId))
63+
.isInstanceOf(DataSetNotFoundException.class);
64+
}
65+
5866
@Test
5967
void should_not_save_new_dataset_already_exist() {
6068
DataSet dataset = DataSet.builder().withName("name").build();

chutney/ui/src/app/modules/campaign/components/create-campaign/campaign-edition.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ export class CampaignEditionComponent implements OnInit, OnDestroy {
108108
this.loadAllScenarios();
109109
this.datasetService.findAll().subscribe((res: Array<Dataset>) => {
110110
this.datasets = res.map(dataset => {
111-
return {"id": dataset.name, "text": dataset.name}
111+
return {"id": dataset.id, "text": dataset.name}
112112
});
113113
});
114114
this.dropdownDatasetSettings = {...this.dropdownSettings, singleSelection: true}
@@ -410,7 +410,7 @@ export class CampaignEditionComponent implements OnInit, OnDestroy {
410410
try {
411411
error.json();
412412
} catch (exception) {
413-
error.message = error.text();
413+
error.message = error.error;
414414
}
415415
this.submitted = false;
416416
this.errorMessage = error.message;

0 commit comments

Comments
 (0)