Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix by formula modification report #418

Merged
merged 10 commits into from
Jan 26, 2024
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ private void applyFormulaOnFilterEquipments(Network network,
.stream()
.map(attributes -> network.getIdentifiable(attributes.getId()))
.filter(identifiable -> {
boolean isEditableEquipment = isEquipmentEditable(identifiable, formulaInfos);
boolean isEditableEquipment = isEquipmentEditable(identifiable, formulaInfos, equipmentsReport);
if (!isEditableEquipment) {
notEditableEquipments.add(identifiable.getId());
equipmentNotModifiedCount += 1;
Expand Down Expand Up @@ -181,7 +181,7 @@ private void createFormulaReports(List<Report> formulaReports, FormulaInfos form
if (!CollectionUtils.isEmpty(notEditableEquipments)) {
formulaReports.add(Report.builder()
.withKey("NotEditedEquipmentsFilter_" + formulaReports.size())
.withDefaultMessage(String.format(" The following equipment were not modified : %s", String.join(", ", notEditableEquipments)))
.withDefaultMessage(String.format(" %s equipment(s) were not modified", notEditableEquipments.size()))
.withSeverity(TypedValue.WARN_SEVERITY)
.build());
}
Expand All @@ -205,7 +205,8 @@ private void createFormulaReports(List<Report> formulaReports, FormulaInfos form
}

private boolean isEquipmentEditable(Identifiable<?> identifiable,
FormulaInfos formulaInfos) {
FormulaInfos formulaInfos,
List<Report> equipmentsReport) {
if (formulaInfos.getEditedField() == null) {
return false;
}
Expand All @@ -214,8 +215,32 @@ private boolean isEquipmentEditable(Identifiable<?> identifiable,
TwoWindingsTransformerField editedField = TwoWindingsTransformerField.valueOf(formulaInfos.getEditedField());
TwoWindingsTransformer twoWindingsTransformer = (TwoWindingsTransformer) identifiable;
return switch (editedField) {
case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> twoWindingsTransformer.getRatioTapChanger() != null;
case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> twoWindingsTransformer.getPhaseTapChanger() != null;
case TARGET_V, RATIO_LOW_TAP_POSITION, RATIO_TAP_POSITION, RATIO_TARGET_DEADBAND -> {
boolean isEditable = twoWindingsTransformer.getRatioTapChanger() != null;
if (!isEditable) {
equipmentsReport.add(Report.builder()
.withKey("EquipmentModifiedReportError_" + equipmentsReport.size())
.withDefaultMessage(String.format(" Cannot modify field %s of equipment %s : Ratio tab changer is null",
editedField,
identifiable.getId()))
.withSeverity(TypedValue.TRACE_SEVERITY)
.build());
}
yield isEditable;
}
case REGULATION_VALUE, PHASE_LOW_TAP_POSITION, PHASE_TAP_POSITION, PHASE_TARGET_DEADBAND -> {
boolean isEditable = twoWindingsTransformer.getPhaseTapChanger() != null;
if (!isEditable) {
equipmentsReport.add(Report.builder()
.withKey("EquipmentModifiedReportError_" + equipmentsReport.size())
.withDefaultMessage(String.format(" Cannot modify field %s of equipment %s : Phase tab changer is null",
editedField,
identifiable.getId()))
.withSeverity(TypedValue.TRACE_SEVERITY)
.build());
}
yield isEditable;
}
default -> true;
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,27 @@ public void specificSetUp() {

@Test
public void testByModificationError() throws Exception {
//Test with modification = null
mockMvc.perform(post(getNetworkModificationUri()).content(mapper.writeValueAsString(null)).contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isBadRequest());

// Test with empty list of formulas
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of()).build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

// Test with empty list of filters in formula
FormulaInfos formulaInfos = FormulaInfos.builder()
List<FormulaInfos> formulaInfosWithNoFilters = getFormulaInfos().stream().peek(formula -> formula.setFilters(List.of())).toList();
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(formulaInfosWithNoFilters).build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

// Test with editedField = null
FormulaInfos formulaInfosWithNoEditedField = FormulaInfos.builder()
.fieldOrValue1(ReferenceFieldOrValue.builder().value(50.).build())
.fieldOrValue2(ReferenceFieldOrValue.builder().value(50.).build())
.operator(Operator.ADDITION)
.filters(List.of())
.build();
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfos)).build(),
checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfosWithNoEditedField)).build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);
}

Expand All @@ -105,9 +114,38 @@ protected void checkCreateWithWarning(List<FormulaInfos> formulaInfos, List<Iden
wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(getNetworkUuid(), List.of(FILTER_WITH_ONE_WRONG_ID)), false);
}

protected void checkCreateWithError(List<FormulaInfos> formulaInfos) throws Exception {
protected void checkCreateWithError(List<FormulaInfos> formulaInfos, List<FilterEquipments> filterEquipments) throws Exception {
String filterIds = filterEquipments.stream()
.map(FilterEquipments::getFilterId)
.map(UUID::toString)
.collect(Collectors.joining(","));

UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + filterIds))
.willReturn(WireMock.ok()
.withBody(mapper.writeValueAsString(filterEquipments))
.withHeader("Content-Type", "application/json"))).getId();

ByFormulaModificationInfos byFormulaModificationInfos = ByFormulaModificationInfos.builder()
.formulaInfosList(formulaInfos)
.identifiableType(getIdentifiableType())
.build();

checkCreationApplicationStatus(byFormulaModificationInfos, NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

wireMockUtils.verifyGetRequest(stubId,
PATH,
handleQueryParams(getNetworkUuid(), filterEquipments.stream().map(FilterEquipments::getFilterId).collect(Collectors.toList())),
false);
}

@Test
public void testModificationWithAllWrongEquipmentIds() throws Exception {
FilterEquipments filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId", List.of(), List.of("wrongId1", "wrongId2"));

List<FormulaInfos> 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/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + FILTER_WITH_ALL_WRONG_IDS))
.willReturn(WireMock.ok()
.withBody(mapper.writeValueAsString(List.of(filter)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,19 +52,6 @@ public void testCreateWithWarning() throws Exception {
assertEquals(75, getNetwork().getBattery(BATTERY_ID_1).getTargetP(), 0);
}

@Test
public void testCreateWithError() throws Exception {
FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filterWithAllWrongId))
.editedField(BatteryField.ACTIVE_POWER_SET_POINT.name())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build())
.operator(Operator.ADDITION)
.fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build())
.build();

