diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java index b3e75f0cd900dd24d9095c7953939ae450d5db5c..592fea25bbffbe37a4ac7bc4896ddd8086ad0816 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapter.java @@ -35,6 +35,9 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema private static final String KEY_FACHNACHRICHT = "Fachnachricht"; private static final String KEY_POSTFACH_ID = "InboxReference"; private static final String KEY_ORGANISATIONS_EINHEIT_ID = "MetaText1"; + private static final String KEY_FORM_NAME = "Title"; + + static final String DEFAULT_FORM_NAME = "dFördermittelantrag: Ohne Titel"; @Autowired private ServiceKontoFactory serviceKontoFactory; @@ -48,9 +51,7 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema } FormData processFachnachricht(FormData formData) { - @SuppressWarnings("unchecked") - Map<String, Object> fachnachricht = (Map<String, Object>) MapUtils.getMap(formData.getFormData(), KEY_FACHNACHRICHT, - Collections.<String, Object>emptyMap()); + Map<String, Object> fachnachricht = getFachnachricht(formData); var extendedFormData = addFormName(formData); extendedFormData = addFormEngineName(extendedFormData); @@ -58,6 +59,7 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema return addOrganisationsEinheitId(extendedFormData, fachnachricht); } + FormData addServiceKonto(FormData formData, Map<String, Object> fachnachricht) { return Optional.ofNullable((String) fachnachricht.get(KEY_POSTFACH_ID)) .map(this::extractPrefix) @@ -88,12 +90,20 @@ public class DFoerdermittelEngineBasedSemantikAdapter implements EngineBasedSema FormData addFormName(FormData formData) { return formData.toBuilder() .header(formData.getHeader().toBuilder() - // TODO replace formName with actual name <Title> from Fachnachricht (KOP-2239) - .formName("dFördermittelantrag") + .formName(getFormName(formData).orElse(DEFAULT_FORM_NAME)) .build() ) .build(); } + private Optional<String> getFormName(FormData formData) { + return Optional.ofNullable((String) getFachnachricht(formData).get(KEY_FORM_NAME)) + .filter(StringUtils::isNotBlank); + } + + @SuppressWarnings("unchecked") + private Map<String, Object> getFachnachricht(FormData formData) { + return (Map<String, Object>) MapUtils.getMap(formData.getFormData(), KEY_FACHNACHRICHT, Collections.<String, Object>emptyMap()); + } FormData addFormEngineName(FormData formData) { return formData.toBuilder() diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java index 05473793842bc54d734988d7cf1ad872d5789b7a..8f3bcec4c6ac8eb48984b6f40c38fca0473d5fe5 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelEngineBasedSemantikAdapterTest.java @@ -1,5 +1,7 @@ package de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel; +import static de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel.DFoerdermittelEngineBasedSemantikAdapter.*; +import static de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel.DFoerdermittelFormDataTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.InstanceOfAssertFactories.*; import static org.mockito.ArgumentMatchers.*; @@ -9,6 +11,7 @@ import java.util.Collections; import java.util.Map; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -220,18 +223,39 @@ class DFoerdermittelEngineBasedSemantikAdapterTest { DFoerdermittelFormDataTestFactory.createFachnachrichtMap()); assertThat(formData.getZustaendigeStelle()).isNotNull().extracting(ZustaendigeStelle::getOrganisationseinheitenId) - .isEqualTo(DFoerdermittelFormDataTestFactory.ORGANISATIONS_EINHEIT_ID); + .isEqualTo(ORGANISATIONS_EINHEIT_ID); } } @Nested class TestAddFormName { + @DisplayName("should have form name from title") @Test - void shouldHaveFormName() { - var formData = adapter.addFormName(DFoerdermittelFormDataTestFactory.create()); + void shouldHaveFormNameFromTitle() { + var formData = adapter.addFormName(createFormDataWithTitle(FORM_NAME)); - assertThat(formData.getHeader().getFormName()).isEqualTo("dFördermittelantrag"); + assertThat(formData.getHeader().getFormName()).isEqualTo(FORM_NAME); + } + + @DisplayName("should have default form name for empty title") + @Test + void shouldHaveDefaultFormNameForEmptyTitle() { + var formData = adapter.addFormName(createFormDataWithTitle("")); + + assertThat(formData.getHeader().getFormName()).isEqualTo(DEFAULT_FORM_NAME); + } + + @DisplayName("should have default form name for missing title") + @Test + void shouldHaveDefaultFormNameForMissingTitle() { + var formData = adapter.addFormName(createFormDataWithTitle(null)); + + assertThat(formData.getHeader().getFormName()).isEqualTo(DEFAULT_FORM_NAME); + } + + FormData createFormDataWithTitle(String title) { + return createFachnachrichtBuilder().title(title).build().createFormData(); } } diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java index b99c66e48559d39b5c58e747c145a58dc0490363..969f4a635ed892e59106591f73d945b27f0b40be 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/dfoerdermittel/DFoerdermittelFormDataTestFactory.java @@ -1,25 +1,69 @@ package de.ozgcloud.eingang.semantik.enginebased.dfoerdermittel; +import static java.util.stream.Collectors.*; + import java.util.Map; +import java.util.Objects; +import java.util.function.Predicate; +import java.util.stream.IntStream; import de.ozgcloud.eingang.common.formdata.FormData; +import lombok.Builder; class DFoerdermittelFormDataTestFactory { + static final String FORM_NAME = "Name of form"; static final String POSTFACH_ID = "4dd01647-b9d9-4775-1b50-08da3d83800a"; static final String ORGANISATIONS_EINHEIT_ID = "9795669"; + static Fachnachricht.FachnachrichtBuilder createFachnachrichtBuilder() { + return Fachnachricht.builder() + .title(FORM_NAME) + .postfachId(POSTFACH_ID) + .organisationsEinheitId(ORGANISATIONS_EINHEIT_ID); + } + static FormData create() { return createBuilder().build(); } static FormData.FormDataBuilder createBuilder() { + return createBuilderWithFachnachricht(createFachnachrichtBuilder().build()); + } + + static FormData.FormDataBuilder createBuilderWithFachnachricht(Fachnachricht fachnachricht) { return FormData.builder() - .formData(Map.of("Fachnachricht", createFachnachrichtMap())); + .formData(Map.of("Fachnachricht", createFachnachrichtMapWithFachnachricht(fachnachricht))); } static Map<String, Object> createFachnachrichtMap() { - return Map.of("InboxReference", "sh/sh/4dd01647-b9d9-4775-1b50-08da3d83800a", - "MetaText1", ORGANISATIONS_EINHEIT_ID); + return createFachnachrichtMapWithFachnachricht(createFachnachrichtBuilder().build()); + } + + static Map<String, Object> createFachnachrichtMapWithFachnachricht(Fachnachricht fachnachricht) { + return createMapWithValueFilter( + Objects::nonNull, + "Title", fachnachricht.title(), + "InboxReference", "sh/sh/" + fachnachricht.postfachId(), + "MetaText1", fachnachricht.organisationsEinheitId() + ); + } + + private static Map<String, Object> createMapWithValueFilter(Predicate<String> valuePredicate, String... keyValuePairs) { + if (keyValuePairs.length % 2 != 0) { + throw new IllegalArgumentException("Array length must be even to form key-value pairs."); + } + + return IntStream.range(0, keyValuePairs.length / 2) + .boxed() + .filter(i -> valuePredicate.test(keyValuePairs[2 * i + 1])) + .collect(toMap(i -> keyValuePairs[2 * i], i -> keyValuePairs[2 * i + 1])); + } + + @Builder + record Fachnachricht(String title, String postfachId, String organisationsEinheitId) { + FormData createFormData() { + return createBuilderWithFachnachricht(this).build(); + } } }