diff --git a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapper.java b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapper.java index beafef67c5397ad1991271637e7dc8a4e9fc21b0..aa6a12d2f132f2ebb0c1f5d149a514935da0e118 100644 --- a/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapper.java +++ b/semantik-adapter/src/main/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapper.java @@ -26,6 +26,7 @@ package de.itvsh.kop.eingangsadapter.semantik.enginebased; import static de.itvsh.kop.eingangsadapter.semantik.enginebased.FormSolutionsEngineBasedAdapter.*; import static de.itvsh.kop.eingangsadapter.semantik.enginebased.FormSolutionsPanelMapper.*; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,60 +39,76 @@ import de.itvsh.kop.eingangsadapter.common.formdata.FormData; @Component public class FormSolutionsAntragstellerMapper implements FormSolutionsEngineBasedMapper { + public static final String ANTRAGSTELLER_PANEL_IDENTIFIER = "Antragstellende Person"; + public static final String POSTKORBHANDLE = "postkorbhandle"; + public static final String VORNAME_KEY = "AS_Vorname"; public static final String NACHNAME_KEY = "AS_Name"; @Override public FormData parseFormData(FormData formData) { - var cleanedData = removePostkorbhandle(formData); - - Antragsteller.AntragstellerBuilder builder = Antragsteller.builder() - .postfachId((String) formData.getFormData().get(POSTKORBHANDLE)); + return formData.toBuilder() + .antragsteller(buildAntragsteller(formData)) + .formData(removeProcessedData(formData)) + .build(); + } + Antragsteller buildAntragsteller(FormData formData) { var antragstellerData = findAntragstellerData(formData.getFormData()); - findValueByKey(NACHNAME_KEY, antragstellerData).ifPresent(builder::nachname); + return Antragsteller.builder() + .postfachId(getPostkorbhandle(formData)) + .vorname(getVorname(antragstellerData)) + .nachname(getNachname(antragstellerData)) + .build(); + } + + private String getVorname(Map<String, String> antragstellerData) { + return Optional.ofNullable(antragstellerData.get(VORNAME_KEY)).orElse(null); + } - findValueByKey(VORNAME_KEY, antragstellerData).ifPresent(builder::vorname); + private String getNachname(Map<String, String> antragstellerData) { + return Optional.ofNullable(antragstellerData.get(NACHNAME_KEY)).orElse(null); + } - return formData.toBuilder() - .antragsteller(builder.build()) - .formData(cleanedData) - .build(); + private String getPostkorbhandle(FormData formData) { + return (String) formData.getFormData().get(POSTKORBHANDLE); } private Map<String, String> findAntragstellerData(Map<String, Object> formData) { - Map<String, String> names = new HashMap<>(); - addContent(getPanels(formData), names); + var names = new HashMap<String, String>(); + addContent(getAssistantPanels(formData), names); return names; } - private Optional<String> findValueByKey(String key, Map<String, String> data) { - return Optional.ofNullable(data.get(key)); + private void addContent(List<Map<String, Object>> panels, Map<String, String> names) { + panels.stream().forEach(entry -> handleContentEntry(entry, names)); } - @SuppressWarnings("unchecked") - private List<Map<String, Object>> getPanels(Map<String, Object> formData) { - return ((List<Map<String, Object>>) ((Map<String, Object>) formData.get(ASSISTANT)).get(PANELS)); + private void handleContentEntry(Map<String, Object> entry, Map<String, String> names) { + if (entry.containsKey(COMPONENTS)) { + addContent(getComponentList(entry), names); + } else if (entry.containsKey(STRING_VALUE)) { + names.put((String) entry.get(IDENTIFIER), (String) entry.get(STRING_VALUE)); + } } @SuppressWarnings("unchecked") - private void addContent(List<Map<String, Object>> items, Map<String, String> names) { - items.stream().forEach(entry -> { - if (entry.containsKey(COMPONENTS)) { - addContent((List<Map<String, Object>>) entry.get(COMPONENTS), names); - } else if (entry.containsKey(STRING_VALUE)) { - names.put((String) entry.get(IDENTIFIER), (String) entry.get(STRING_VALUE)); - } - }); + private List<Map<String, Object>> getComponentList(Map<String, Object> entry) { + return (List<Map<String, Object>>) entry.get(COMPONENTS); } - private Map<String, Object> removePostkorbhandle(FormData processedData) { - Map<String, Object> cleanedData = new HashMap<>(processedData.getFormData()); - cleanedData.remove(POSTKORBHANDLE); - return cleanedData; + @SuppressWarnings("unchecked") + private List<Map<String, Object>> getAssistantPanels(Map<String, Object> formData) { + return ((List<Map<String, Object>>) ((Map<String, Object>) formData.get(ASSISTANT)).get(PANELS)); } + Map<String, Object> removeProcessedData(FormData formData) { + var formDataMap = new HashMap<String, Object>(formData.getFormData()); + formDataMap.remove(POSTKORBHANDLE); + + return Collections.unmodifiableMap(formDataMap); + } } diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapperTest.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapperTest.java index be8ea56a6e04d0a41c14057aff40c4514355071a..c6d959d368d02f0e977a2b1735540852f90c1780 100644 --- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapperTest.java +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerMapperTest.java @@ -24,44 +24,93 @@ package de.itvsh.kop.eingangsadapter.semantik.enginebased; import static de.itvsh.kop.eingangsadapter.common.formdata.AntragstellerTestFactory.*; -import static de.itvsh.kop.eingangsadapter.semantik.enginebased.FormSolutionsAntragstellerMapper.*; import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.mockito.Spy; + +import de.itvsh.kop.eingangsadapter.common.formdata.Antragsteller; +import de.itvsh.kop.eingangsadapter.common.formdata.FormData; class FormSolutionsAntragstellerMapperTest { - private FormSolutionsAntragstellerMapper mapper = new FormSolutionsAntragstellerMapper(); + @Spy + private final FormSolutionsAntragstellerMapper mapper = new FormSolutionsAntragstellerMapper(); + + @DisplayName("Parse formData") @Nested - class TestAntragstellerMapping { + class TestParseFormData { + + private final FormData formData = FormSolutionsAntragstellerTestFactory.create(); + @Test - void shouldParsePostfachId() { - var formData = mapper.parseFormData(FormSolutionsAntragstellerTestFactory.create()); + void shouldCallBuildAntragsteller() { + parseFormData(); - assertThat(formData.getAntragsteller().getPostfachId()) - .isEqualTo(POSTFACH_ID); + verify(mapper).buildAntragsteller(formData); } @Test - void shouldParseVorname() { - var formData = mapper.parseFormData(FormSolutionsAntragstellerTestFactory.create()); + void shouldCallRemoveProcessedData() { + parseFormData(); - assertThat(formData.getAntragsteller().getVorname()).isEqualTo(VORNAME); + verify(mapper).buildAntragsteller(formData); } @Test - void shouldParseNachname() { - var formData = mapper.parseFormData(FormSolutionsAntragstellerTestFactory.create()); + void shouldReturnValue() { + var result = parseFormData(); - assertThat(formData.getAntragsteller().getNachname()).isEqualTo(NACHNAME); + assertThat(result).usingRecursiveComparison().ignoringFields("antragsteller", "formData").isEqualTo(formData); } - @Test - void shouldRemovedParsedPostfachId() { - var formData = mapper.parseFormData(FormSolutionsAntragstellerTestFactory.create()); + private FormData parseFormData() { + return mapper.parseFormData(formData); + } + + @DisplayName("build antragsteller") + @Nested + class TestBuildAntragsteller { + + @Test + void shouldHavePostfachId() { + var antragsteller = buildAntragsteller(); + + assertThat(antragsteller.getPostfachId()).isEqualTo(POSTFACH_ID); + } + + @Test + void shouldHaveVorname() { + var antragsteller = buildAntragsteller(); + + assertThat(antragsteller.getVorname()).isEqualTo(VORNAME); + } + + @Test + void shouldHaveNachname() { + var antragsteller = buildAntragsteller(); + + assertThat(antragsteller.getNachname()).isEqualTo(NACHNAME); + } + + private Antragsteller buildAntragsteller() { + return mapper.buildAntragsteller(formData); + } + } + + @DisplayName("remove processed data") + @Nested + class TestRemoveProcessedData { + + @Test + void shouldRemovePostkorbhandle() { + var formDataMap = mapper.removeProcessedData(formData); - assertThat(formData.getFormData().get(POSTKORBHANDLE)).isNull(); + assertThat(formDataMap).doesNotContainKey(FormSolutionsAntragstellerMapper.POSTKORBHANDLE); + } } } -} +} \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerTestFactory.java b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerTestFactory.java index 97722d19dc0d1d37fc36ae0d9d3baaac2faa04e4..a1694d61e8e4e3296f5367a647e6f8b58179441a 100644 --- a/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerTestFactory.java +++ b/semantik-adapter/src/test/java/de/itvsh/kop/eingangsadapter/semantik/enginebased/FormSolutionsAntragstellerTestFactory.java @@ -34,23 +34,30 @@ import java.util.Map; import de.itvsh.kop.eingangsadapter.common.formdata.FormData; class FormSolutionsAntragstellerTestFactory { - static final String ANTRAGSTELLER_NAME_PANEL_IDENTIFIER = "AS_Name1"; - static final List<Map<String, Object>> ANTRAGSTELLER_PANEL_CONTENT = List.of( - Map.of(IDENTIFIER, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER), - Map.of(COMPONENTS, List.of( - Map.of(IDENTIFIER, VORNAME_KEY, STRING_VALUE, VORNAME), - Map.of(IDENTIFIER, NACHNAME_KEY, STRING_VALUE, NACHNAME)))); - static final List<Map<String, Object>> PANELS_CONTENT = List.of( - Map.of(IDENTIFIER, ANTRAGSTELLER_PANEL_IDENTIFIER), - Map.of(COMPONENTS, ANTRAGSTELLER_PANEL_CONTENT)); - static final Map<String, Object> ANTRAGSTELLER_DATA = Map.of(PANELS, PANELS_CONTENT); + static final String ANTRAGSTELLER_NAME_PANEL_IDENTIFIER = "AS_Name1"; public static FormData create() { return createBuilder().build(); } public static FormData.FormDataBuilder createBuilder() { - return FormData.builder().formData(Map.of(FormSolutionsAntragstellerMapper.POSTKORBHANDLE, POSTFACH_ID, ASSISTANT, ANTRAGSTELLER_DATA)); + return FormData.builder().formData(Map.of( + FormSolutionsAntragstellerMapper.POSTKORBHANDLE, POSTFACH_ID, + ASSISTANT, createAssistantMap())); + } + + private static Map<String, Object> createAssistantMap() { + return Map.of(PANELS, List.of( + Map.of(IDENTIFIER, ANTRAGSTELLER_PANEL_IDENTIFIER), + Map.of(COMPONENTS, createAntragstellerPanelContentList()))); + } + + private static List<Map<String, Object>> createAntragstellerPanelContentList() { + return List.of( + Map.of(IDENTIFIER, ANTRAGSTELLER_NAME_PANEL_IDENTIFIER), + Map.of(COMPONENTS, List.of( + Map.of(IDENTIFIER, VORNAME_KEY, STRING_VALUE, VORNAME), + Map.of(IDENTIFIER, NACHNAME_KEY, STRING_VALUE, NACHNAME)))); } -} +} \ No newline at end of file