checkCreateWithError(List.of(formulaInfos));
}

@Override
protected void createEquipments() {
getNetwork().getBattery(BATTERY_ID_1).setTargetP(100).setMaxP(500).setMinP(0).setTargetQ(80);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import com.powsybl.iidm.network.extensions.GeneratorStartup;
import com.powsybl.iidm.network.extensions.GeneratorStartupAdder;
import org.gridsuite.modification.server.dto.FilterEquipments;
import org.gridsuite.modification.server.dto.FilterInfos;
import org.gridsuite.modification.server.dto.IdentifiableAttributes;
import org.gridsuite.modification.server.dto.formula.FormulaInfos;
import org.gridsuite.modification.server.dto.formula.Operator;
Expand Down Expand Up @@ -67,16 +68,19 @@ public void testCreateWithWarning() throws Exception {
}

@Test
public void testCreateWithError() throws Exception {
public void testWithNullReferenceFieldOrValue() throws Exception {
IdentifiableAttributes identifiableAttributes = getIdentifiableAttributes(GENERATOR_ID_1, 1.0);
FilterEquipments filterEquipments = getFilterEquipments(FILTER_ID_1, "filter1", List.of(identifiableAttributes), List.of());

FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filterWithAllWrongId))
.filters(List.of(new FilterInfos(FILTER_ID_1, "filter1")))
.editedField(GeneratorField.ACTIVE_POWER_SET_POINT.name())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build())
.operator(Operator.ADDITION)
.fieldOrValue2(ReferenceFieldOrValue.builder().value(20.).build())
.fieldOrValue2(ReferenceFieldOrValue.builder().build())
.build();

checkCreateWithError(List.of(formulaInfos));
checkCreateWithError(List.of(formulaInfos), List.of(filterEquipments));
}

