From 2c85ec003285c8ece936d4a95cd082f0f46922a4 Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Tue, 23 Jan 2024 18:16:32 +0100 Subject: [PATCH] OZG-4375 OZG-4790 Remove value-groups --- .../alfa/vorgang/FormDataFlattener.java | 36 ++++++++++ .../ozgcloud/alfa/vorgang/FormDataMapper.java | 5 +- .../alfa/vorgang/FormDataFlattenerTest.java | 71 +++++++++++++++++++ .../alfa/vorgang/FormDataMapperTest.java | 16 +++-- 4 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataFlattener.java create mode 100644 alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataFlattenerTest.java diff --git a/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataFlattener.java b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataFlattener.java new file mode 100644 index 0000000000..1d49b8440a --- /dev/null +++ b/alfa-xdomea/src/main/java/de/ozgcloud/alfa/vorgang/FormDataFlattener.java @@ -0,0 +1,36 @@ +package de.ozgcloud.alfa.vorgang; + +import java.util.HashMap; +import java.util.Map; + +class FormDataFlattener { + + static final String VALUE_KEY = "value"; + + public static Map<String, Object> flatten(Map<String, Object> formData) { + return getDataWithoutValueKeys(formData); + } + + private static Map<String, Object> getDataWithoutValueKeys(Map<String, Object> data) { + Map<String, Object> result = new HashMap<>(); + for (var entry : data.entrySet()) { + result.put(entry.getKey(), getDataWithoutValueKey(entry.getValue())); + } + return result; + } + + @SuppressWarnings("unchecked") + private static Object getDataWithoutValueKey(Object data) { + if (!(data instanceof Map)) { + return data; + } + Map<String, Object> formData = (Map<String, Object>) data; + return containsValueKeyAsSingleEntry(formData) ? + getDataWithoutValueKey(formData.get(VALUE_KEY)) : + getDataWithoutValueKeys(formData); + } + + private static boolean containsValueKeyAsSingleEntry(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 b32558d6c6..7c1af10f8e 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 @@ -30,7 +30,10 @@ class FormDataMapper { private DateConverter dateConverter; public Antragsdaten toAntragsdaten(@NotNull VorgangWithEingang vorgang) { - return Optional.ofNullable(vorgang.getEingang()).map(Eingang::getFormData).map(this::buildAntragsdaten) + return Optional.ofNullable(vorgang.getEingang()) + .map(Eingang::getFormData) + .map(FormDataFlattener::flatten) + .map(this::buildAntragsdaten) .orElseGet(Antragsdaten::new); } diff --git a/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataFlattenerTest.java b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataFlattenerTest.java new file mode 100644 index 0000000000..a9f067504d --- /dev/null +++ b/alfa-xdomea/src/test/java/de/ozgcloud/alfa/vorgang/FormDataFlattenerTest.java @@ -0,0 +1,71 @@ +package de.ozgcloud.alfa.vorgang; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Map; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +public class FormDataFlattenerTest { + + @Nested + class TestFlatten { + + @Test + void shouldPreserveValueKeyWithoutParent() { + Map<String, Object> formData = Map.of("value", "Kiel"); + + var flattened = FormDataFlattener.flatten(formData); + + assertThat(flattened).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 flattened = FormDataFlattener.flatten(formData); + + assertThat(flattened).isEqualTo(expected); + } + + @Test + void shouldPreserveValueKeyIfHasSiblings() { + Map<String, Object> formData = Map.of("ort", Map.of("value", "Kiel", "value2", "Kiel")); + + var flattened = FormDataFlattener.flatten(formData); + + assertThat(flattened).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 flattened = FormDataFlattener.flatten(formData); + + assertThat(flattened).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 fd5111ad3b..cb17aaabc7 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<FormDataFlattener> formDataFlattener = mockStatic(FormDataFlattener.class)) { + var vorgang = VorgangWithEingangTestFactory.create(); + Map<String, Object> flattenedFormData = Map.of(UUID.randomUUID().toString(), "value1"); + formDataFlattener.when(() -> FormDataFlattener.flatten(any())).thenReturn(flattenedFormData); + doReturn(new Object()).when(formDataMapper).formatValue(any(), any()); - formDataMapper.toAntragsdaten(vorgang); + formDataMapper.toAntragsdaten(vorgang); - verify(formDataMapper).buildAntragsdaten(vorgang.getEingang().getFormData()); + verify(formDataMapper).buildAntragsdaten(flattenedFormData); + } } @Test -- GitLab