diff --git a/src/main/java/org/gridsuite/study/server/StudyController.java b/src/main/java/org/gridsuite/study/server/StudyController.java index e0d3df684..a5b1131b3 100644 --- a/src/main/java/org/gridsuite/study/server/StudyController.java +++ b/src/main/java/org/gridsuite/study/server/StudyController.java @@ -850,6 +850,16 @@ public ResponseEntity> getLimitViolations(@Parameter(d return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.getLimitViolations(studyUuid, nodeUuid, filters, globalFilters, sort)); } + @GetMapping(value = "/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values") + @Operation(summary = "Get Enum values") + @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The Enum values")}) + public ResponseEntity> getResultEnumValues(@Parameter(description = "Study UUID") @PathVariable("studyUuid") UUID studyUuid, + @Parameter(description = "Node UUID") @PathVariable("nodeUuid") UUID nodeUuid, + @Parameter(description = "Computing Type") @RequestParam(name = "computingType") ComputationType computingType, + @Parameter(description = "Enum name") @RequestParam(name = "enumName") String enumName) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(studyService.getResultEnumValues(studyUuid, nodeUuid, computingType, enumName)); + } + @PostMapping(value = "/studies/{studyUuid}/loadflow/parameters") @Operation(summary = "set loadflow parameters on study, reset to default ones if empty body") @ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The loadflow parameters are set"), diff --git a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java index 7a2a75806..3b94e6bcd 100644 --- a/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/study/server/service/LoadFlowService.java @@ -14,6 +14,7 @@ import org.gridsuite.study.server.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.repository.StudyEntity; +import org.gridsuite.study.server.service.common.AbstractComputationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.ParameterizedTypeReference; import org.springframework.data.domain.Sort; @@ -37,7 +38,7 @@ * @author Kevin Le Saulnier */ @Service -public class LoadFlowService { +public class LoadFlowService extends AbstractComputationService { static final String RESULT_UUID = "resultUuid"; private static final String PARAMETERS_URI = "/parameters/{parametersUuid}"; @@ -374,4 +375,8 @@ public UUID getLoadFlowParametersOrDefaultsUuid(StudyEntity studyEntity) { } return studyEntity.getLoadFlowParametersUuid(); } + + public List getEnumValues(String enumName, UUID resultUuid) { + return getEnumValues(enumName, resultUuid, LOADFLOW_API_VERSION, loadFlowServerBaseUri, LOADFLOW_NOT_FOUND, restTemplate); + } } diff --git a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java index 71cdfc879..3a7c50b28 100644 --- a/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java +++ b/src/main/java/org/gridsuite/study/server/service/SecurityAnalysisService.java @@ -14,6 +14,7 @@ import org.gridsuite.study.server.StudyException; import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.repository.StudyEntity; +import org.gridsuite.study.server.service.common.AbstractComputationService; import org.gridsuite.study.server.service.securityanalysis.SecurityAnalysisResultType; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; @@ -40,7 +41,7 @@ * @author Kevin Le Saulnier */ @Service -public class SecurityAnalysisService { +public class SecurityAnalysisService extends AbstractComputationService { static final String RESULT_UUID = "resultUuid"; @@ -394,4 +395,8 @@ public String getSecurityAnalysisDefaultProvider() { throw handleHttpError(e, GET_SECURITY_ANALYSIS_DEFAULT_PROVIDER_FAILED); } } + + public List getEnumValues(String enumName, UUID resultUuid) { + return getEnumValues(enumName, resultUuid, SECURITY_ANALYSIS_API_VERSION, securityAnalysisServerBaseUri, SECURITY_ANALYSIS_NOT_FOUND, restTemplate); + } } diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index 5befa7a77..9def88892 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -1044,6 +1044,23 @@ void updateComputationResultUuid(UUID nodeUuid, UUID computationResultUuid, Comp networkModificationTreeService.updateComputationResultUuid(nodeUuid, computationResultUuid, computationType); } + public List getResultEnumValues(UUID studyUuid, UUID nodeUuid, ComputationType computationType, String enumName) { + Objects.requireNonNull(studyUuid); + Objects.requireNonNull(nodeUuid); + Objects.requireNonNull(enumName); + Optional resultUuidOpt = networkModificationTreeService.getComputationResultUuid(nodeUuid, computationType); + if (resultUuidOpt.isPresent()) { + return switch (computationType) { + case LOAD_FLOW -> loadflowService.getEnumValues(enumName, resultUuidOpt.get()); + case SECURITY_ANALYSIS -> securityAnalysisService.getEnumValues(enumName, resultUuidOpt.get()); + case SHORT_CIRCUIT -> shortCircuitService.getEnumValues(enumName, resultUuidOpt.get()); + default -> throw new StudyException(NOT_ALLOWED); + }; + } else { + return new ArrayList<>(); + } + } + private StudyCreationRequestEntity insertStudyCreationRequestEntity(UUID studyUuid) { StudyCreationRequestEntity studyCreationRequestEntity = new StudyCreationRequestEntity( studyUuid == null ? UUID.randomUUID() : studyUuid); diff --git a/src/main/java/org/gridsuite/study/server/service/common/AbstractComputationService.java b/src/main/java/org/gridsuite/study/server/service/common/AbstractComputationService.java new file mode 100644 index 000000000..6b438f679 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/service/common/AbstractComputationService.java @@ -0,0 +1,36 @@ +package org.gridsuite.study.server.service.common; + +import org.gridsuite.study.server.StudyException; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponentsBuilder; + +import java.util.List; +import java.util.UUID; + +import static org.gridsuite.study.server.StudyConstants.DELIMITER; + +public abstract class AbstractComputationService { + + public abstract List getEnumValues(String enumName, UUID resultUuidOpt); + + public List getEnumValues(String enumName, UUID resultUuid, String apiVersion, String computingTypeBaseUri, StudyException.Type type, RestTemplate restTemplate) { + List result; + UriComponentsBuilder uriComponentsBuilder = UriComponentsBuilder.fromPath(DELIMITER + apiVersion + "/results/{resultUuid}/{enumName}"); + String path = uriComponentsBuilder.buildAndExpand(resultUuid, enumName).toUriString(); + try { + ResponseEntity> responseEntity = restTemplate.exchange(computingTypeBaseUri + path, HttpMethod.GET, null, new ParameterizedTypeReference<>() { }); + result = responseEntity.getBody(); + } catch (HttpStatusCodeException e) { + if (HttpStatus.NOT_FOUND.equals(e.getStatusCode())) { + throw new StudyException(type); + } + throw e; + } + return result; + } +} diff --git a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java index cdfffea7f..c1d355c24 100644 --- a/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java +++ b/src/main/java/org/gridsuite/study/server/service/shortcircuit/ShortCircuitService.java @@ -16,15 +16,12 @@ import org.apache.commons.lang3.StringUtils; import org.gridsuite.study.server.RemoteServicesProperties; import org.gridsuite.study.server.StudyException; -import org.gridsuite.study.server.dto.ComputationType; -import org.gridsuite.study.server.dto.NodeReceiver; -import org.gridsuite.study.server.dto.ShortCircuitParametersInfos; -import org.gridsuite.study.server.dto.ShortCircuitPredefinedConfiguration; -import org.gridsuite.study.server.dto.ShortCircuitStatus; +import org.gridsuite.study.server.dto.*; import org.gridsuite.study.server.repository.ShortCircuitParametersEntity; import org.gridsuite.study.server.service.NetworkModificationTreeService; import org.gridsuite.study.server.service.NetworkService; import org.gridsuite.study.server.service.StudyService; +import org.gridsuite.study.server.service.common.AbstractComputationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Pageable; import org.springframework.http.*; @@ -37,7 +34,10 @@ import java.net.URI; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; import static org.gridsuite.study.server.StudyException.Type.*; @@ -49,7 +49,7 @@ * @author Abdelsalem Hedhili */ @Service -public class ShortCircuitService { +public class ShortCircuitService extends AbstractComputationService { static final String RESULT_UUID = "resultUuid"; @@ -364,4 +364,7 @@ public void invalidateShortCircuitStatus(List uuids) { } } + public List getEnumValues(String enumName, UUID resultUuid) { + return getEnumValues(enumName, resultUuid, SHORT_CIRCUIT_API_VERSION, shortCircuitServerBaseUri, SHORT_CIRCUIT_ANALYSIS_NOT_FOUND, restTemplate); + } } diff --git a/src/test/java/org/gridsuite/study/server/LoadFlowTest.java b/src/test/java/org/gridsuite/study/server/LoadFlowTest.java index 8caf4922c..8c3774b34 100644 --- a/src/test/java/org/gridsuite/study/server/LoadFlowTest.java +++ b/src/test/java/org/gridsuite/study/server/LoadFlowTest.java @@ -128,6 +128,8 @@ public class LoadFlowTest { private static String LIMIT_VIOLATIONS_JSON; + private static String COMPUTING_STATUS_JSON; + private static String LOADFLOW_DEFAULT_PARAMETERS_JSON; //output destinations @@ -214,6 +216,7 @@ public void setup() throws IOException { .limitType(LimitViolationType.HIGH_VOLTAGE) .build()); LIMIT_VIOLATIONS_JSON = objectMapper.writeValueAsString(limitViolations); + COMPUTING_STATUS_JSON = objectMapper.writeValueAsString(List.of("CONVERGED", "FAILED")); LoadFlowParametersInfos loadFlowParametersInfos = LoadFlowParametersInfos.builder() .provider(PROVIDER) @@ -260,6 +263,11 @@ public MockResponse dispatch(RecordedRequest request) { } else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/limit-violations\\?filters=.*globalFilters=.*networkUuid=.*variantId.*sort=.*")) { return new MockResponse().setResponseCode(200).setBody(LIMIT_VIOLATIONS_JSON) .addHeader("Content-Type", "application/json; charset=utf-8"); + } else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation-status")) { + return new MockResponse().setResponseCode(200).setBody(COMPUTING_STATUS_JSON) + .addHeader("Content-Type", "application/json; charset=utf-8"); + } else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation")) { + return new MockResponse().setResponseCode(404); } else if (path.matches("/v1/results/invalidate-status\\?resultUuid=" + LOADFLOW_RESULT_UUID)) { return new MockResponse().setResponseCode(200) .addHeader("Content-Type", "application/json; charset=utf-8"); @@ -412,6 +420,19 @@ public void testGetLimitViolations() throws Exception { checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS); assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2 + "&limitReduction=0.7"))); + // get computing status + mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}", + studyNameUserIdUuid, modificationNode1Uuid, LOAD_FLOW, "computation-status")) + .andExpectAll(status().isOk(), + content().string(COMPUTING_STATUS_JSON)); + + assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation-status"))); + + mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}", + studyNameUserIdUuid, modificationNode1Uuid, LOAD_FLOW, "computation")).andReturn(); + + assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/computation"))); + // get limit violations mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/limit-violations", studyNameUserIdUuid, modificationNode1Uuid)).andExpectAll( status().isOk(), diff --git a/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java index 0e7818f67..c84d4dc70 100644 --- a/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/SecurityAnalysisTest.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.ObjectWriter; import com.powsybl.commons.exceptions.UncheckedInterruptedException; import com.powsybl.loadflow.LoadFlowParameters; +import com.powsybl.security.LimitViolationType; import com.powsybl.security.SecurityAnalysisParameters; import lombok.SneakyThrows; import okhttp3.HttpUrl; @@ -66,6 +67,7 @@ import static org.gridsuite.study.server.StudyConstants.HEADER_RECEIVER; import static org.gridsuite.study.server.StudyConstants.HEADER_USER_ID; import static org.gridsuite.study.server.dto.ComputationType.SECURITY_ANALYSIS; +import static org.gridsuite.study.server.dto.ComputationType.LOAD_FLOW; import static org.gridsuite.study.server.utils.TestUtils.getBinaryAsBuffer; import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.any; @@ -88,6 +90,7 @@ public class SecurityAnalysisTest { private static final String SECURITY_ANALYSIS_ERROR_NODE_RESULT_UUID = "22222222-9594-4e55-8ec7-07ea965d24eb"; private static final String NOT_FOUND_SECURITY_ANALYSIS_UUID = "e3a85c9b-9594-4e55-8ec7-07ea965d24eb"; private static final String CONTINGENCY_LIST_NAME = "ls"; + private static String LIMIT_TYPE_JSON; private static final String SECURITY_ANALYSIS_N_RESULT_JSON = "{\"status\":\"CONVERGED\",\"limitViolationsResult\":{\"limitViolations\":[{\"subjectId\":\"l3\",\"limitType\":\"CURRENT\",\"acceptableDuration\":1200,\"limit\":10.0,\"limitReduction\":1.0,\"value\":11.0,\"side\":\"ONE\"}],\"actionsTaken\":[]},\"networkResult\":{\"branchResults\":[],\"busResults\":[],\"threeWindingsTransformerResults\":[]}}"; private static final String SECURITY_ANALYSIS_NMK_CONTINGENCIES_RESULT_JSON = "[{\"id\":\"l1\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l1\",\"elementType\":\"BRANCH\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l2\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l2\",\"elementType\":\"GENERATOR\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l3\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l3\",\"elementType\":\"BUSBAR_SECTION\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l4\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l4\",\"elementType\":\"LINE\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l6\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l6\",\"elementType\":\"HVDC_LINE\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l7\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l7\",\"elementType\":\"DANGLING_LINE\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l8\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l8\",\"elementType\":\"SHUNT_COMPENSATOR\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"l9\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l9\",\"elementType\":\"TWO_WINDINGS_TRANSFORMER\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"la\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"l0\",\"elementType\":\"THREE_WINDINGS_TRANSFORMER\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]},{\"id\":\"lb\",\"status\":\"CONVERGED\",\"elements\":[{\"id\":\"la\",\"elementType\":\"STATIC_VAR_COMPENSATOR\"}],\"constraints\":[{\"subjectId\":\"vl1\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0}]}]"; private static final String SECURITY_ANALYSIS_NMK_CONSTRAINTS_RESULT_JSON = "[{\"constraintId\":\"l3\",\"contingencies\":[]},{\"constraintId\":\"vl1\",\"contingencies\":[{\"contingencyId\":\"l1\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l1\",\"elementType\":\"BRANCH\"}]},{\"contingencyId\":\"l2\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l2\",\"elementType\":\"GENERATOR\"}]},{\"contingencyId\":\"l3\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l3\",\"elementType\":\"BUSBAR_SECTION\"}]},{\"contingencyId\":\"l4\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l4\",\"elementType\":\"LINE\"}]},{\"contingencyId\":\"l6\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l6\",\"elementType\":\"HVDC_LINE\"}]},{\"contingencyId\":\"l7\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l7\",\"elementType\":\"DANGLING_LINE\"}]},{\"contingencyId\":\"l8\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l8\",\"elementType\":\"SHUNT_COMPENSATOR\"}]},{\"contingencyId\":\"l9\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l9\",\"elementType\":\"TWO_WINDINGS_TRANSFORMER\"}]},{\"contingencyId\":\"la\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"l0\",\"elementType\":\"THREE_WINDINGS_TRANSFORMER\"}]},{\"contingencyId\":\"lb\",\"computationStatus\":\"CONVERGED\",\"limitType\":\"HIGH_VOLTAGE\",\"limitName\":\"\",\"side\":null,\"acceptableDuration\":0,\"limit\":400.0,\"value\":410.0,\"elements\":[{\"id\":\"la\",\"elementType\":\"STATIC_VAR_COMPENSATOR\"}]}]}]"; @@ -192,6 +195,7 @@ public void setup() throws IOException { .specificParametersPerProvider(Map.of()) .build(); String loadFlowParameters = objectMapper.writeValueAsString(loadFlowParametersInfos); + LIMIT_TYPE_JSON = objectMapper.writeValueAsString(List.of(LimitViolationType.CURRENT.name(), LimitViolationType.HIGH_VOLTAGE.name())); final Dispatcher dispatcher = new Dispatcher() { @SneakyThrows @@ -210,6 +214,10 @@ public MockResponse dispatch(RecordedRequest request) { .build(), saResultDestination); return new MockResponse().setResponseCode(200).setBody("\"" + resultUuid + "\"") .addHeader("Content-Type", MediaType.APPLICATION_JSON_UTF8); + } else if (path.matches("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/limit-types") + || ("/v1/results/" + SECURITY_ANALYSIS_OTHER_NODE_RESULT_UUID + "/limit-types").equals(path)) { + return new MockResponse().setResponseCode(200).setBody(LIMIT_TYPE_JSON) + .addHeader("Content-Type", MediaType.APPLICATION_JSON_UTF8); } else if (path.matches("/v1/results/" + SECURITY_ANALYSIS_RESULT_UUID + "/n-result\\?page=.*size=.*filters=.*sort=.*")) { return new MockResponse().setResponseCode(200).setBody(SECURITY_ANALYSIS_N_RESULT_JSON) .addHeader("Content-Type", MediaType.APPLICATION_JSON_UTF8); @@ -500,6 +508,20 @@ private void testSecurityAnalysisWithNodeUuid(UUID studyUuid, UUID nodeUuid, UUI assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save.*contingencyListName=" + CONTINGENCY_LIST_NAME + "&receiver=.*nodeUuid.*"))); + // get limit types empty list + mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}", + studyUuid, nodeUuid, LOAD_FLOW, "limit-types")) + .andExpectAll(status().isOk(), + content().string("[]")); + + // get limit types + mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}", + studyUuid, nodeUuid, SECURITY_ANALYSIS, "limit-types")) + .andExpectAll(status().isOk(), + content().string(LIMIT_TYPE_JSON)); + + assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + resultUuid + "/limit-types"))); + // get N security analysis result mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/security-analysis/result?resultType={resultType}&page=0&size=10&filters=random_filters&sort=random_sort", studyUuid, nodeUuid, SecurityAnalysisResultType.N)).andExpectAll( status().isOk(), diff --git a/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java b/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java index 622c72b58..40d79d163 100644 --- a/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java +++ b/src/test/java/org/gridsuite/study/server/ShortCircuitTest.java @@ -106,6 +106,8 @@ public class ShortCircuitTest { private static final String SHORT_CIRCUIT_ANALYSIS_RESULT_JSON = "{\"version\":\"1.0\",\"faults\":[]"; + private static String FAULT_TYPES_JSON; + private static final String CSV_HEADERS = "{csvHeaders}"; private static final byte[] SHORT_CIRCUIT_ANALYSIS_CSV_RESULT = {0x00, 0x11}; @@ -179,6 +181,8 @@ public void setup() throws IOException { String shortCircuitAnalysisErrorResultUuidStr = objectMapper.writeValueAsString(SHORT_CIRCUIT_ANALYSIS_ERROR_RESULT_UUID); + FAULT_TYPES_JSON = objectMapper.writeValueAsString(List.of("")); + final Dispatcher dispatcher = new Dispatcher() { @SneakyThrows @Override @@ -221,6 +225,9 @@ public MockResponse dispatch(RecordedRequest request) { } else if (path.matches("/v1/results/" + SHORT_CIRCUIT_ANALYSIS_RESULT_UUID + "\\?mode=FULL")) { return new MockResponse().setResponseCode(200).setBody(SHORT_CIRCUIT_ANALYSIS_RESULT_JSON) .addHeader("Content-Type", "application/json; charset=utf-8"); + } else if (path.matches("/v1/results/" + SHORT_CIRCUIT_ANALYSIS_RESULT_UUID + "/fault-types")) { + return new MockResponse().setResponseCode(200) + .addHeader("Content-Type", "application/json; charset=utf-8"); } else if (path.matches("/v1/results/" + SHORT_CIRCUIT_ANALYSIS_RESULT_UUID + "/fault_results/paged" + "\\?mode=FULL&page=0&size=20&sort=id,DESC")) { return new MockResponse().setResponseCode(200).setBody(SHORT_CIRCUIT_ANALYSIS_RESULT_JSON) .addHeader("Content-Type", "application/json; charset=utf-8"); @@ -476,6 +483,13 @@ public void testPagedShortCircuit() throws Exception { assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/networks/" + NETWORK_UUID_STRING + "/run-and-save\\?receiver=.*&reportUuid=.*&reporterId=.*&variantId=" + VARIANT_ID_2))); + // get fault types + mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/computation/result/enum-values?computingType={computingType}&enumName={enumName}", + studyNameUserIdUuid, modificationNode1Uuid, ComputationType.SHORT_CIRCUIT, "fault-types")) + .andExpectAll(status().isOk()); + + assertTrue(TestUtils.getRequestsDone(1, server).stream().anyMatch(r -> r.matches("/v1/results/" + SHORT_CIRCUIT_ANALYSIS_RESULT_UUID + "/fault-types"))); + // get short circuit result with pagination mockMvc.perform(get("/v1/studies/{studyUuid}/nodes/{nodeUuid}/shortcircuit/result?paged=true&page=0&size=20&sort=id,DESC", studyNameUserIdUuid, modificationNode1Uuid)).andExpectAll( status().isOk(),