From f2c6f9db0036da11e5088a6952ea135c544f8b8a Mon Sep 17 00:00:00 2001 From: Florent MILLOT <75525996+flomillot@users.noreply.github.com> Date: Fri, 22 May 2026 12:41:36 +0200 Subject: [PATCH] fix: keep modification activation status unchanged on metadata update The activated flag was defaulted in the ModificationInfos DTO, so it was never null after deserialization. A metadata update that omitted the flag therefore always reactivated the modification (visible when renaming a deactivated composite modification). The flag is now defaulted to true at creation only. When it is not provided on a metadata update, the activation status is left unchanged. Co-Authored-By: Claude Opus 4.7 Signed-off-by: Florent MILLOT <75525996+flomillot@users.noreply.github.com> --- pom.xml | 2 +- .../server/entities/ModificationEntity.java | 3 ++- .../server/ModificationControllerTest.java | 20 +++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index f02220a8d..f9f640739 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ gridsuite org.gridsuite:network-modification-server - 0.83.0 + 0.84.0-SNAPSHOT diff --git a/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java index d0ef5ac5a..642f770d1 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/ModificationEntity.java @@ -93,7 +93,8 @@ protected ModificationEntity(ModificationInfos modificationInfos) { this.date = Instant.now().truncatedTo(ChronoUnit.MICROS); // Do not put this stashed status in assignAttributes, it's not part of a network modification as such. this.stashed = modificationInfos.getStashed(); - this.activated = modificationInfos.getActivated(); + // On creation, default a missing activation flag to true (a null value otherwise means "leave status unchanged" on update) + this.activated = modificationInfos.getActivated() != null ? modificationInfos.getActivated() : true; assignAttributes(modificationInfos); } diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 26f6a81d7..ecc85e483 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -471,6 +471,26 @@ void updateModificationDescription() throws Exception { assertEquals("new description", modificationRepository.getModifications(TEST_GROUP_ID, true, true).getFirst().getDescription()); } + @Test + void updateModificationMetadataDoesNotModifyFieldsNotProvided() { + // create a composite modification and set all its metadata fields + UUID compositeUuid = modificationRepository.createNetworkCompositeModification(List.of()); + modificationRepository.updateNetworkModificationMetadata(List.of(compositeUuid), CompositeModificationInfos.builder() + .name("composite name") + .description("composite description") + .activated(false) + .build()); + + // update the metadata again without providing any field + modificationRepository.updateNetworkModificationMetadata(List.of(compositeUuid), CompositeModificationInfos.builder().build()); + + // every field not provided must keep its previous value + CompositeModificationInfos result = (CompositeModificationInfos) modificationRepository.getModificationInfo(compositeUuid); + assertEquals("composite name", result.getName()); + assertEquals("composite description", result.getDescription()); + assertEquals(false, result.getActivated()); + } + @Test void testDeleteModification() throws Exception { MvcResult mvcResult;