protected void createEquipments() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,19 +48,6 @@ public void testCreateWithWarning() throws Exception {
assertEquals(5, getNetwork().getShuntCompensator(SHUNT_COMPENSATOR_ID_1).getMaximumSectionCount(), 0);
}

@Test
public void testCreateWithError() throws Exception {
FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filterWithAllWrongId))
.editedField(ShuntCompensatorField.MAXIMUM_SECTION_COUNT.name())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(2.).build())
.operator(Operator.ADDITION)
.fieldOrValue2(ReferenceFieldOrValue.builder().value(3.).build())
.build();

checkCreateWithError(List.of(formulaInfos));
}

@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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,31 +37,39 @@ public class TwoWindingsTransformerByFormulaModificationTest extends AbstractByF

@Test
public void testModifyTwtWithError() throws Exception {
// Test modifying ratio tab changer field when ratio tab changer is null
IdentifiableAttributes identifiableAttributes1 = getIdentifiableAttributes(TWT_ID_4, 1.);
IdentifiableAttributes identifiableAttributes2 = getIdentifiableAttributes(TWT_ID_6, 1.);
FilterEquipments filter = getFilterEquipments(FILTER_ID_4, "filter4", List.of(identifiableAttributes1, identifiableAttributes2), List.of());

UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/export\\?networkUuid=" + getNetworkUuid() + "&variantId=variant_1&ids=" + FILTER_ID_4))
.willReturn(WireMock.ok()
.withBody(mapper.writeValueAsString(List.of(filter)))
.withHeader("Content-Type", "application/json"))).getId();
FormulaInfos formulaInfos = FormulaInfos.builder()
.filters(List.of(filter4))
.fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name()).build())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(1.).build())
.editedField(TwoWindingsTransformerField.RATIO_TAP_POSITION.name())
.operator(Operator.ADDITION)
.build();
checkCreationApplicationStatus(ByFormulaModificationInfos.builder()
.identifiableType(getIdentifiableType())
.formulaInfosList(List.of(formulaInfos))
.build(),
NetworkModificationResult.ApplicationStatus.WITH_ERRORS);

checkCreateWithError(List.of(formulaInfos), List.of(filter));

assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_4).getRatioTapChanger());
assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_6).getRatioTapChanger());

wireMockUtils.verifyGetRequest(stubId, PATH, handleQueryParams(getNetworkUuid(), List.of(FILTER_ID_4)), false);
// Test modifying phase tab changer field when phase tab changer is null
IdentifiableAttributes identifiableAttributes3 = getIdentifiableAttributes(TWT_ID_1, 1.);
IdentifiableAttributes identifiableAttributes4 = getIdentifiableAttributes(TWT_ID_2, 1.);
FilterEquipments filter2 = getFilterEquipments(FILTER_ID_1, "filter1", List.of(identifiableAttributes3, identifiableAttributes4), List.of());
FormulaInfos formulaInfos2 = FormulaInfos.builder()
.filters(List.of(filter1))
.fieldOrValue2(ReferenceFieldOrValue.builder().equipmentField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name()).build())
.fieldOrValue1(ReferenceFieldOrValue.builder().value(1.).build())
.editedField(TwoWindingsTransformerField.PHASE_TAP_POSITION.name())
.operator(Operator.ADDITION)
.build();

checkCreateWithError(List.of(formulaInfos2), List.of(filter2));

assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_1).getPhaseTapChanger());
assertNull(getNetwork().getTwoWindingsTransformer(TWT_ID_2).getPhaseTapChanger());
}

@Test
Expand All @@ -81,6 +89,7 @@ public void testDivisionByZero() throws Exception {
.fieldOrValue2(ReferenceFieldOrValue.builder().value(0.).build())
.operator(Operator.DIVISION)
.filters(List.of(filter4))
.editedField(TwoWindingsTransformerField.SERIES_RESISTANCE.name())
.build();

checkCreationApplicationStatus(ByFormulaModificationInfos.builder().identifiableType(getIdentifiableType()).formulaInfosList(List.of(formulaInfos2)).build(),
Expand Down
Loading