Skip to content

Commit 22c947c

Browse files
Add tests
1 parent bf4256c commit 22c947c

File tree

5 files changed

+498
-12
lines changed

5 files changed

+498
-12
lines changed

src/main/java/org/gridsuite/shortcircuit/server/ParametersController.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import static org.springframework.http.MediaType.TEXT_PLAIN_VALUE;
1717

1818
@RestController
19-
@RequestMapping(value = "/" + ShortCircuitApi.API_VERSION + "/parameters", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
19+
@RequestMapping(path = "/" + ShortCircuitApi.API_VERSION + "/parameters")
2020
@Tag(name = "Short circuit server analysis parameters")
2121
public class ParametersController {
2222
private final ShortCircuitService shortCircuitService;
@@ -25,35 +25,42 @@ public ParametersController(ShortCircuitService shortCircuitService) {
2525
this.shortCircuitService = shortCircuitService;
2626
}
2727

28-
@GetMapping(value = "/{parametersUuid}")
28+
@GetMapping(path = "/{parametersUuid}", produces = APPLICATION_JSON_VALUE)
2929
@Operation(summary = "Get the parameters for an analysis")
3030
@ApiResponse(responseCode = "200", description = "The parameters asked")
31+
@ApiResponse(responseCode = "404", description = "The parameters don't exists")
3132
public ResponseEntity<ShortCircuitParametersInfos> getParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid) {
3233
return ResponseEntity.of(shortCircuitService.getParameters(parametersUuid));
3334
}
3435

3536
@PostMapping(produces = TEXT_PLAIN_VALUE, consumes = APPLICATION_JSON_VALUE)
3637
@Operation(summary = "Create a new set of parameters for an analysis using default parameters as base")
38+
@ApiResponse(responseCode = "200", description = "The new parameters entity ID")
3739
public ResponseEntity<UUID> createParameters(@Parameter(description = "Modifications on top of the default parameters", schema = @Schema(implementation = ShortCircuitParametersInfos.class))
3840
@RequestBody(required = false) String parametersPatch) {
3941
return ResponseEntity.ok(shortCircuitService.createParameters(parametersPatch));
4042
}
4143

42-
@PostMapping(value = "/parameters", produces = TEXT_PLAIN_VALUE)
44+
@PostMapping(params = { "duplicateFrom" }, produces = TEXT_PLAIN_VALUE)
4345
@Operation(summary = "Duplicate the parameters of an analysis")
46+
@ApiResponse(responseCode = "200", description = "The new parameters ID")
47+
@ApiResponse(responseCode = "404", description = "The parameters don't exist")
4448
public ResponseEntity<UUID> duplicateParameters(@Parameter(description = "UUID of parameters to duplicate") @RequestParam(name = "duplicateFrom") UUID sourceParametersUuid) {
4549
return ResponseEntity.of(shortCircuitService.duplicateParameters(sourceParametersUuid));
4650
}
4751

48-
@DeleteMapping(value = "/parameters/{parametersUuid}")
52+
@DeleteMapping(path = "/{parametersUuid}")
4953
@Operation(summary = "Delete a set of parameters")
54+
@ApiResponse(responseCode = "204", description = "The parameters are successfully deleted")
55+
@ApiResponse(responseCode = "404", description = "The parameters don't exists")
5056
public ResponseEntity<Void> deleteParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid) {
51-
shortCircuitService.deleteParameters(parametersUuid);
52-
return ResponseEntity.ok().build();
57+
return shortCircuitService.deleteParameters(parametersUuid) ? ResponseEntity.noContent().build() : ResponseEntity.notFound().build();
5358
}
5459

