From a5bc085020929e65606a114f550983cc94a7e7a7 Mon Sep 17 00:00:00 2001 From: Franck LECUYER Date: Wed, 24 Jun 2026 14:58:05 +0200 Subject: [PATCH 1/2] Refactor ContingencyCount to add detailed informations on contingency lists and adapt related tests. Signed-off-by: Franck LECUYER --- .../study/server/dto/ContingencyCount.java | 6 ++++-- .../dto/ContingencyCountByContingencyList.java | 18 ++++++++++++++++++ .../study/server/service/ActionsService.java | 3 ++- .../rootnetworks/SecurityAnalysisTest.java | 16 +++++++++++----- 4 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java diff --git a/src/main/java/org/gridsuite/study/server/dto/ContingencyCount.java b/src/main/java/org/gridsuite/study/server/dto/ContingencyCount.java index fe3069565..edb0b66f2 100644 --- a/src/main/java/org/gridsuite/study/server/dto/ContingencyCount.java +++ b/src/main/java/org/gridsuite/study/server/dto/ContingencyCount.java @@ -6,10 +6,12 @@ */ package org.gridsuite.study.server.dto; +import java.util.Map; +import java.util.UUID; + /** * @author Radouane KHOUADRI {@literal } */ public record ContingencyCount( - int contingencies, - int notFoundElements + Map countByContingencyList ) { } diff --git a/src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java b/src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java new file mode 100644 index 000000000..9a6495521 --- /dev/null +++ b/src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java @@ -0,0 +1,18 @@ +/** + * Copyright (c) 2026, RTE (http://www.rte-france.com) + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.study.server.dto; + +import java.util.Map; +import java.util.Set; + +/** + * @author Franck Lecuyer {@literal } + */ +public record ContingencyCountByContingencyList( + int nbContingencies, + Map> notFoundElements +) { } diff --git a/src/main/java/org/gridsuite/study/server/service/ActionsService.java b/src/main/java/org/gridsuite/study/server/service/ActionsService.java index 2118268f4..f863d1ee2 100644 --- a/src/main/java/org/gridsuite/study/server/service/ActionsService.java +++ b/src/main/java/org/gridsuite/study/server/service/ActionsService.java @@ -20,6 +20,7 @@ import org.springframework.web.util.UriComponentsBuilder; import java.util.List; +import java.util.Map; import java.util.UUID; import static org.gridsuite.study.server.StudyConstants.*; @@ -32,7 +33,7 @@ public class ActionsService { private static final String NETWORK_UUID = "networkUuid"; private static final String CONTINGENCY_LIST_IDS = "ids"; - public static final ContingencyCount EMPTY_CONTINGENCY_COUNT = new ContingencyCount(0, 0); + public static final ContingencyCount EMPTY_CONTINGENCY_COUNT = new ContingencyCount(Map.of()); private String actionsServerBaseUri; diff --git a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java index ba6539ea5..4c6aa2e7f 100644 --- a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java @@ -15,8 +15,10 @@ import com.github.tomakehurst.wiremock.stubbing.ServeEvent; import com.powsybl.contingency.violations.LimitViolationType; import com.powsybl.security.SecurityAnalysisParameters; +import org.assertj.core.api.recursive.comparison.RecursiveComparisonConfiguration; import org.gridsuite.study.server.ContextConfigurationWithTestChannel; import org.gridsuite.study.server.dto.ContingencyCount; +import org.gridsuite.study.server.dto.ContingencyCountByContingencyList; import org.gridsuite.study.server.dto.NodeReceiver; import org.gridsuite.study.server.dto.RootNetworkNodeInfo; import org.gridsuite.study.server.networkmodificationtree.dto.*; @@ -54,11 +56,13 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static com.github.tomakehurst.wiremock.client.WireMock.post; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static org.assertj.core.api.Assertions.assertThat; 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.LOAD_FLOW; @@ -98,7 +102,8 @@ class SecurityAnalysisTest { private static final byte[] SECURITY_ANALYSIS_NMK_CONSTRAINTS_RESULT_CSV_ZIPPED = {0x04, 0x03}; private static final byte[] SECURITY_ANALYSIS_NMK_CUT_OFF_POWER_RESULT_CSV_ZIPPED = {0x05, 0x03}; private static final String SECURITY_ANALYSIS_STATUS_JSON = "\"CONVERGED\""; - private static final ContingencyCount CONTINGENCIES_COUNT = new ContingencyCount(2, 0); + private static final ContingencyCount CONTINGENCIES_COUNT = + new ContingencyCount(Map.of(UUID.randomUUID(), new ContingencyCountByContingencyList(2, Map.of("contingencyName", Set.of("equipmentName"))))); public static final String SECURITY_ANALYSIS_DEFAULT_PARAMETERS_JSON = "{\"lowVoltageAbsoluteThreshold\":0.0,\"lowVoltageProportionalThreshold\":0.0,\"highVoltageAbsoluteThreshold\":0.0,\"highVoltageProportionalThreshold\":0.0,\"flowProportionalThreshold\":0.1}"; private static final String SECURITY_ANALYSIS_PROFILE_PARAMETERS_JSON = "{\"lowVoltageAbsoluteThreshold\":30.0,\"lowVoltageProportionalThreshold\":0.4,\"highVoltageAbsoluteThreshold\":0.0,\"highVoltageProportionalThreshold\":0.0,\"flowProportionalThreshold\":0.1}"; @@ -672,8 +677,10 @@ private void testSecurityAnalysisWithRootNetworkUuidAndNodeUuid(UUID studyUuid, .andReturn(); resultAsString = mvcResult.getResponse().getContentAsString(); ContingencyCount count = objectMapper.readValue(resultAsString, ContingencyCount.class); - Integer expectedResponse = CONTINGENCIES_COUNT.contingencies(); - assertEquals(expectedResponse, count.contingencies()); + + assertThat(CONTINGENCIES_COUNT) + .usingRecursiveComparison(RecursiveComparisonConfiguration.builder().build()) + .isEqualTo(count); securityAnalysisServerStubs.verifyContingencyListCount(Map.of("ids", WireMock.matching(".*"))); @@ -683,8 +690,7 @@ private void testSecurityAnalysisWithRootNetworkUuidAndNodeUuid(UUID studyUuid, .andReturn(); resultAsString = mvcResult.getResponse().getContentAsString(); ContingencyCount count2 = objectMapper.readValue(resultAsString, ContingencyCount.class); - assertEquals(0, count2.contingencies()); - + assertEquals(0, count2.countByContingencyList().size()); } private void checkMessagesReceived(UUID studyUuid, String updateTypeToCheck) { From 2057375fba94d601d1c3cb800e4b22a5c3c88e88 Mon Sep 17 00:00:00 2001 From: Franck LECUYER Date: Mon, 6 Jul 2026 17:02:32 +0200 Subject: [PATCH 2/2] Add the powsybl error message for invalid contingency in the contingency count dto Signed-off-by: Franck LECUYER --- .../study/server/dto/ContingencyCountByContingencyList.java | 3 ++- .../study/server/rootnetworks/SecurityAnalysisTest.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java b/src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java index 9a6495521..4cac17cdb 100644 --- a/src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java +++ b/src/main/java/org/gridsuite/study/server/dto/ContingencyCountByContingencyList.java @@ -14,5 +14,6 @@ */ public record ContingencyCountByContingencyList( int nbContingencies, - Map> notFoundElements + Map> notFoundElements, + String invalidContingencyErrorMessage ) { } diff --git a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java index cdf3873e9..b691f2664 100644 --- a/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java +++ b/src/test/java/org/gridsuite/study/server/rootnetworks/SecurityAnalysisTest.java @@ -163,7 +163,7 @@ class SecurityAnalysisTest { private static final byte[] SECURITY_ANALYSIS_NMK_CUT_OFF_POWER_RESULT_CSV_ZIPPED = {0x05, 0x03}; private static final String SECURITY_ANALYSIS_STATUS_JSON = "\"CONVERGED\""; private static final ContingencyCount CONTINGENCIES_COUNT = - new ContingencyCount(Map.of(UUID.randomUUID(), new ContingencyCountByContingencyList(2, Map.of("contingencyName", Set.of("equipmentName"))))); + new ContingencyCount(Map.of(UUID.randomUUID(), new ContingencyCountByContingencyList(2, Map.of("contingencyName", Set.of("equipmentName")), "titi is not a valid contingency"))); public static final String SECURITY_ANALYSIS_DEFAULT_PARAMETERS_JSON = "{\"lowVoltageAbsoluteThreshold\":0.0,\"lowVoltageProportionalThreshold\":0.0,\"highVoltageAbsoluteThreshold\":0.0,\"highVoltageProportionalThreshold\":0.0,"