diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java index 6c4b17ca4..978eefcb0 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java @@ -12,6 +12,7 @@ import lombok.Setter; import org.gridsuite.modification.dto.FilterInfos; import org.gridsuite.modification.dto.byfilter.assignment.*; +import org.gridsuite.modification.modifications.data.assignment.DataType; import org.gridsuite.modification.server.entities.equipment.modification.VariationFilterEntity; import org.gridsuite.modification.server.entities.equipment.modification.byfilter.AbstractAssignmentEntity; diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java index f7eca8cd1..5c8f718a7 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java @@ -11,8 +11,8 @@ import lombok.NoArgsConstructor; import org.gridsuite.modification.dto.FilterInfos; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; import org.gridsuite.modification.server.entities.equipment.modification.VariationFilterEntity; import org.gridsuite.modification.server.entities.equipment.modification.byfilter.AbstractAssignmentEntity; diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java index 8b5fcdd99..647adca74 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java @@ -35,6 +35,7 @@ import org.springframework.stereotype.Service; import java.util.List; +import java.util.Locale; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -200,6 +201,7 @@ private ApplicationStatus apply(ModificationApplicationGroup modificationGroupIn UUID reporterId = modificationGroupInfos.reportInfos().getNodeUuid(); reportNode = ReportNode.newRootReportNode() .withAllResourceBundlesFromClasspath() + .withLocale(Locale.ENGLISH) .withMessageTemplate("network.modification.server.nodeUuid") .withUntypedValue("nodeUuid", reporterId.toString()) .build(); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/AbstractByFilterTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/AbstractByFilterTest.java new file mode 100644 index 000000000..38b8ad2d6 --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/AbstractByFilterTest.java @@ -0,0 +1,100 @@ +/* + * 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.modification.server.modifications.byfilter; + +import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.matching.MultiValuePattern; +import com.powsybl.iidm.network.IdentifiableType; +import lombok.SneakyThrows; +import org.gridsuite.filter.utils.EquipmentType; +import org.gridsuite.filter.wip.Filter; +import org.gridsuite.filter.wip.IdentifierListFilter; +import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; +import org.gridsuite.modification.server.utils.FilterStub; +import org.gridsuite.modification.server.utils.StubbedFilterRequest; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author Joris Mancini + */ +public abstract class AbstractByFilterTest extends AbstractNetworkModificationTest { + + protected static final String PATH = "/v1/standalone-filters"; + + protected abstract Map> getFilterMapping(); + + protected abstract IdentifiableType getIdentifiableType(); + + protected abstract EquipmentType getEquipmentType(); + + protected FilterStub createFilterStub(UUID filterID, Collection equipmentIds) { + return new FilterStub(filterID, equipmentFilter(Set.copyOf(equipmentIds))); + } + + protected Filter equipmentFilter(Set equipmentIds) { + return IdentifierListFilter.builder() + .equipmentType(getEquipmentType()) + .equipmentIds(equipmentIds) + .build(); + } + + protected List stubStandaloneFilterRequests(List> filterIdsList) { + Map, Integer> requestCounts = new LinkedHashMap<>(); + filterIdsList.forEach(filterIds -> requestCounts.merge(filterIds.stream().collect(Collectors.toSet()), 1, Integer::sum)); + + Map filtersById = getFilterMapping().entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, entry -> equipmentFilter(entry.getValue()))); + + List stubbedFilterRequests = new ArrayList<>(); + for (Map.Entry, Integer> requestCount : requestCounts.entrySet()) { + List filterStubs = requestCount.getKey().stream() + .map(filterId -> new FilterStub(filterId, Objects.requireNonNull(filtersById.get(filterId)))) + .toList(); + stubbedFilterRequests.add(new StubbedFilterRequest(stubStandaloneFilters(filterStubs), requestCount.getKey(), requestCount.getValue())); + } + return stubbedFilterRequests; + } + + @SneakyThrows + protected UUID stubStandaloneFilters(List filterStubs) { + List filterIds = filterStubs.stream().map(FilterStub::id).toList(); + return wireMockServer.stubFor(WireMock.get(WireMock.urlPathEqualTo(PATH)) + .withQueryParam("ids", havingExactlyIdsIgnoringOrder(filterIds)) + .willReturn(WireMock.ok() + .withBody(mapper.writeValueAsString(filterStubs.stream().collect(Collectors.toMap( + FilterStub::id, + FilterStub::filter + )))) + .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + } + + protected void verifyStandaloneFiltersRequest(UUID stubId, Set filterIds) { + verifyStandaloneFiltersRequest(stubId, filterIds, 1); + } + + protected void verifyStandaloneFiltersRequest(UUID stubId, Set filterIds, int nbRequests) { + wireMockUtils.verifyGetRequest(stubId, PATH, "ids", havingExactlyIdsIgnoringOrder(filterIds), false, nbRequests); + } + + protected void verifyStandaloneFiltersRequests(List stubs) { + stubs.forEach(stub -> wireMockUtils.verifyGetRequest( + stub.stubId(), PATH, "ids", havingExactlyIdsIgnoringOrder(stub.filterIds()), false, stub.requestCount())); + } + + protected MultiValuePattern havingExactlyIdsIgnoringOrder(Collection filterIds) { + String[] expectedIds = filterIds.stream() + .map(UUID::toString) + .distinct() + .toArray(String[]::new); + return WireMock.havingExactly(expectedIds); + } +} diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java index a486ffdad..eee79de37 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java @@ -7,36 +7,31 @@ package org.gridsuite.modification.server.modifications.byfilter.assignment; import com.fasterxml.jackson.core.type.TypeReference; -import com.github.tomakehurst.wiremock.client.WireMock; -import com.github.tomakehurst.wiremock.matching.StringValuePattern; -import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Network; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; -import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.FilterInfos; import org.gridsuite.modification.dto.ModificationByAssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; -import org.gridsuite.modification.dto.byfilter.assignment.DataType; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.PropertyAssignmentInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.PropertyField; +import org.gridsuite.modification.modifications.data.assignment.DataType; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; -import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; +import org.gridsuite.modification.server.modifications.byfilter.AbstractByFilterTest; import org.gridsuite.modification.server.service.FilterService; +import org.gridsuite.modification.server.utils.FilterStub; import org.gridsuite.modification.server.utils.NetworkCreation; +import org.gridsuite.modification.server.utils.StubbedFilterRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultActions; import java.util.*; import java.util.stream.Collectors; + import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.modification.server.impacts.TestImpactUtils.createCollectionElementImpact; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -52,7 +47,7 @@ * @author Thang PHAM */ @Tag("IntegrationTest") -abstract class AbstractModificationByAssignmentTest extends AbstractNetworkModificationTest { +abstract class AbstractModificationByAssignmentTest extends AbstractByFilterTest { protected static final UUID FILTER_ID_1 = UUID.randomUUID(); protected static final UUID FILTER_ID_2 = UUID.randomUUID(); protected static final UUID FILTER_ID_3 = UUID.randomUUID(); @@ -60,16 +55,12 @@ abstract class AbstractModificationByAssignmentTest extends AbstractNetworkModif protected static final UUID FILTER_ID_5 = UUID.randomUUID(); protected static final UUID FILTER_ID_6 = UUID.randomUUID(); protected static final UUID FILTER_WITH_ALL_WRONG_IDS = UUID.randomUUID(); - protected static final UUID FILTER_WITH_ONE_WRONG_ID = UUID.randomUUID(); protected final FilterInfos filter1 = new FilterInfos(FILTER_ID_1, "filter1"); protected final FilterInfos filter2 = new FilterInfos(FILTER_ID_2, "filter2"); protected final FilterInfos filter3 = new FilterInfos(FILTER_ID_3, "filter3"); protected final FilterInfos filter4 = new FilterInfos(FILTER_ID_4, "filter4"); protected final FilterInfos filter5 = new FilterInfos(FILTER_ID_5, "filter5"); protected final FilterInfos filter6 = new FilterInfos(FILTER_ID_6, "filter6"); - protected final FilterInfos filterWithOneWrongId = new FilterInfos(FILTER_WITH_ONE_WRONG_ID, "filterWithOneWrongId"); - - protected static final String PATH = "/v1/filters/metadata"; @Override protected void assertResultImpacts(List impacts) { @@ -104,82 +95,52 @@ public void testByModificationError() throws Exception { checkCreationApplicationStatus(List.of(assignmentWithNoEditedField), NetworkModificationResult.ApplicationStatus.WITH_ERRORS); } - protected void checkCreateWithWarning(List> assignments, List existingEquipmentList) throws Exception { - AbstractFilter filter = getFilterEquipments(FILTER_WITH_ONE_WRONG_ID, existingEquipmentList); - - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + FILTER_WITH_ONE_WRONG_ID)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filter))) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); - - checkCreationApplicationStatus(assignments, NetworkModificationResult.ApplicationStatus.WITH_WARNINGS); - - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(List.of(FILTER_WITH_ONE_WRONG_ID)), false); - } - - protected void checkCreateWithError(List> assignments, List filterEquipments) throws Exception { - String filterIds = filterEquipments.stream() - .map(AbstractFilter::getId) - .map(UUID::toString) - .collect(Collectors.joining(",")); - - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + filterIds)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(filterEquipments)) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + protected void checkCreateWithStatus(List> assignments, List filterEquipments, + NetworkModificationResult.ApplicationStatus applicationStatus) throws Exception { + UUID stubId = stubStandaloneFilters(filterEquipments); - checkCreationApplicationStatus(assignments, NetworkModificationResult.ApplicationStatus.WITH_ERRORS); + checkCreationApplicationStatus(assignments, applicationStatus); - wireMockUtils.verifyGetRequest(stubId, - PATH, - handleQueryParams(filterEquipments.stream().map(AbstractFilter::getId).toList()), - false); + verifyStandaloneFiltersRequest(stubId, filterEquipments.stream().map(FilterStub::id).collect(Collectors.toSet())); } @Test public void testModificationWithAllWrongEquipmentIds() throws Exception { - AbstractFilter filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, List.of()); + FilterStub filter = createFilterStub(FILTER_WITH_ALL_WRONG_IDS, Set.of()); List> assignmentsWithWrongFilter = getAssignmentInfos().stream() .peek(assignmentInfos -> assignmentInfos.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId")))) .toList(); - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + FILTER_WITH_ALL_WRONG_IDS)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filter))) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + UUID stubId = stubStandaloneFilters(List.of(filter)); checkCreationApplicationStatus(assignmentsWithWrongFilter, NetworkModificationResult.ApplicationStatus.WITH_ERRORS); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(List.of(FILTER_WITH_ALL_WRONG_IDS)), false); + verifyStandaloneFiltersRequest(stubId, Set.of(FILTER_WITH_ALL_WRONG_IDS), getAssignmentInfos().size()); } @Test @Override public void testCreate() throws Exception { - List filters = getTestFilters(); - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(true) + ".{2,}")) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(filters)) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + List stubs = stubStandaloneFilterRequests(getAssignmentInfos().stream() + .map(assignment -> assignment.getFilters().stream().map(FilterInfos::getId).toList()) + .toList()); super.testCreate(); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(filters.stream().map(AbstractFilter::getId).toList()), false); + verifyStandaloneFiltersRequests(stubs); } @Test @Override public void testCopy() throws Exception { - List filters = getTestFilters(); - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(true) + ".{2,}")) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(filters)) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + List stubs = stubStandaloneFilterRequests(getAssignmentInfos().stream() + .map(assignment -> assignment.getFilters().stream().map(FilterInfos::getId).toList()) + .toList()); super.testCopy(); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(filters.stream().map(AbstractFilter::getId).toList()), false); + verifyStandaloneFiltersRequests(stubs); } protected void checkCreationApplicationStatus(List> assignmentInfos, @@ -226,31 +187,8 @@ protected ModificationByAssignmentInfos buildModificationUpdate() { .build(); } - protected IdentifierListFilterEquipmentAttributes getIdentifiableAttributes(String id, Double distributionKey) { - return new IdentifierListFilterEquipmentAttributes(id, distributionKey); - } - - protected AbstractFilter getFilterEquipments(UUID filterID, List identifiableAttributes) { - return IdentifierListFilter.builder().id(filterID).modificationDate(new Date()).equipmentType(getEquipmentType()) - .filterEquipmentsAttributes(identifiableAttributes) - .build(); - } - - protected Map handleQueryParams(List filterIds) { - return Map.of("ids", WireMock.matching(filterIds.stream().map(uuid -> ".+").collect(Collectors.joining(",")))); - } - - protected String getPath(boolean isRegexPath) { - if (isRegexPath) { - return "/v1/filters/metadata\\?ids="; - } - return "/v1/filters/metadata?ids="; - } - protected abstract void createEquipments(); - protected abstract List getTestFilters(); - protected List> getAssignmentInfos() { PropertyAssignmentInfos spyAssignmentInfos = spy(PropertyAssignmentInfos.builder() .editedField(PropertyField.FREE_PROPERTIES.name()) @@ -263,8 +201,4 @@ protected List> getAssignmentInfos() { } protected abstract List> getUpdatedAssignmentInfos(); - - protected abstract IdentifiableType getIdentifiableType(); - - protected abstract EquipmentType getEquipmentType(); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java index 4d06db89e..6912bec13 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/BatteryModificationByAssignmentTest.java @@ -9,17 +9,15 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.extensions.ActivePowerControl; import com.powsybl.iidm.network.extensions.ActivePowerControlAdder; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.BatteryField; -import org.junit.jupiter.api.Test; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createBattery; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -36,21 +34,6 @@ class BatteryModificationByAssignmentTest extends AbstractModificationByAssignme private static final String BATTERY_ID_5 = "battery5"; private static final String BATTERY_ID_6 = "battery6"; - @Test - void testCreateWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes = getIdentifiableAttributes(BATTERY_ID_1, 1.0); - IdentifierListFilterEquipmentAttributes wrongIdAttributes = getIdentifiableAttributes("wrongId", 1.0); - - DoubleAssignmentInfos assignmentInfos = DoubleAssignmentInfos.builder() - .filters(List.of(filterWithOneWrongId)) - .editedField(BatteryField.ACTIVE_POWER_SET_POINT.name()) - .value(55.) - .build(); - - checkCreateWithWarning(List.of(assignmentInfos), List.of(identifiableAttributes, wrongIdAttributes)); - assertEquals(55, getNetwork().getBattery(BATTERY_ID_1).getTargetP(), 0); - } - @Override protected void createEquipments() { getNetwork().getBattery(BATTERY_ID_1).setTargetP(100).setMaxP(500).setMinP(0).setTargetQ(80); @@ -67,30 +50,17 @@ protected void createEquipments() { createBattery(getNetwork().getVoltageLevel("v6"), BATTERY_ID_6, "v6Battery6", 60, 200, 700, 250, 210); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(BATTERY_ID_1, BATTERY_ID_2), + FILTER_ID_2, Set.of(BATTERY_ID_3, BATTERY_ID_4), + FILTER_ID_3, Set.of(BATTERY_ID_5, BATTERY_ID_6), + FILTER_ID_4, Set.of(BATTERY_ID_1, BATTERY_ID_5), + FILTER_ID_5, Set.of(BATTERY_ID_2, BATTERY_ID_3) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_4, 5.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_5, 6.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_6, 7.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_5, 6.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_2, 2.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_3, 3.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4, filter5); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java index db6878ebf..ad3e52b91 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/GeneratorModificationByAssignmentTest.java @@ -9,19 +9,17 @@ import com.powsybl.iidm.network.Generator; import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.extensions.*; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.BooleanAssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.GeneratorField; import org.junit.jupiter.api.Tag; -import org.junit.jupiter.api.Test; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.modification.server.utils.NetworkUtil.createGenerator; @@ -43,22 +41,6 @@ class GeneratorModificationByAssignmentTest extends AbstractModificationByAssign private static final String GENERATOR_ID_8 = "gen8"; private static final String GENERATOR_ID_9 = "gen9"; private static final String GENERATOR_ID_10 = "gen10"; - private static final String GENERATOR_ID_11 = "gen11"; - - @Test - void testCreateWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes = getIdentifiableAttributes(GENERATOR_ID_1, 1.0); - IdentifierListFilterEquipmentAttributes wrongIdAttributes = getIdentifiableAttributes("wrongId", 1.0); - - DoubleAssignmentInfos assignmentInfos = DoubleAssignmentInfos.builder() - .filters(List.of(filterWithOneWrongId)) - .editedField(GeneratorField.ACTIVE_POWER_SET_POINT.name()) - .value(55.) - .build(); - - checkCreateWithWarning(List.of(assignmentInfos), List.of(identifiableAttributes, wrongIdAttributes)); - assertEquals(55, getNetwork().getGenerator(GENERATOR_ID_1).getTargetP(), 0); - } @Override protected void createEquipments() { @@ -129,30 +111,17 @@ protected void createEquipments() { getNetwork().getGenerator(GENERATOR_ID_10).setRatedS(30.); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(GENERATOR_ID_1, GENERATOR_ID_2), + FILTER_ID_2, Set.of(GENERATOR_ID_3, GENERATOR_ID_4), + FILTER_ID_3, Set.of(GENERATOR_ID_5, GENERATOR_ID_6), + FILTER_ID_4, Set.of(GENERATOR_ID_7, GENERATOR_ID_8), + FILTER_ID_5, Set.of(GENERATOR_ID_9, GENERATOR_ID_10) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_4, 5.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_5, 6.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_6, 7.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_7, 3.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_8, 8.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_9, 0.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_10, 9.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4, filter5); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LineModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LineModificationByAssignmentTest.java index ebf7b66f8..1f34428b6 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LineModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LineModificationByAssignmentTest.java @@ -9,9 +9,6 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Line; import com.powsybl.iidm.network.extensions.ConnectablePosition; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; @@ -19,8 +16,10 @@ import org.gridsuite.modification.dto.byfilter.assignment.StringAssignmentInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.LineField; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createLine; import static org.junit.jupiter.api.Assertions.*; @@ -70,37 +69,16 @@ protected void createEquipments() { "line_6", 23, ConnectablePosition.Direction.BOTTOM); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(LINE_ID_1, LINE_ID_2), + FILTER_ID_2, Set.of(LINE_ID_1, LINE_ID_3), + FILTER_ID_3, Set.of(LINE_ID_4, LINE_ID_5), + FILTER_ID_4, Set.of(LINE_ID_4, LINE_ID_6) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1) - .modificationDate(new Date()).equipmentType(EquipmentType.LINE) - .filterEquipmentsAttributes(List.of( - new IdentifierListFilterEquipmentAttributes(LINE_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(LINE_ID_2, 2.0) - )).build(); - - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2) - .modificationDate(new Date()).equipmentType(EquipmentType.LINE) - .filterEquipmentsAttributes(List.of( - new IdentifierListFilterEquipmentAttributes(LINE_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(LINE_ID_3, 2.0) - )).build(); - - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3) - .modificationDate(new Date()).equipmentType(EquipmentType.LINE) - .filterEquipmentsAttributes(List.of( - new IdentifierListFilterEquipmentAttributes(LINE_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(LINE_ID_5, 6.0) - )).build(); - - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4) - .modificationDate(new Date()).equipmentType(EquipmentType.LINE) - .filterEquipmentsAttributes(List.of( - new IdentifierListFilterEquipmentAttributes(LINE_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(LINE_ID_6, 7.0) - )).build(); - - return List.of(filter1, filter2, filter3, filter4); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LoadModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LoadModificationByAssignmentTest.java index d82e340c2..b57a3b70c 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LoadModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/LoadModificationByAssignmentTest.java @@ -8,9 +8,6 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.LoadType; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; @@ -18,9 +15,10 @@ import org.gridsuite.modification.dto.byfilter.equipmentfield.LoadField; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; -import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.modification.server.impacts.TestImpactUtils.createSubstationImpacts; @@ -44,18 +42,14 @@ protected void createEquipments() { createLoad(getNetwork().getVoltageLevel("v4"), LOAD_ID_4, "load4", 400, 50, 150, null, 5, null); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(LOAD_ID_1, LOAD_ID_2), + FILTER_ID_2, Set.of(LOAD_ID_3, LOAD_ID_4) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.LOAD) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(LOAD_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(LOAD_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.LOAD) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(LOAD_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(LOAD_ID_4, 5.0))) - .build(); - - return List.of(filter1, filter2); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/ShuntCompensatorModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/ShuntCompensatorModificationByAssignmentTest.java index 010799e56..b1d3df58b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/ShuntCompensatorModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/ShuntCompensatorModificationByAssignmentTest.java @@ -10,18 +10,16 @@ import com.powsybl.iidm.network.ShuntCompensator; import com.powsybl.iidm.network.ShuntCompensatorLinearModel; import com.powsybl.iidm.network.extensions.ConnectablePosition; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.IntegerAssignmentInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.ShuntCompensatorField; -import org.junit.jupiter.api.Test; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createShuntCompensator; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -36,21 +34,6 @@ class ShuntCompensatorModificationByAssignmentTest extends AbstractModificationB private static final String SHUNT_COMPENSATOR_ID_4 = "v4shunt"; private static final String SHUNT_COMPENSATOR_ID_5 = "v5shunt"; - @Test - void testCreateWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes = getIdentifiableAttributes(SHUNT_COMPENSATOR_ID_1, 1.0); - IdentifierListFilterEquipmentAttributes wrongIdAttributes = getIdentifiableAttributes("wrongId", 1.0); - - IntegerAssignmentInfos assignmentInfos = IntegerAssignmentInfos.builder() - .editedField(ShuntCompensatorField.MAXIMUM_SECTION_COUNT.name()) - .value(2) - .filters(List.of(filterWithOneWrongId)) - .build(); - - checkCreateWithWarning(List.of(assignmentInfos), List.of(identifiableAttributes, wrongIdAttributes)); - assertEquals(2, getNetwork().getShuntCompensator(SHUNT_COMPENSATOR_ID_1).getMaximumSectionCount(), 0); - } - @Override protected void createEquipments() { createShuntCompensator(getNetwork().getVoltageLevel("v1"), SHUNT_COMPENSATOR_ID_1, "v1shunt", 8, 225., 10, true, 4, 2, 3, 2, "cn11", 22, ConnectablePosition.Direction.BOTTOM); @@ -58,25 +41,17 @@ protected void createEquipments() { createShuntCompensator(getNetwork().getVoltageLevel("v4"), SHUNT_COMPENSATOR_ID_4, "v3shunt", 10, 305., 20, true, 15, 4, 3, 10, "cn11", 22, ConnectablePosition.Direction.BOTTOM); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(SHUNT_COMPENSATOR_ID_1), + FILTER_ID_2, Set.of(SHUNT_COMPENSATOR_ID_2), + FILTER_ID_3, Set.of(SHUNT_COMPENSATOR_ID_3), + FILTER_ID_4, Set.of(SHUNT_COMPENSATOR_ID_4), + FILTER_ID_5, Set.of(SHUNT_COMPENSATOR_ID_5) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_1, 1.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_2, 1.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_3, 1.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_4, 1.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_5, 1.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4, filter5); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java index 70010fb83..4a12bcc8d 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/TwoWindingsTransformerModificationByAssignmentTest.java @@ -6,12 +6,8 @@ */ package org.gridsuite.modification.server.modifications.byfilter.assignment; -import com.github.tomakehurst.wiremock.client.WireMock; import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.ConnectablePosition; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; @@ -19,11 +15,11 @@ import org.gridsuite.modification.dto.byfilter.assignment.StringAssignmentInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.TwoWindingsTransformerField; import org.gridsuite.modification.server.dto.NetworkModificationResult; +import org.gridsuite.modification.server.utils.FilterStub; import org.junit.jupiter.api.Test; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createTwoWindingsTransformer; import static org.junit.jupiter.api.Assertions.*; @@ -40,51 +36,36 @@ class TwoWindingsTransformerModificationByAssignmentTest extends AbstractModific private static final String TWT_ID_6 = "twt6"; @Test - void testModifyTwtWithError() throws Exception { - // Test modifying ratio tab changer field when ratio tab changer is null - IdentifierListFilterEquipmentAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_4, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_6, 1.); - AbstractFilter filter = getFilterEquipments(FILTER_ID_4, List.of(identifiableAttributes1, identifiableAttributes2)); - DoubleAssignmentInfos assignmentInfos = DoubleAssignmentInfos.builder() - .editedField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()) - .value(1.) - .filters(List.of(filter4)) - .build(); + void testModificationNotAppliedOnPhaseTapIfNotPresent() throws Exception { + FilterStub filterTwt1 = createFilterStub(FILTER_ID_1, List.of(TWT_ID_1, TWT_ID_2)); + FilterStub filterTwt2 = createFilterStub(FILTER_ID_4, List.of(TWT_ID_4, TWT_ID_6)); - checkCreateWithError(List.of(assignmentInfos), List.of(filter)); - - assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger()); - assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); + UUID stubId = stubStandaloneFilters(List.of(filterTwt1, filterTwt2)); - // Test modifying phase tab changer field when phase tab changer is null - IdentifierListFilterEquipmentAttributes identifiableAttributes3 = getIdentifiableAttributes(TWT_ID_1, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes4 = getIdentifiableAttributes(TWT_ID_2, 1.); - AbstractFilter filter2 = getFilterEquipments(FILTER_ID_1, List.of(identifiableAttributes3, identifiableAttributes4)); - DoubleAssignmentInfos assignmentInfos2 = DoubleAssignmentInfos.builder() + IntegerAssignmentInfos assignmentInfos = IntegerAssignmentInfos.builder() + .filters(List.of(filter1, filter4)) .editedField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()) - .value(1.) - .filters(List.of(filter1)) + .value(4) .build(); - checkCreateWithError(List.of(assignmentInfos2), List.of(filter2)); + checkCreationApplicationStatus(List.of(assignmentInfos), NetworkModificationResult.ApplicationStatus.WITH_WARNINGS); + assertNotNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getPhaseTapChanger()); + assertNotNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getPhaseTapChanger()); + assertEquals(4, getNetwork().getTwoWindingsTransformer(TWT_ID_4).getPhaseTapChanger().getTapPosition()); + assertEquals(4, getNetwork().getTwoWindingsTransformer(TWT_ID_6).getPhaseTapChanger().getTapPosition()); assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_1).getPhaseTapChanger()); assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_2).getPhaseTapChanger()); + + verifyStandaloneFiltersRequest(stubId, Set.of(FILTER_ID_1, FILTER_ID_4)); } @Test - void testModifyTwtWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_1, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_2, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes3 = getIdentifiableAttributes(TWT_ID_4, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes4 = getIdentifiableAttributes(TWT_ID_6, 1.); - AbstractFilter filterTwt1 = getFilterEquipments(FILTER_ID_1, List.of(identifiableAttributes1, identifiableAttributes2)); - AbstractFilter filterTwt2 = getFilterEquipments(FILTER_ID_4, List.of(identifiableAttributes3, identifiableAttributes4)); - - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(true) + ".{2,}")) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filterTwt1, filterTwt2))) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + void testModificationNotAppliedOnRatioTapIfNotPresent() throws Exception { + FilterStub filterTwt1 = createFilterStub(FILTER_ID_1, List.of(TWT_ID_1, TWT_ID_2)); + FilterStub filterTwt2 = createFilterStub(FILTER_ID_4, List.of(TWT_ID_4, TWT_ID_6)); + + UUID stubId = stubStandaloneFilters(List.of(filterTwt1, filterTwt2)); IntegerAssignmentInfos assignmentInfos = IntegerAssignmentInfos.builder() .filters(List.of(filter1, filter4)) @@ -101,7 +82,7 @@ void testModifyTwtWithWarning() throws Exception { assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger()); assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(List.of(FILTER_ID_1, FILTER_ID_4)), false); + verifyStandaloneFiltersRequest(stubId, Set.of(FILTER_ID_1, FILTER_ID_4)); } @Override @@ -162,26 +143,16 @@ protected void createEquipments() { addPhaseTapChangerSteps(twt6.newPhaseTapChanger().setRegulationValue(47).setLowTapPosition(1).setTapPosition(1).setTargetDeadband(36)); } - @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_3, 2.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_5, 6.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_6, 7.0))) - .build(); + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(TWT_ID_1, TWT_ID_2), + FILTER_ID_2, Set.of(TWT_ID_1, TWT_ID_3), + FILTER_ID_3, Set.of(TWT_ID_4, TWT_ID_5), + FILTER_ID_4, Set.of(TWT_ID_4, TWT_ID_6) + ); - return List.of(filter1, filter2, filter3, filter4); + @Override + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/VoltageLevelModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/VoltageLevelModificationByAssignmentTest.java index 4c476612c..e38a13337 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/VoltageLevelModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/VoltageLevelModificationByAssignmentTest.java @@ -11,16 +11,12 @@ import com.powsybl.iidm.network.VoltageLevel; import com.powsybl.iidm.network.extensions.IdentifiableShortCircuit; import com.powsybl.iidm.network.extensions.IdentifiableShortCircuitAdder; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.assignment.AssignmentInfos; import org.gridsuite.modification.dto.byfilter.assignment.DoubleAssignmentInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.VoltageLevelField; -import java.util.Date; -import java.util.List; +import java.util.*; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -81,34 +77,18 @@ protected void createEquipments() { .newExtension(IdentifiableShortCircuitAdder.class).withIpMin(100).withIpMax(200).add(); } - @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_4, 5.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_5, 6.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_6, 7.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_2, 2.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_5, 6.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_6, 7.0))) - .build(); - - IdentifierListFilter filter6 = IdentifierListFilter.builder().id(FILTER_ID_6).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_7, 1.0))) - .build(); + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(VOLTAGE_LEVEL_ID_1, VOLTAGE_LEVEL_ID_2), + FILTER_ID_2, Set.of(VOLTAGE_LEVEL_ID_3, VOLTAGE_LEVEL_ID_4), + FILTER_ID_3, Set.of(VOLTAGE_LEVEL_ID_5, VOLTAGE_LEVEL_ID_6), + FILTER_ID_4, Set.of(VOLTAGE_LEVEL_ID_2, VOLTAGE_LEVEL_ID_5), + FILTER_ID_5, Set.of(VOLTAGE_LEVEL_ID_4, VOLTAGE_LEVEL_ID_6), + FILTER_ID_6, Set.of(VOLTAGE_LEVEL_ID_7) + ); - return List.of(filter1, filter2, filter3, filter4, filter5, filter6); + @Override + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java index 216fc49d4..eae49e0cc 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java @@ -7,34 +7,29 @@ package org.gridsuite.modification.server.modifications.byfilter.formula; import com.fasterxml.jackson.core.type.TypeReference; -import com.github.tomakehurst.wiremock.client.WireMock; -import com.github.tomakehurst.wiremock.matching.StringValuePattern; -import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Network; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; -import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.ByFormulaModificationInfos; import org.gridsuite.modification.dto.FilterInfos; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; -import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; +import org.gridsuite.modification.server.modifications.byfilter.AbstractByFilterTest; import org.gridsuite.modification.server.service.FilterService; +import org.gridsuite.modification.server.utils.FilterStub; import org.gridsuite.modification.server.utils.NetworkCreation; +import org.gridsuite.modification.server.utils.StubbedFilterRequest; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.ResultActions; import java.util.*; import java.util.stream.Collectors; + import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.modification.server.impacts.TestImpactUtils.createCollectionElementImpact; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -48,7 +43,7 @@ * @author Seddik Yengui */ @Tag("IntegrationTest") -abstract class AbstractByFormulaModificationTest extends AbstractNetworkModificationTest { +abstract class AbstractByFormulaModificationTest extends AbstractByFilterTest { protected static final UUID FILTER_ID_1 = UUID.randomUUID(); protected static final UUID FILTER_ID_2 = UUID.randomUUID(); protected static final UUID FILTER_ID_3 = UUID.randomUUID(); @@ -56,16 +51,12 @@ abstract class AbstractByFormulaModificationTest extends AbstractNetworkModifica protected static final UUID FILTER_ID_5 = UUID.randomUUID(); protected static final UUID FILTER_ID_6 = UUID.randomUUID(); protected static final UUID FILTER_WITH_ALL_WRONG_IDS = UUID.randomUUID(); - protected static final UUID FILTER_WITH_ONE_WRONG_ID = UUID.randomUUID(); protected final FilterInfos filter1 = new FilterInfos(FILTER_ID_1, "filter1"); protected final FilterInfos filter2 = new FilterInfos(FILTER_ID_2, "filter2"); protected final FilterInfos filter3 = new FilterInfos(FILTER_ID_3, "filter3"); protected final FilterInfos filter4 = new FilterInfos(FILTER_ID_4, "filter4"); protected final FilterInfos filter5 = new FilterInfos(FILTER_ID_5, "filter5"); protected final FilterInfos filter6 = new FilterInfos(FILTER_ID_6, "filter6"); - protected final FilterInfos filterWithOneWrongId = new FilterInfos(FILTER_WITH_ONE_WRONG_ID, "filterWithOneWrongId"); - - protected static final String PATH = "/v1/filters/metadata"; @Override protected void assertResultImpacts(List impacts) { @@ -81,7 +72,6 @@ public void specificSetUp() { @Test public void testByModificationError() throws Exception { - // Test with empty list of formulas checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of()).build(), NetworkModificationResult.ApplicationStatus.WITH_ERRORS); @@ -102,60 +92,33 @@ public void testByModificationError() throws Exception { NetworkModificationResult.ApplicationStatus.WITH_ERRORS); } - protected void checkCreateWithWarning(List formulaInfos, List existingEquipmentList) throws Exception { - AbstractFilter filter = getFilterEquipments(FILTER_WITH_ONE_WRONG_ID, existingEquipmentList); - - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + FILTER_WITH_ONE_WRONG_ID)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filter))) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); - - ByFormulaModificationInfos byFormulaModificationInfos = ByFormulaModificationInfos.builder() - .formulaInfosList(formulaInfos) - .identifiableType(getIdentifiableType()) - .build(); - - checkCreationApplicationStatus(byFormulaModificationInfos, NetworkModificationResult.ApplicationStatus.WITH_WARNINGS); - - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(List.of(FILTER_WITH_ONE_WRONG_ID)), false); + protected void checkCreateWithError(List formulaInfos, List filterEquipments) throws Exception { + checkCreateWithStatus(formulaInfos, filterEquipments, NetworkModificationResult.ApplicationStatus.WITH_ERRORS); } - protected void checkCreateWithError(List formulaInfos, List filterEquipments) throws Exception { - String filterIds = filterEquipments.stream() - .map(AbstractFilter::getId) - .map(UUID::toString) - .collect(Collectors.joining(",")); - - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + filterIds)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(filterEquipments)) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + protected void checkCreateWithStatus(List formulaInfos, List filterEquipments, + NetworkModificationResult.ApplicationStatus applicationStatus) throws Exception { + UUID stubId = stubStandaloneFilters(filterEquipments); ByFormulaModificationInfos byFormulaModificationInfos = ByFormulaModificationInfos.builder() .formulaInfosList(formulaInfos) .identifiableType(getIdentifiableType()) .build(); - checkCreationApplicationStatus(byFormulaModificationInfos, NetworkModificationResult.ApplicationStatus.WITH_ERRORS); + checkCreationApplicationStatus(byFormulaModificationInfos, applicationStatus); - wireMockUtils.verifyGetRequest(stubId, - PATH, - handleQueryParams(filterEquipments.stream().map(AbstractFilter::getId).collect(Collectors.toList())), - false); + verifyStandaloneFiltersRequest(stubId, filterEquipments.stream().map(FilterStub::id).collect(Collectors.toSet())); } @Test public void testModificationWithAllWrongEquipmentIds() throws Exception { - AbstractFilter filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, List.of()); + FilterStub filter = createFilterStub(FILTER_WITH_ALL_WRONG_IDS, Set.of()); List formulaInfos = getFormulaInfos().stream() .peek(formula -> formula.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId")))) .toList(); - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + FILTER_WITH_ALL_WRONG_IDS)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filter))) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + UUID stubId = stubStandaloneFilters(List.of(filter)); ByFormulaModificationInfos byFormulaModificationInfos = ByFormulaModificationInfos.builder() .formulaInfosList(formulaInfos) @@ -164,35 +127,31 @@ public void testModificationWithAllWrongEquipmentIds() throws Exception { checkCreationApplicationStatus(byFormulaModificationInfos, NetworkModificationResult.ApplicationStatus.WITH_ERRORS); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(List.of(FILTER_WITH_ALL_WRONG_IDS)), false); + verifyStandaloneFiltersRequest(stubId, Set.of(FILTER_WITH_ALL_WRONG_IDS), getFormulaInfos().size()); } @Test @Override public void testCreate() throws Exception { - List filters = getTestFilters(); - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(true) + ".{2,}")) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(filters)) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + List stubs = stubStandaloneFilterRequests(getFormulaInfos().stream() + .map(formula -> formula.getFilters().stream().map(FilterInfos::getId).toList()) + .toList()); super.testCreate(); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(filters.stream().map(AbstractFilter::getId).collect(Collectors.toList())), false); + verifyStandaloneFiltersRequests(stubs); } @Test @Override public void testCopy() throws Exception { - List filters = getTestFilters(); - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(true) + ".{2,}")) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(filters)) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + List stubs = stubStandaloneFilterRequests(getFormulaInfos().stream() + .map(formula -> formula.getFilters().stream().map(FilterInfos::getId).toList()) + .toList()); super.testCopy(); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(filters.stream().map(AbstractFilter::getId).collect(Collectors.toList())), false); + verifyStandaloneFiltersRequests(stubs); } protected void checkCreationApplicationStatus(ByFormulaModificationInfos byFormulaModificationInfos, @@ -233,16 +192,6 @@ protected ByFormulaModificationInfos buildModificationUpdate() { .build(); } - protected IdentifierListFilterEquipmentAttributes getIdentifiableAttributes(String id, Double distributionKey) { - return new IdentifierListFilterEquipmentAttributes(id, distributionKey); - } - - protected AbstractFilter getFilterEquipments(UUID filterID, List identifiableAttributes) { - return IdentifierListFilter.builder().id(filterID).modificationDate(new Date()).equipmentType(getEquipmentType()) - .filterEquipmentsAttributes(identifiableAttributes) - .build(); - } - protected FormulaInfos getFormulaInfo(String editedField, List filters, Operator operator, @@ -257,26 +206,9 @@ protected FormulaInfos getFormulaInfo(String editedField, .build(); } - protected Map handleQueryParams(List filterIds) { - return Map.of("ids", WireMock.matching(filterIds.stream().map(uuid -> ".+").collect(Collectors.joining(",")))); - } - - protected String getPath(boolean isRegexPath) { - if (isRegexPath) { - return "/v1/filters/metadata\\?ids="; - } - return "/v1/filters/metadata?ids="; - } - protected abstract void createEquipments(); - protected abstract List getTestFilters(); - protected abstract List getFormulaInfos(); protected abstract List getUpdatedFormulaInfos(); - - protected abstract IdentifiableType getIdentifiableType(); - - protected abstract EquipmentType getEquipmentType(); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/BatteryByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/BatteryByFormulaModificationTest.java index 3fbb9a15a..ec29d041d 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/BatteryByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/BatteryByFormulaModificationTest.java @@ -9,18 +9,16 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.extensions.ActivePowerControl; import com.powsybl.iidm.network.extensions.ActivePowerControlAdder; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.equipmentfield.BatteryField; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; -import org.junit.jupiter.api.Test; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createBattery; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -37,23 +35,6 @@ class BatteryByFormulaModificationTest extends AbstractByFormulaModificationTest private static final String BATTERY_ID_5 = "battery5"; private static final String BATTERY_ID_6 = "battery6"; - @Test - void testCreateWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes = getIdentifiableAttributes(BATTERY_ID_1, 1.0); - IdentifierListFilterEquipmentAttributes wrongIdAttributes = getIdentifiableAttributes("wrongId", 1.0); - - FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(filterWithOneWrongId)) - .editedField(BatteryField.ACTIVE_POWER_SET_POINT.name()) - .fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build()) - .operator(Operator.ADDITION) - .fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build()) - .build(); - - checkCreateWithWarning(List.of(formulaInfos), List.of(identifiableAttributes, wrongIdAttributes)); - assertEquals(75, getNetwork().getBattery(BATTERY_ID_1).getTargetP(), 0); - } - @Override protected void createEquipments() { getNetwork().getBattery(BATTERY_ID_1).setTargetP(100).setMaxP(500).setMinP(0).setTargetQ(80); @@ -70,30 +51,17 @@ protected void createEquipments() { createBattery(getNetwork().getVoltageLevel("v6"), BATTERY_ID_6, "v6Battery6", 60, 200, 700, 250, 210); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(BATTERY_ID_1, BATTERY_ID_2), + FILTER_ID_2, Set.of(BATTERY_ID_3, BATTERY_ID_4), + FILTER_ID_3, Set.of(BATTERY_ID_5, BATTERY_ID_6), + FILTER_ID_4, Set.of(BATTERY_ID_1, BATTERY_ID_5), + FILTER_ID_5, Set.of(BATTERY_ID_2, BATTERY_ID_3) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_4, 5.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_5, 6.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_6, 7.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_5, 6.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.BATTERY) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(BATTERY_ID_2, 2.0), - new IdentifierListFilterEquipmentAttributes(BATTERY_ID_3, 3.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4, filter5); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java index b46fd28ec..3346bb957 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java @@ -9,20 +9,20 @@ import com.powsybl.iidm.network.Generator; import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.extensions.*; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.FilterInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.GeneratorField; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; +import org.gridsuite.modification.server.utils.FilterStub; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createGenerator; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -44,27 +44,9 @@ class GeneratorByFormulaModificationTest extends AbstractByFormulaModificationTe private static final String GENERATOR_ID_9 = "gen9"; private static final String GENERATOR_ID_10 = "gen10"; - @Test - void testCreateWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes = getIdentifiableAttributes(GENERATOR_ID_1, 1.0); - IdentifierListFilterEquipmentAttributes wrongIdAttributes = getIdentifiableAttributes("wrongId", 1.0); - - FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(filterWithOneWrongId)) - .editedField(GeneratorField.ACTIVE_POWER_SET_POINT.name()) - .fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build()) - .operator(Operator.ADDITION) - .fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build()) - .build(); - - checkCreateWithWarning(List.of(formulaInfos), List.of(identifiableAttributes, wrongIdAttributes)); - assertEquals(75, getNetwork().getGenerator(GENERATOR_ID_1).getTargetP(), 0); - } - @Test void testWithNullReferenceFieldOrValue() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes = getIdentifiableAttributes(GENERATOR_ID_1, 1.0); - AbstractFilter filterEquipments = getFilterEquipments(FILTER_ID_1, List.of(identifiableAttributes)); + FilterStub filterEquipments = createFilterStub(FILTER_ID_1, List.of(GENERATOR_ID_1)); FormulaInfos formulaInfos = FormulaInfos.builder() .filters(List.of(new FilterInfos(FILTER_ID_1, "filter1"))) @@ -141,30 +123,17 @@ protected void createEquipments() { getNetwork().getGenerator(GENERATOR_ID_10).setRatedS(30.); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(GENERATOR_ID_1, GENERATOR_ID_2), + FILTER_ID_2, Set.of(GENERATOR_ID_3, GENERATOR_ID_4), + FILTER_ID_3, Set.of(GENERATOR_ID_5, GENERATOR_ID_6), + FILTER_ID_4, Set.of(GENERATOR_ID_7, GENERATOR_ID_8), + FILTER_ID_5, Set.of(GENERATOR_ID_9, GENERATOR_ID_10) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_4, 5.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_5, 6.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_6, 7.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_7, 3.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_8, 8.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.GENERATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_9, 0.0), - new IdentifierListFilterEquipmentAttributes(GENERATOR_ID_10, 9.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4, filter5); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/LoadByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/LoadByFormulaModificationTest.java index 8bc7d4dab..cf4bdcc1c 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/LoadByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/LoadByFormulaModificationTest.java @@ -7,19 +7,17 @@ package org.gridsuite.modification.server.modifications.byfilter.formula; import com.powsybl.iidm.network.IdentifiableType; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.equipmentfield.LoadField; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; -import java.util.Date; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.modification.server.impacts.TestImpactUtils.createSubstationImpacts; @@ -43,18 +41,14 @@ protected void createEquipments() { createLoad(getNetwork().getVoltageLevel("v4"), LOAD_ID_4, "load4", 400, 50, 150, null, 5, null); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(LOAD_ID_1, LOAD_ID_2), + FILTER_ID_2, Set.of(LOAD_ID_3, LOAD_ID_4) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.LOAD) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(LOAD_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(LOAD_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.LOAD) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(LOAD_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(LOAD_ID_4, 5.0))) - .build(); - - return List.of(filter1, filter2); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/ShuntCompensatorByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/ShuntCompensatorByFormulaModificationTest.java index a4cfe29d6..5e9fd90a1 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/ShuntCompensatorByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/ShuntCompensatorByFormulaModificationTest.java @@ -10,18 +10,16 @@ import com.powsybl.iidm.network.ShuntCompensator; import com.powsybl.iidm.network.ShuntCompensatorLinearModel; import com.powsybl.iidm.network.extensions.ConnectablePosition; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.equipmentfield.ShuntCompensatorField; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; -import org.junit.jupiter.api.Test; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createShuntCompensator; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -34,23 +32,6 @@ class ShuntCompensatorByFormulaModificationTest extends AbstractByFormulaModific private static final String SHUNT_COMPENSATOR_ID_5 = "v5shunt"; private static final String SHUNT_COMPENSATOR_ID_6 = "v6shunt"; - @Test - void testCreateWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes = getIdentifiableAttributes(SHUNT_COMPENSATOR_ID_1, 1.0); - IdentifierListFilterEquipmentAttributes wrongIdAttributes = getIdentifiableAttributes("wrongId", 1.0); - - FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(filterWithOneWrongId)) - .editedField(ShuntCompensatorField.MAXIMUM_SECTION_COUNT.name()) - .fieldOrValue1(ReferenceFieldOrValue.builder().value(2.).build()) - .operator(Operator.ADDITION) - .fieldOrValue2(ReferenceFieldOrValue.builder().value(3.).build()) - .build(); - - checkCreateWithWarning(List.of(formulaInfos), List.of(identifiableAttributes, wrongIdAttributes)); - assertEquals(5, getNetwork().getShuntCompensator(SHUNT_COMPENSATOR_ID_1).getMaximumSectionCount(), 0); - } - @Override protected void createEquipments() { createShuntCompensator(getNetwork().getVoltageLevel("v1"), SHUNT_COMPENSATOR_ID_1, "v1shunt", 8, 225., 10, true, 4, 2, 3, 2, "cn11", 22, ConnectablePosition.Direction.BOTTOM); @@ -58,30 +39,17 @@ protected void createEquipments() { createShuntCompensator(getNetwork().getVoltageLevel("v4"), SHUNT_COMPENSATOR_ID_4, "v3shunt", 10, 305., 20, true, 15, 4, 3, 10, "cn11", 22, ConnectablePosition.Direction.BOTTOM); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(SHUNT_COMPENSATOR_ID_1, SHUNT_COMPENSATOR_ID_2), + FILTER_ID_2, Set.of(SHUNT_COMPENSATOR_ID_3, SHUNT_COMPENSATOR_ID_6), + FILTER_ID_3, Set.of(SHUNT_COMPENSATOR_ID_4, SHUNT_COMPENSATOR_ID_5), + FILTER_ID_4, Set.of(SHUNT_COMPENSATOR_ID_1, SHUNT_COMPENSATOR_ID_5), + FILTER_ID_5, Set.of(SHUNT_COMPENSATOR_ID_3, SHUNT_COMPENSATOR_ID_2) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_6, 7.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_5, 6.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_5, 6.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.SHUNT_COMPENSATOR) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(SHUNT_COMPENSATOR_ID_2, 2.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4, filter5); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java index 17c5e7c17..c970655e8 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/TwoWindingsTransformerByFormulaModificationTest.java @@ -1,23 +1,19 @@ package org.gridsuite.modification.server.modifications.byfilter.formula; -import com.github.tomakehurst.wiremock.client.WireMock; import com.powsybl.iidm.network.*; import com.powsybl.iidm.network.extensions.ConnectablePosition; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.ByFormulaModificationInfos; import org.gridsuite.modification.dto.byfilter.equipmentfield.TwoWindingsTransformerField; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; import org.gridsuite.modification.server.dto.NetworkModificationResult; +import org.gridsuite.modification.server.utils.FilterStub; import org.junit.jupiter.api.Test; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; import static org.gridsuite.modification.server.utils.NetworkUtil.createTwoWindingsTransformer; import static org.junit.jupiter.api.Assertions.*; @@ -31,52 +27,56 @@ class TwoWindingsTransformerByFormulaModificationTest extends AbstractByFormulaM private static final String TWT_ID_6 = "twt6"; @Test - void testModifyTwtWithError() throws Exception { - // Test modifying ratio tab changer field when ratio tab changer is null - IdentifierListFilterEquipmentAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_4, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_6, 1.); - AbstractFilter filter = getFilterEquipments(FILTER_ID_4, List.of(identifiableAttributes1, identifiableAttributes2)); + void testModificationNotAppliedOnPhaseTapIfNotPresent() throws Exception { + FilterStub filterTwt1 = createFilterStub(FILTER_ID_1, List.of(TWT_ID_1, TWT_ID_2)); + FilterStub filterTwt2 = createFilterStub(FILTER_ID_4, List.of(TWT_ID_4, TWT_ID_6)); + FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(filter4)) - .fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()).build()) + .filters(List.of(filter1, filter4)) + .fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build()) .fieldOrValue1(ReferenceFieldOrValue.builder().value(1.).build()) - .editedField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()) + .editedField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()) .operator(Operator.ADDITION) .build(); - checkCreateWithError(List.of(formulaInfos), List.of(filter)); + checkCreateWithStatus(List.of(formulaInfos), List.of(filterTwt1, filterTwt2), NetworkModificationResult.ApplicationStatus.WITH_WARNINGS); - assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger()); - assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); + assertNotNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getPhaseTapChanger()); + assertNotNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getPhaseTapChanger()); + assertEquals(3, getNetwork().getTwoWindingsTransformer(TWT_ID_4).getPhaseTapChanger().getTapPosition()); + assertEquals(2, getNetwork().getTwoWindingsTransformer(TWT_ID_6).getPhaseTapChanger().getTapPosition()); + assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_1).getPhaseTapChanger()); + assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_2).getPhaseTapChanger()); + } - // Test modifying phase tab changer field when phase tab changer is null - IdentifierListFilterEquipmentAttributes identifiableAttributes3 = getIdentifiableAttributes(TWT_ID_1, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes4 = getIdentifiableAttributes(TWT_ID_2, 1.); - AbstractFilter filter2 = getFilterEquipments(FILTER_ID_1, List.of(identifiableAttributes3, identifiableAttributes4)); - FormulaInfos formulaInfos2 = FormulaInfos.builder() - .filters(List.of(filter1)) - .fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build()) + @Test + void testModificationNotAppliedOnRatioTapIfNotPresent() throws Exception { + FilterStub filterTwt1 = createFilterStub(FILTER_ID_1, List.of(TWT_ID_1, TWT_ID_2)); + FilterStub filterTwt2 = createFilterStub(FILTER_ID_4, List.of(TWT_ID_4, TWT_ID_6)); + + FormulaInfos formulaInfos = FormulaInfos.builder() + .filters(List.of(filter1, filter4)) + .fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()).build()) .fieldOrValue1(ReferenceFieldOrValue.builder().value(1.).build()) - .editedField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()) + .editedField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()) .operator(Operator.ADDITION) .build(); - checkCreateWithError(List.of(formulaInfos2), List.of(filter2)); + checkCreateWithStatus(List.of(formulaInfos), List.of(filterTwt1, filterTwt2), NetworkModificationResult.ApplicationStatus.WITH_WARNINGS); - assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_1).getPhaseTapChanger()); - assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_2).getPhaseTapChanger()); + assertNotNull(getNetwork().getTwoWindingsTransformer(TWT_ID_1).getRatioTapChanger()); + assertNotNull(getNetwork().getTwoWindingsTransformer(TWT_ID_2).getRatioTapChanger()); + assertEquals(2, getNetwork().getTwoWindingsTransformer(TWT_ID_1).getRatioTapChanger().getTapPosition()); + assertEquals(5, getNetwork().getTwoWindingsTransformer(TWT_ID_2).getRatioTapChanger().getTapPosition()); + assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger()); + assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); } @Test void testDivisionByZero() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_4, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_6, 1.); - AbstractFilter filter = getFilterEquipments(FILTER_ID_4, List.of(identifiableAttributes1, identifiableAttributes2)); + FilterStub filter = createFilterStub(FILTER_ID_4, List.of(TWT_ID_4, TWT_ID_6)); - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + FILTER_ID_4)) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filter))) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + UUID stubId = stubStandaloneFilters(List.of(filter)); // Test division by 0 FormulaInfos formulaInfos2 = FormulaInfos.builder() @@ -90,22 +90,15 @@ void testDivisionByZero() throws Exception { checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfos2)).build(), NetworkModificationResult.ApplicationStatus.WITH_ERRORS); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(List.of(FILTER_ID_4)), false); + verifyStandaloneFiltersRequest(stubId, Set.of(FILTER_ID_4)); } @Test void testModifyTwtWithWarning() throws Exception { - IdentifierListFilterEquipmentAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_1, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_2, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes3 = getIdentifiableAttributes(TWT_ID_4, 1.); - IdentifierListFilterEquipmentAttributes identifiableAttributes4 = getIdentifiableAttributes(TWT_ID_6, 1.); - AbstractFilter filterTwt1 = getFilterEquipments(FILTER_ID_1, List.of(identifiableAttributes1, identifiableAttributes2)); - AbstractFilter filterTwt2 = getFilterEquipments(FILTER_ID_4, List.of(identifiableAttributes3, identifiableAttributes4)); - - UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching(getPath(true) + ".{2,}")) - .willReturn(WireMock.ok() - .withBody(mapper.writeValueAsString(List.of(filterTwt1, filterTwt2))) - .withHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE))).getId(); + FilterStub filterTwt1 = createFilterStub(FILTER_ID_1, List.of(TWT_ID_1, TWT_ID_2)); + FilterStub filterTwt2 = createFilterStub(FILTER_ID_4, List.of(TWT_ID_4, TWT_ID_6)); + + UUID stubId = stubStandaloneFilters(List.of(filterTwt1, filterTwt2)); FormulaInfos formulaInfos = FormulaInfos.builder() .filters(List.of(filter1, filter4)) @@ -128,7 +121,7 @@ void testModifyTwtWithWarning() throws Exception { assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger()); assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger()); - wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(List.of(FILTER_ID_1, FILTER_ID_4)), false); + verifyStandaloneFiltersRequest(stubId, Set.of(FILTER_ID_1, FILTER_ID_4)); } @Override @@ -184,26 +177,16 @@ protected void createEquipments() { addPhaseTapChangerSteps(twt6.newPhaseTapChanger().setRegulationValue(47).setLowTapPosition(1).setTapPosition(1).setTargetDeadband(36)); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(TWT_ID_1, TWT_ID_2), + FILTER_ID_2, Set.of(TWT_ID_1, TWT_ID_3), + FILTER_ID_3, Set.of(TWT_ID_4, TWT_ID_5), + FILTER_ID_4, Set.of(TWT_ID_4, TWT_ID_6) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_3, 2.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_5, 6.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.TWO_WINDINGS_TRANSFORMER) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(TWT_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(TWT_ID_6, 7.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java index 335154cfc..23d8de0a4 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/VoltageLevelByFormulaModificationTest.java @@ -11,17 +11,16 @@ import com.powsybl.iidm.network.VoltageLevel; import com.powsybl.iidm.network.extensions.IdentifiableShortCircuit; import com.powsybl.iidm.network.extensions.IdentifiableShortCircuitAdder; -import org.gridsuite.filter.AbstractFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilter; -import org.gridsuite.filter.identifierlistfilter.IdentifierListFilterEquipmentAttributes; import org.gridsuite.filter.utils.EquipmentType; import org.gridsuite.modification.dto.byfilter.equipmentfield.VoltageLevelField; import org.gridsuite.modification.dto.byfilter.formula.FormulaInfos; -import org.gridsuite.modification.dto.byfilter.formula.Operator; -import org.gridsuite.modification.dto.byfilter.formula.ReferenceFieldOrValue; +import org.gridsuite.modification.modifications.data.assignment.Operator; +import org.gridsuite.modification.modifications.data.assignment.ReferenceFieldOrValue; -import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import static org.gridsuite.modification.modifications.byfilter.AbstractModificationByAssignment.*; import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessageWithoutRank; @@ -75,33 +74,18 @@ protected void createEquipments() { .setTopologyKind(TopologyKind.NODE_BREAKER).setNominalV(380.).add(); } + private static final Map> FILTER_MAPPING = Map.of( + FILTER_ID_1, Set.of(VOLTAGE_LEVEL_ID_1, VOLTAGE_LEVEL_ID_2), + FILTER_ID_2, Set.of(VOLTAGE_LEVEL_ID_3, VOLTAGE_LEVEL_ID_4), + FILTER_ID_3, Set.of(VOLTAGE_LEVEL_ID_5, VOLTAGE_LEVEL_ID_6), + FILTER_ID_4, Set.of(VOLTAGE_LEVEL_ID_2, VOLTAGE_LEVEL_ID_5), + FILTER_ID_5, Set.of(VOLTAGE_LEVEL_ID_4, VOLTAGE_LEVEL_ID_6), + FILTER_ID_6, Set.of(VOLTAGE_LEVEL_ID_7) + ); + @Override - protected List getTestFilters() { - IdentifierListFilter filter1 = IdentifierListFilter.builder().id(FILTER_ID_1).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_1, 1.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_2, 2.0))) - .build(); - IdentifierListFilter filter2 = IdentifierListFilter.builder().id(FILTER_ID_2).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_3, 2.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_4, 5.0))) - .build(); - IdentifierListFilter filter3 = IdentifierListFilter.builder().id(FILTER_ID_3).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_5, 6.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_6, 7.0))) - .build(); - IdentifierListFilter filter4 = IdentifierListFilter.builder().id(FILTER_ID_4).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_2, 2.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_5, 6.0))) - .build(); - IdentifierListFilter filter5 = IdentifierListFilter.builder().id(FILTER_ID_5).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_4, 5.0), - new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_6, 7.0))) - .build(); - IdentifierListFilter filter6 = IdentifierListFilter.builder().id(FILTER_ID_6).modificationDate(new Date()).equipmentType(EquipmentType.VOLTAGE_LEVEL) - .filterEquipmentsAttributes(List.of(new IdentifierListFilterEquipmentAttributes(VOLTAGE_LEVEL_ID_7, 5.0))) - .build(); - - return List.of(filter1, filter2, filter3, filter4, filter5, filter6); + protected Map> getFilterMapping() { + return FILTER_MAPPING; } @Override @@ -248,7 +232,6 @@ protected void assertAfterNetworkModificationCreation() { assertLogMessageWithoutRank("Cannot modify equipment v7 : At least one of the value or referenced field is missing", REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_MISSING, reportService); assertLogMessageWithoutRank("Cannot modify equipment v7 : The value or referenced field of the second operand in the division operator is zero", REPORT_KEY_EQUIPMENT_MODIFIED_ERROR_ZERO, reportService); - assertLogMessageWithoutRank("Some of the equipment have been modified : 14 equipment(s) modified and 5 equipment(s) not modified", REPORT_KEY_BY_FILTER_MODIFICATION_SOME, reportService); } @Override diff --git a/src/test/java/org/gridsuite/modification/server/utils/FilterStub.java b/src/test/java/org/gridsuite/modification/server/utils/FilterStub.java new file mode 100644 index 000000000..45d1edbdb --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/utils/FilterStub.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.modification.server.utils; + +import org.gridsuite.filter.wip.Filter; + +import java.util.UUID; + +/** + * @author Joris Mancini + */ +public record FilterStub(UUID id, Filter filter) { +} diff --git a/src/test/java/org/gridsuite/modification/server/utils/StubbedFilterRequest.java b/src/test/java/org/gridsuite/modification/server/utils/StubbedFilterRequest.java new file mode 100644 index 000000000..599909408 --- /dev/null +++ b/src/test/java/org/gridsuite/modification/server/utils/StubbedFilterRequest.java @@ -0,0 +1,17 @@ +/* + * 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.modification.server.utils; + +import java.util.Set; +import java.util.UUID; + +/** + * @author Joris Mancini + */ +public record StubbedFilterRequest(UUID stubId, Set filterIds, int requestCount) { +} diff --git a/src/test/java/org/gridsuite/modification/server/utils/WireMockUtils.java b/src/test/java/org/gridsuite/modification/server/utils/WireMockUtils.java index 2d42f7a53..9d44b5b00 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/WireMockUtils.java +++ b/src/test/java/org/gridsuite/modification/server/utils/WireMockUtils.java @@ -9,6 +9,7 @@ import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.admin.model.ServeEventQuery; import com.github.tomakehurst.wiremock.client.WireMock; +import com.github.tomakehurst.wiremock.matching.MultiValuePattern; import com.github.tomakehurst.wiremock.matching.RequestPatternBuilder; import com.github.tomakehurst.wiremock.matching.StringValuePattern; import com.github.tomakehurst.wiremock.stubbing.ServeEvent; @@ -38,6 +39,14 @@ public void verifyGetRequest(UUID stubId, String urlPath, Map serveEvents = wireMockServer.getServeEvents(ServeEventQuery.forStubMapping(stubId)).getServeEvents(); assertEquals(nbRequests, serveEvents.size());