55-
@PutMapping(value = "/parameters/{parametersUuid}", consumes = APPLICATION_JSON_VALUE)
60+
@PutMapping(path = "/{parametersUuid}", consumes = APPLICATION_JSON_VALUE)
5661
@Operation(summary = "Update a set of parameters for an analysis or reset them to default ones")
62+
@ApiResponse(responseCode = "204", description = "The parameters are successfully updated")
63+
@ApiResponse(responseCode = "404", description = "The parameters don't exists")
5764
public ResponseEntity<Void> updateParameters(@Parameter(description = "UUID of parameters") @PathVariable("parametersUuid") UUID parametersUuid,
5865
@Parameter(description = "Modifications on top of the parameters referenced by parametersUuid", schema = @Schema(implementation = ShortCircuitParametersInfos.class))
5966
@RequestBody(required = false) String parametersPatch) {

src/main/java/org/gridsuite/shortcircuit/server/ShortCircuitApplication.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99
import com.powsybl.network.store.client.NetworkStoreService;
1010
import org.springframework.boot.SpringApplication;
1111
import org.springframework.boot.autoconfigure.SpringBootApplication;
12-
import org.springframework.context.annotation.ComponentScan;
1312

1413
/**
1514
* @author Etienne Homer <etienne.homer at rte-france.com>
1615
*/
1716
@SuppressWarnings("checkstyle:HideUtilityClassConstructor")
18-
@SpringBootApplication
19-
@ComponentScan(basePackageClasses = {ShortCircuitApplication.class, NetworkStoreService.class})
17+
@SpringBootApplication(scanBasePackageClasses = {ShortCircuitApplication.class, NetworkStoreService.class})
2018
public class ShortCircuitApplication {
2119

2220
public static void main(String[] args) {

src/main/java/org/gridsuite/shortcircuit/server/service/ShortCircuitService.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,8 +417,13 @@ public Optional<ShortCircuitParametersInfos> getParameters(final UUID parameters
417417
return parametersRepository.findById(parametersUuid).map(ShortCircuitService::fromEntity);
418418
}
419419

420-
public void deleteParameters(final UUID parametersUuid) {
421-
parametersRepository.deleteById(parametersUuid);
420+
@Transactional
421+
public boolean deleteParameters(final UUID parametersUuid) {
422+
final boolean result = parametersRepository.existsById(parametersUuid);
423+
if (result) {
424+
parametersRepository.deleteById(parametersUuid);
425+
}
426+
return result;
422427
}
423428

424429
@Transactional
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
package org.gridsuite.shortcircuit.server;
2+
3+
import lombok.NonNull;
4+
import org.assertj.core.api.WithAssertions;
5+
import org.gridsuite.shortcircuit.server.dto.ShortCircuitParametersInfos;
6+
import org.gridsuite.shortcircuit.server.service.ShortCircuitService;
7+
import org.junit.jupiter.api.AfterEach;
8+
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.api.extension.ExtendWith;
10+
import org.junit.jupiter.params.ParameterizedTest;
11+
import org.junit.jupiter.params.provider.Arguments;
12+
import org.junit.jupiter.params.provider.MethodSource;
13+
import org.mockito.ArgumentCaptor;
14+
import org.mockito.Mockito;
15+
import org.mockito.junit.jupiter.MockitoExtension;
16+
import org.springframework.beans.factory.annotation.Autowired;
17+
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
18+
import org.springframework.boot.test.mock.mockito.MockBean;
19+
import org.springframework.http.MediaType;
20+
import org.springframework.test.web.servlet.MockMvc;
21+
import org.springframework.test.web.servlet.ResultMatcher;
22+
23+
import java.nio.charset.StandardCharsets;
24+
import java.util.Optional;
25+
import java.util.UUID;
26+
import java.util.stream.Stream;
27+
28+
import static org.mockito.ArgumentMatchers.any;
29+
import static org.mockito.ArgumentMatchers.anyString;
30+
import static org.mockito.Mockito.verify;
31+
import static org.mockito.Mockito.when;
32+
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
33+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
34+
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
35+
36+
@ExtendWith({ MockitoExtension.class })
37+
@WebMvcTest(controllers = { ParametersController.class })
38+
class ParametersControllerTest implements WithAssertions {
39+
private static final String DEFAULT_PARAMETERS_JSON = "{\"predefinedParameters\":null,\"parameters\":null,\"cei909VoltageRanges\":[{\"range\":{\"comparator\":\"INSTANCE\",\"maximum\":199.99,\"minimum\":10.0,\"naturalOrdering\":true},\"rangeCoefficient\":1.1,\"voltage\":\"NaN\",\"minimumNominalVoltage\":10.0,\"maximumNominalVoltage\":199.99},{\"range\":{\"comparator\":\"INSTANCE\",\"maximum\":299.99,\"minimum\":200.0,\"naturalOrdering\":true},\"rangeCoefficient\":1.09,\"voltage\":\"NaN\",\"minimumNominalVoltage\":200.0,\"maximumNominalVoltage\":299.99},{\"range\":{\"comparator\":\"INSTANCE\",\"maximum\":500.0,\"minimum\":300.0,\"naturalOrdering\":true},\"rangeCoefficient\":1.05,\"voltage\":\"NaN\",\"minimumNominalVoltage\":300.0,\"maximumNominalVoltage\":500.0}]}";
40+
private static final MediaType TEXT_PLAIN_UTF8 = new MediaType("text", "plain", StandardCharsets.UTF_8);
41+
42+
@Autowired
43+
private MockMvc mockMvc;
44+
45+
@MockBean
46+
private ShortCircuitService shortCircuitService;
47+
48+
@AfterEach
49+
void checkMocks() {
50+
Mockito.verifyNoMoreInteractions(shortCircuitService);
51+
}
52+
53+
@Test
54+
void testGetExistingParameters() throws Exception {
55+
final UUID arg = UUID.randomUUID();
56+
final Optional<ShortCircuitParametersInfos> returned = Optional.of(new ShortCircuitParametersInfos(null, null));
57+
when(shortCircuitService.getParameters(any(UUID.class))).thenReturn(returned);
58+
mockMvc.perform(get("/v1/parameters/{pUuid}", arg.toString()))
59+
.andExpectAll(status().isOk(), content().contentType(MediaType.APPLICATION_JSON), content().string(DEFAULT_PARAMETERS_JSON));
60+
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
61+
verify(shortCircuitService).getParameters(uuidCaptor.capture());
62+
assertThat(uuidCaptor.getValue()).isEqualTo(arg);
63+
}
64+
65+
@Test
66+
void testGetNonExistingParameters() throws Exception {
67+
final UUID arg = UUID.randomUUID();
68+
when(shortCircuitService.getParameters(any(UUID.class))).thenReturn(Optional.empty());
69+
mockMvc.perform(get("/v1/parameters/{pUuid}", arg.toString()))
70+
.andExpectAll(status().isNotFound());
71+
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
72+
verify(shortCircuitService).getParameters(uuidCaptor.capture());
73+
assertThat(uuidCaptor.getValue()).isEqualTo(arg);
74+
}
75+
76+
@Test
77+
void testCreateParameters() throws Exception {
78+
final String arg = "{\"dummy\": \"json\"}";
79+
final UUID returned = UUID.randomUUID();
80+
when(shortCircuitService.createParameters(anyString())).thenReturn(returned);
81+
mockMvc.perform(post("/v1/parameters").content(arg).contentType(MediaType.APPLICATION_JSON))
82+
.andExpectAll(status().isOk(), content().contentType(TEXT_PLAIN_UTF8), content().string(returned.toString()));
83+
final ArgumentCaptor<String> strCaptor = ArgumentCaptor.forClass(String.class);
84+
verify(shortCircuitService).createParameters(strCaptor.capture());
85+
assertThat(strCaptor.getValue()).isEqualTo(arg);
86+
}
87+
88+
@Test
89+
void testDuplicateExistingParameters() throws Exception {
90+
final UUID arg = UUID.randomUUID();
91+
final UUID returned = UUID.randomUUID();
92+
when(shortCircuitService.duplicateParameters(any(UUID.class))).thenReturn(Optional.of(returned));
93+
mockMvc.perform(post("/v1/parameters").param("duplicateFrom", arg.toString()))
94+
.andExpectAll(status().isOk(), content().contentType(TEXT_PLAIN_UTF8), content().string(returned.toString()));
95+
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
96+
verify(shortCircuitService).duplicateParameters(uuidCaptor.capture());
97+
assertThat(uuidCaptor.getValue()).isEqualTo(arg);
98+
}
99+
100+
@Test
101+
void testDuplicateNonExistingParameters() throws Exception {
102+
final UUID arg = UUID.randomUUID();
103+
when(shortCircuitService.duplicateParameters(any(UUID.class))).thenReturn(Optional.empty());
104+
mockMvc.perform(post("/v1/parameters").param("duplicateFrom", arg.toString()))
105+
.andExpectAll(status().isNotFound());
106+
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
107+
verify(shortCircuitService).duplicateParameters(uuidCaptor.capture());
108+
assertThat(uuidCaptor.getValue()).isEqualTo(arg);
109+
}
110+
111+
static Stream<Arguments> testExistingParametersArgs() {
112+
return Stream.of(
113+
Arguments.arguments(true, status().isNoContent()),
114+
Arguments.arguments(false, status().isNotFound())
115+
);
116+
}
117+
118+
@MethodSource("testExistingParametersArgs")
119+
@ParameterizedTest
120+
void testDeleteParameters(final boolean existing, @NonNull final ResultMatcher statusMatcher) throws Exception {
121+
final UUID arg = UUID.randomUUID();
122+
when(shortCircuitService.deleteParameters(any(UUID.class))).thenReturn(existing);
123+
mockMvc.perform(delete("/v1/parameters/{pUuid}", arg.toString()))
124+
.andExpectAll(statusMatcher);
125+
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
126+
verify(shortCircuitService).deleteParameters(uuidCaptor.capture());
127+
assertThat(uuidCaptor.getValue()).isEqualTo(arg);
128+
}
129+
130+
@MethodSource("testExistingParametersArgs")
131+
@ParameterizedTest
132+
void testUpdateExistingParameters(final boolean existing, @NonNull final ResultMatcher statusMatcher) throws Exception {
133+
final UUID arg1 = UUID.randomUUID();
134+
final String arg2 = "{\"dummy\": \"content\"}";
135+
when(shortCircuitService.updateParameters(any(UUID.class), anyString())).thenReturn(existing);
136+
mockMvc.perform(put("/v1/parameters/{pUuid}", arg1.toString()).content(arg2).contentType(MediaType.APPLICATION_JSON))
137+
.andExpectAll(statusMatcher);
138+
final ArgumentCaptor<UUID> uuidCaptor = ArgumentCaptor.forClass(UUID.class);
139+
final ArgumentCaptor<String> strCaptor = ArgumentCaptor.forClass(String.class);
140+
verify(shortCircuitService).updateParameters(uuidCaptor.capture(), strCaptor.capture());
141+
assertThat(uuidCaptor.getValue()).isEqualTo(arg1);
142+
assertThat(strCaptor.getValue()).isEqualTo(arg2);
143+
}
144+
}

0 commit comments

Comments
 (0)