diff --git a/common/src/test/java/de/ozgcloud/eingang/common/formdata/AntragstellerTestFactory.java b/common/src/test/java/de/ozgcloud/eingang/common/formdata/AntragstellerTestFactory.java index ce9d59c38cf6f5ee88d9c8fc40c150001bebbc0a..c3f5320bc928490b407bf0ff8a83b192566eb0d7 100644 --- a/common/src/test/java/de/ozgcloud/eingang/common/formdata/AntragstellerTestFactory.java +++ b/common/src/test/java/de/ozgcloud/eingang/common/formdata/AntragstellerTestFactory.java @@ -43,6 +43,10 @@ public class AntragstellerTestFactory { public static final String GEBURTSDATUM = "30.8.1955"; public static final String GEBURTSORT = "Mülheim an der Ruhr"; public static final String EMAIL = "schneider@helgeschneider.local"; + public static final String STRASSE = "Musterstraße"; + public static final String HAUSNUMMER = "1"; + public static final String PLZ = "12345"; + public static final String ORT = "Musterstadt"; public static final String TELEFON = "+ 0176 888 666 222XX"; public static final String POSTFACH_ID = UUID.randomUUID().toString(); @@ -60,6 +64,10 @@ public class AntragstellerTestFactory { .geburtsort(GEBURTSORT) .email(EMAIL) .telefon(TELEFON) + .strasse(STRASSE) + .hausnummer(HAUSNUMMER) + .plz(PLZ) + .ort(ORT) .postfachId(POSTFACH_ID) .data(Map.of(GEBIET_BEZEICHNUNG_KEY, GEBIET_BEZEICHNUNG_VALUE, SUB_PERSOENLICHE_EIGNUNG, diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapter.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapter.java index 1c2264615d5851c927cfa44cf07f7f7e81d37cf6..c56f0c00d098e2af63872caaf178f348bc3ca9b5 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapter.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapter.java @@ -23,14 +23,25 @@ */ package de.ozgcloud.eingang.semantik.enginebased.formcycle; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; + import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; public class FormCycleEngineBasedAdapter implements EngineBasedSemantikAdapter { + @Autowired + private List<FormcycleEngineBasedMapper> mappers; + @Override public FormData parseFormData(FormData formData) { - return formData; + var processed = formData; + for (var mapper : mappers) { + processed = mapper.parseFormData(processed); + } + return processed; } } diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..a8d133be63359eca9db5d610c01f4bfd144f1a96 --- /dev/null +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapper.java @@ -0,0 +1,62 @@ +package de.ozgcloud.eingang.semantik.enginebased.formcycle; + +import java.util.Map; +import java.util.Optional; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import de.ozgcloud.eingang.common.formdata.Antragsteller; +import de.ozgcloud.eingang.common.formdata.FormData; + +@Component +public class FormcycleAntragstellerMapper implements FormcycleEngineBasedMapper { + + static final String KEY_ANTRAGSTELLER = "fsBKAllDaten"; + static final String KEY_ANREDE = "tfAntragstellerAnrede"; + static final String KEY_VORNAME = "tfAntragstellerVorname"; + static final String KEY_NACHNAME = "tfAntragstellerName"; + static final String KEY_GEBURTSNAME = "tfAntragstellerGeburtsname"; + static final String KEY_GEBURTSDATUM = "tfAntragstellerGeburtsdatum"; + static final String KEY_GEBURTSORT = "tfAntragstellerGeburtsort"; + static final String KEY_EMAIL = "tfAntragstellerEmail"; + static final String KEY_TELEFON = "tfAntragstellerTelefon"; + static final String KEY_ADDRESS = "tfAntragstellerAdresse"; + static final String KEY_PLZ = "tfAntragstellerPLZ"; + static final String KEY_ORT = "tfAntragstellerOrt"; + + @Override + public FormData parseFormData(final FormData formData) { + return getAntragstellerData(formData.getFormData()) + .map(this::buildAntragsteller) + .map(antragsteller -> formData.toBuilder().antragsteller(antragsteller).build()) + .orElse(formData); + } + + @SuppressWarnings("unchecked") + Optional<Map<String, Object>> getAntragstellerData(Map<String, Object> formDataMap) { + var antragstellerData = (Map<String, Object>) MapUtils.getMap(formDataMap, KEY_ANTRAGSTELLER); + return Optional.ofNullable(antragstellerData).map(map -> (Map<String, Object>) map.get("value")); + } + + Antragsteller buildAntragsteller(Map<String, Object> antragstellerData) { + return Antragsteller.builder() + .anrede(getValue(antragstellerData, KEY_ANREDE)) + .vorname(getValue(antragstellerData, KEY_VORNAME)) + .nachname(getValue(antragstellerData, KEY_NACHNAME)) + .geburtsname(getValue(antragstellerData, KEY_GEBURTSNAME)) + .geburtsdatum(getValue(antragstellerData, KEY_GEBURTSDATUM)) + .geburtsort(getValue(antragstellerData, KEY_GEBURTSORT)) + .email(getValue(antragstellerData, KEY_EMAIL)) + .telefon(getValue(antragstellerData, KEY_TELEFON)) + .strasse(getValue(antragstellerData, KEY_ADDRESS)) + .plz(getValue(antragstellerData, KEY_PLZ)) + .ort(getValue(antragstellerData, KEY_ORT)) + .build(); + } + + String getValue(Map<String, Object> formDataMap, String key) { + return Optional.ofNullable(MapUtils.getMap(formDataMap, key)).map(map -> map.get("value")).map(String::valueOf).orElse(StringUtils.EMPTY); + } +} diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..2f1f20a85652afc550b7eaacd677b987c3080f5c --- /dev/null +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleEngineBasedMapper.java @@ -0,0 +1,6 @@ +package de.ozgcloud.eingang.semantik.enginebased.formcycle; + +import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper; + +interface FormcycleEngineBasedMapper extends EngineBasedMapper { +} diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapterTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapterTest.java index 09478d357c24107e7c776161ea5313c5141eceef..e0641a50fbb1a2ba63194226c9f83465db9d2076 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapterTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormCycleEngineBasedAdapterTest.java @@ -24,25 +24,47 @@ package de.ozgcloud.eingang.semantik.enginebased.formcycle; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; +import java.util.List; + +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.springframework.test.util.ReflectionTestUtils; +import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; -import de.ozgcloud.eingang.semantik.enginebased.formcycle.FormCycleEngineBasedAdapter; class FormCycleEngineBasedAdapterTest { @InjectMocks private FormCycleEngineBasedAdapter adapter; + @Mock + private FormcycleEngineBasedMapper mapper; + @Mock + private FormData formData; + + @BeforeEach + void setup() { + ReflectionTestUtils.setField(adapter, "mappers", List.of(mapper)); + } + @Test - void shouldUnprocessedData() { - var formData = FormDataTestFactory.create(); + void shouldParseFormData() { + adapter.parseFormData(formData); - var result = adapter.parseFormData(formData); + verify(mapper).parseFormData(formData); + } + + @Test + void shouldNotRemoveParsedFormData() { + when(mapper.parseFormData(any())).thenReturn(formData); + + var result = adapter.parseFormData(FormDataTestFactory.create()); assertThat(result).isSameAs(formData); } - } diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ecce809dfc165ebda375212fcc659021b9f8ea76 --- /dev/null +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/formcycle/FormcycleAntragstellerMapperTest.java @@ -0,0 +1,198 @@ +package de.ozgcloud.eingang.semantik.enginebased.formcycle; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.eingang.common.formdata.Antragsteller; +import de.ozgcloud.eingang.common.formdata.AntragstellerTestFactory; +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; + +class FormcycleAntragstellerMapperTest { + + @Spy + @InjectMocks + private FormcycleAntragstellerMapper mapper; + + private static final String VALUE_KEY = "value"; + private static final String LABEL_KEY = "label"; + private static final Map<String, Object> ANTRAGSTELLER_DATA = new HashMap<>(); + private static final Map<String, Object> ANTRAGSTELLER_MAP = Map.of("fsBKAllDaten", Map.of(VALUE_KEY, ANTRAGSTELLER_DATA)); + + @BeforeAll + static void fillAntragstellerData() { + ANTRAGSTELLER_DATA.put("tfAntragstellerAnrede", Map.of(VALUE_KEY, AntragstellerTestFactory.ANREDE, LABEL_KEY, "Anrede")); + ANTRAGSTELLER_DATA.put("tfAntragstellerVorname", Map.of(LABEL_KEY, "Vorname", VALUE_KEY, AntragstellerTestFactory.VORNAME)); + ANTRAGSTELLER_DATA.put("tfAntragstellerName", Map.of(VALUE_KEY, AntragstellerTestFactory.NACHNAME, LABEL_KEY, "Nachname")); + ANTRAGSTELLER_DATA.put("tfAntragstellerGeburtsname", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSNAME, LABEL_KEY, "Geburtsname")); + ANTRAGSTELLER_DATA.put("tfAntragstellerGeburtsdatum", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSDATUM, LABEL_KEY, "Geburtsdatum")); + ANTRAGSTELLER_DATA.put("tfAntragstellerGeburtsort", Map.of(VALUE_KEY, AntragstellerTestFactory.GEBURTSORT, LABEL_KEY, "Geburtsort")); + ANTRAGSTELLER_DATA.put("tfAntragstellerEmail", Map.of(VALUE_KEY, AntragstellerTestFactory.EMAIL, LABEL_KEY, "E-Mail")); + ANTRAGSTELLER_DATA.put("tfAntragstellerTelefon", Map.of(VALUE_KEY, AntragstellerTestFactory.TELEFON, LABEL_KEY, "Telefon")); + ANTRAGSTELLER_DATA.put("tfAntragstellerAdresse", Map.of(LABEL_KEY, "Adresse", VALUE_KEY, AntragstellerTestFactory.STRASSE + " " + AntragstellerTestFactory.HAUSNUMMER)); + ANTRAGSTELLER_DATA.put("tfAntragstellerPLZ", Map.of(LABEL_KEY, "PLZ", VALUE_KEY, AntragstellerTestFactory.PLZ)); + ANTRAGSTELLER_DATA.put("tfAntragstellerOrt", Map.of(LABEL_KEY, "Ort", VALUE_KEY, AntragstellerTestFactory.ORT)); + } + + @Nested + class TestParseFormData { + + @Mock + private Antragsteller antragsteller; + + @Test + void shouldCallGetAntragsteller() { + mapper.parseFormData(buildFormData()); + + verify(mapper).getAntragstellerData(ANTRAGSTELLER_MAP); + } + + @Test + void shouldCallBuildAntragsteller() { + doReturn(Optional.of(ANTRAGSTELLER_DATA)).when(mapper).getAntragstellerData(anyMap()); + + mapper.parseFormData(buildFormData()); + + verify(mapper).buildAntragsteller(ANTRAGSTELLER_DATA); + } + + @Test + void shouldSetAntragsteller() { + doReturn(antragsteller).when(mapper).buildAntragsteller(anyMap()); + + var formData = mapper.parseFormData(buildFormData()); + + assertThat(formData.getAntragsteller()).isSameAs(antragsteller); + } + + @Test + void shouldReturnSameFormData() { + var formData = FormDataTestFactory.create(); + + var result = mapper.parseFormData(formData); + + assertThat(result).isSameAs(formData); + } + + FormData buildFormData() { + return FormData.builder().formData(ANTRAGSTELLER_MAP).build(); + } + } + + @Nested + class TestGetAntragstellerData { + + @Test + void shouldReturnEmpty() { + Map<String, Object> formDataMap = Map.of("key", "value"); + + var result = mapper.getAntragstellerData(formDataMap); + + assertThat(result).isEmpty(); + } + + @Test + void shouldReturnAntragstellerData() { + var result = mapper.getAntragstellerData(ANTRAGSTELLER_MAP); + + assertThat(result).contains(ANTRAGSTELLER_DATA); + } + } + + @Nested + class TestBuildAntragsteller { + + @Test + void shouldSetAnrede() { + var result = buildAntragsteller(); + + assertThat(result.getAnrede()).isEqualTo(AntragstellerTestFactory.ANREDE); + } + + @Test + void shouldSetVorname() { + var result = buildAntragsteller(); + + assertThat(result.getVorname()).isEqualTo(AntragstellerTestFactory.VORNAME); + } + + @Test + void shouldSetNachname() { + var result = buildAntragsteller(); + + assertThat(result.getNachname()).isEqualTo(AntragstellerTestFactory.NACHNAME); + } + + @Test + void shouldSetGeburtsname() { + var result = buildAntragsteller(); + + assertThat(result.getGeburtsname()).isEqualTo(AntragstellerTestFactory.GEBURTSNAME); + } + + @Test + void shouldSetGeburtsdatum() { + var result = buildAntragsteller(); + + assertThat(result.getGeburtsdatum()).isEqualTo(AntragstellerTestFactory.GEBURTSDATUM); + } + + @Test + void shouldSetGeburtsort() { + var result = buildAntragsteller(); + + assertThat(result.getGeburtsort()).isEqualTo(AntragstellerTestFactory.GEBURTSORT); + } + + @Test + void shouldSetEmail() { + var result = buildAntragsteller(); + + assertThat(result.getEmail()).isEqualTo(AntragstellerTestFactory.EMAIL); + } + + @Test + void shouldSetTelefon() { + var result = buildAntragsteller(); + + assertThat(result.getTelefon()).isEqualTo(AntragstellerTestFactory.TELEFON); + } + + @Test + void shouldSetAdresse() { + var result = buildAntragsteller(); + + assertThat(result.getStrasse()).isEqualTo(AntragstellerTestFactory.STRASSE + " " + AntragstellerTestFactory.HAUSNUMMER); + } + + @Test + void shouldSetPlz() { + var result = buildAntragsteller(); + + assertThat(result.getPlz()).isEqualTo(AntragstellerTestFactory.PLZ); + } + + @Test + void shouldSetOrt() { + var result = buildAntragsteller(); + + assertThat(result.getOrt()).isEqualTo(AntragstellerTestFactory.ORT); + } + + Antragsteller buildAntragsteller() { + return mapper.buildAntragsteller(ANTRAGSTELLER_DATA); + } + } +} \ No newline at end of file