diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataExportAdjuster.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataExportAdjuster.java new file mode 100644 index 0000000000000000000000000000000000000000..82c3c1524f283c4a02581b9520d2819d90bda4d3 --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataExportAdjuster.java @@ -0,0 +1,40 @@ +package de.ozgcloud.alfa.vorgang; + +import java.util.HashMap; +import java.util.Map; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +class FormDataExportAdjuster { + + static final String VALUE_KEY = "value"; + + public static Map<String, Object> adjustFormDataForExport(Map<String, Object> formData) { + return replaceValueKeys(formData); + } + + static Map<String, Object> replaceValueKeys(Map<String, Object> formData) { + Map<String, Object> result = new HashMap<>(); + for (var entry : formData.entrySet()) { + result.put(entry.getKey(), replaceValueKeysInValue(entry.getValue())); + } + return result; + } + + @SuppressWarnings("unchecked") + private static Object replaceValueKeysInValue(Object value) { + if (!(value instanceof Map)) { + return value; + } + Map<String, Object> formData = (Map<String, Object>) value; + return containsValueKeyOnly(formData) ? + replaceValueKeysInValue(formData.get(VALUE_KEY)) : + replaceValueKeys(formData); + } + + private static boolean containsValueKeyOnly(Map<String, Object> formData) { + return formData.containsKey(VALUE_KEY) && formData.size() == 1; + } +} diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java index f1d47e4de25f507e3897f69927c117a8edd90fd3..8ab2e778ed10968019b8c1dc67d9a9f0586692c8 100644 --- a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataMapper.java @@ -32,6 +32,7 @@ class FormDataMapper { public Antragsdaten toAntragsdaten(@NotNull VorgangWithEingang vorgang) { return Optional.ofNullable(vorgang.getEingang()) .map(Eingang::getFormData) + .map(FormDataExportAdjuster::adjustFormDataForExport) .map(this::buildAntragsdaten) .orElseGet(Antragsdaten::new); } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataExportAdjusterTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataExportAdjusterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..4dd12aab91f9e6e84ca5622c1a34a67ea827a6e1 --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataExportAdjusterTest.java @@ -0,0 +1,73 @@ +package de.ozgcloud.alfa.vorgang; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.Map; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; + +public class FormDataExportAdjusterTest { + + @Nested + class TestAdjustFormDataForExport { + + private final Map<String, Object> formData = Map.of("key", "value"); + + @Test + void shouldCallReplaceValueKeys() { + try (MockedStatic<FormDataExportAdjuster> adjusterMock = mockStatic(FormDataExportAdjuster.class)) { + adjusterMock.when(() -> FormDataExportAdjuster.adjustFormDataForExport(any())).thenCallRealMethod(); + + FormDataExportAdjuster.adjustFormDataForExport(formData); + + adjusterMock.verify(() -> FormDataExportAdjuster.replaceValueKeys(formData)); + } + } + } + + @Nested + class TestReplaceValueKeys { + + @Test + void shouldPreserveValueKeyWithoutParent() { + Map<String, Object> formData = Map.of("value", "Kiel"); + + var formDataWithoutValueKeys = FormDataExportAdjuster.replaceValueKeys(formData); + + assertThat(formDataWithoutValueKeys).isEqualTo(formData); + } + + @Test + void shouldEliminateValueKeyWithoutSiblings() { + Map<String, Object> formData = Map.of("ort", Map.of("value", "Kiel")); + Map<String, Object> expected = Map.of("ort", "Kiel"); + + var formDataWithoutValueKeys = FormDataExportAdjuster.replaceValueKeys(formData); + + assertThat(formDataWithoutValueKeys).isEqualTo(expected); + } + + @Test + void shouldPreserveValueKeyIfHasSiblings() { + Map<String, Object> formData = Map.of("ort", Map.of("value", "Kiel", "value2", "Kiel")); + + var formDataWithoutValueKeys = FormDataExportAdjuster.replaceValueKeys(formData); + + assertThat(formDataWithoutValueKeys).isEqualTo(formData); + } + + @Test + void shouldPreserveNonValueKeys() { + Map<String, Object> formData = Map.of("empfangendestelle", + Map.of("value", Map.of("OrganisationseinheitenAuswahl", Map.of("value", "123456")))); + Map<String, Object> expected = Map.of("empfangendestelle", Map.of("OrganisationseinheitenAuswahl", "123456")); + + var formDataWithoutValueKeys = FormDataExportAdjuster.replaceValueKeys(formData); + + assertThat(formDataWithoutValueKeys).isEqualTo(expected); + } + } +} diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java index fd5111ad3b4d71b1b3dcdc92de8c5e5bae08ddd0..43cd844e02dc23f896233c235ff48fca4e6b00d0 100644 --- a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataMapperTest.java @@ -8,12 +8,14 @@ import java.time.ZonedDateTime; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.UUID; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Spy; import de.ozgcloud.alfa.common.DateConverter; @@ -42,13 +44,17 @@ class FormDataMapperTest { private VorgangWithEingang vorgang; @Test - void shouldCallBuildItemType() { - doReturn(new Object()).when(formDataMapper).formatValue(any(), any()); - var vorgang = VorgangWithEingangTestFactory.create(); + void shouldCallBuildAntragsdaten() { + try (MockedStatic<FormDataExportAdjuster> valueKeysRemover = mockStatic(FormDataExportAdjuster.class)) { + var vorgang = VorgangWithEingangTestFactory.create(); + Map<String, Object> formDataWithoutValueKeys = Map.of(UUID.randomUUID().toString(), "value1"); + valueKeysRemover.when(() -> FormDataExportAdjuster.adjustFormDataForExport(any())).thenReturn(formDataWithoutValueKeys); + doReturn(new Object()).when(formDataMapper).formatValue(any(), any()); - formDataMapper.toAntragsdaten(vorgang); + formDataMapper.toAntragsdaten(vorgang); - verify(formDataMapper).buildAntragsdaten(vorgang.getEingang().getFormData()); + verify(formDataMapper).buildAntragsdaten(formDataWithoutValueKeys); + } } @Test