diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java index 9653974555be411a25df47d6870f6658d3f5cfb3..65e83929afd92af06611f0e987c3e8805de9805b 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapper.java @@ -34,6 +34,7 @@ import org.springframework.stereotype.Component; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataUtils; import de.ozgcloud.eingang.common.formdata.FormHeader; +import de.ozgcloud.eingang.common.formdata.ServiceKonto; import de.ozgcloud.eingang.semantik.enginebased.ServiceKontoBuildHelper; @Component @@ -73,24 +74,36 @@ class AfmHeaderMapper implements AfmEngineBasedMapper { .formEngineName(AFM_FORMENGINE_NAME) .build(); - Optional.ofNullable(getNameId(formData)) - .map(nameId -> serviceKontoBuildHelper.buildOsiServiceKonto(nameId, formData)) - .ifPresent(formHeaderBuilder::setServiceKonto); + createBayernIdServiceKonto(formData).or(() -> createOsiServiceKonto(formData)).ifPresent(formHeaderBuilder::setServiceKonto); return formHeaderBuilder; } + private ZonedDateTime getCreatedAt(Map<String, Object> headerDataMap) { + return ZonedDateTime.parse((String) headerDataMap.get(TIMESTAMP), DateTimeFormatter.ISO_OFFSET_DATE_TIME); + } + + Optional<ServiceKonto> createBayernIdServiceKonto(FormData formData) { + var postfachId1 = getPostfachId(formData); + return postfachId1.map(postfachId -> serviceKontoBuildHelper.buildBayernIdServiceKonto(postfachId)); + } + + Optional<String> getPostfachId(FormData formData) { + return Optional.ofNullable(getHeaderMap(formData)).map(headers -> headers.get(AfmAntragstellerHeaderMapper.KEY_POSTFACH_ID)) + .map(String.class::cast); + } + @SuppressWarnings("unchecked") - private Map<String, Object> getHeaderMap(FormData formData) { + Map<String, Object> getHeaderMap(FormData formData) { return (Map<String, Object>) formData.getFormData().get(HEADER_FIELD); } - private ZonedDateTime getCreatedAt(Map<String, Object> headerDataMap) { - return ZonedDateTime.parse((String) headerDataMap.get(TIMESTAMP), DateTimeFormatter.ISO_OFFSET_DATE_TIME); + Optional<ServiceKonto> createOsiServiceKonto(FormData formData) { + return getNameId(formData).map(nameId -> serviceKontoBuildHelper.buildOsiServiceKonto(nameId, formData)); } - private String getNameId(FormData formData) { - return (String) formData.getFormData().get(POSTFACH_NAME_ID); + private Optional<String> getNameId(FormData formData) { + return Optional.of(formData.getFormData()).map(formDataMap -> formDataMap.get(POSTFACH_NAME_ID)).map(String.class::cast); } private FormData removeMappedData(FormData formData) { diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapperTest.java index 9eb5bac5995dfd209f42fd4481603c3a6cbdbee4..fd483d22da19b2da3f52bfec46715afdcde8a652 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapperTest.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderMapperTest.java @@ -27,6 +27,9 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.Map; +import java.util.Optional; + import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -36,13 +39,14 @@ import org.mockito.Spy; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormDataUtils; +import de.ozgcloud.eingang.common.formdata.ServiceKonto; import de.ozgcloud.eingang.semantik.enginebased.ServiceKontoBuildHelper; class AfmHeaderMapperTest { @Spy @InjectMocks - private final AfmHeaderMapper mapper = new AfmHeaderMapper(); + private AfmHeaderMapper mapper; @Mock private ServiceKontoBuildHelper serviceKontoBuildHelper; @@ -106,18 +110,60 @@ class AfmHeaderMapperTest { @Nested class TestServiceKonto { - @Test - void shouldCallBuildServiceKontoIfPresent() { - parseFormData(); + @DisplayName("OSI") + @Nested + class TestOsiServiceKonto { + @Test + void shouldCallBuildServiceKontoIfPresent() { + parseFormData(); + + verify(serviceKontoBuildHelper).buildOsiServiceKonto(any(), eq(FORM_DATA)); + } + + @Test + void shouldNotCallBuildServiceKontoIfNotExists() { + mapper.parseFormData(FormDataUtils.from(FORM_DATA).remove(AfmHeaderMapper.POSTFACH_NAME_ID).build()); - verify(serviceKontoBuildHelper).buildOsiServiceKonto(any(), eq(FORM_DATA)); + verify(serviceKontoBuildHelper, never()).buildOsiServiceKonto(any(), any()); + } } - @Test - void shouldNotCallBuildServiceKontoIfNotExists() { - mapper.parseFormData(FormDataUtils.from(FORM_DATA).remove(AfmHeaderMapper.POSTFACH_NAME_ID).build()); + @DisplayName("BayernID") + @Nested + class TestBayernId { + + @Mock + private FormData formData; + @Mock + private ServiceKonto serviceKonto; + + @Test + void shouldCallCreateBayernIdServiceKonto() { + var formData = FormData.builder().formData(AfmHeaderTestFactory.createFormDataMapWithExtendedHeaders()).build(); + + mapper.parseFormData(formData); + + verify(mapper).createBayernIdServiceKonto(formData); + } + + @Test + void shouldReturnServiceKonto() { + doReturn(Optional.of("id")).when(mapper).getPostfachId(any()); + when(serviceKontoBuildHelper.buildBayernIdServiceKonto(any())).thenReturn(serviceKonto); + + var parsedFormData = mapper.createBayernIdServiceKonto(formData); + + assertThat(parsedFormData).isPresent().get().isEqualTo(serviceKonto); + } + + @Test + void shouldNotCallServiceKontoBuildHelper() { + doReturn(Optional.empty()).when(mapper).getPostfachId(any()); + + mapper.createBayernIdServiceKonto(formData); - verify(serviceKontoBuildHelper, never()).buildOsiServiceKonto(any(), any()); + verify(serviceKontoBuildHelper, never()).buildBayernIdServiceKonto(any()); + } } } @@ -152,4 +198,29 @@ class AfmHeaderMapperTest { } } } + + @Nested + class TestGetPostfachId { + + @Mock + private FormData formData; + + @Test + void shouldReturnPostfachId() { + doReturn(Map.of(AfmAntragstellerHeaderMapper.KEY_POSTFACH_ID, AfmAntragstellerTestFactory.POSTFACH_ID)).when(mapper).getHeaderMap(any()); + + var postfachId = mapper.getPostfachId(formData); + + assertThat(postfachId).isPresent().get().isEqualTo(AfmAntragstellerTestFactory.POSTFACH_ID); + } + + @Test + void shouldReturnEmpty() { + doReturn(null).when(mapper).getHeaderMap(any()); + + var postfachId = mapper.getPostfachId(formData); + + assertThat(postfachId).isEmpty(); + } + } } \ No newline at end of file diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderTestFactory.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderTestFactory.java index 28e807688770910087b28d5ec2a228c4f90789dd..4cdd6b5f7ed887dbd9841e0d844b5389b25bb366 100644 --- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderTestFactory.java +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmHeaderTestFactory.java @@ -62,6 +62,13 @@ public class AfmHeaderTestFactory { return map; } + @SuppressWarnings("unchecked") + public static Map<String, Object> createFormDataMapWithExtendedHeaders() { + var map = new HashMap<>(createFormDataMap()); + ((Map<String, Object>) map.get(AfmHeaderMapper.HEADER_FIELD)).putAll(createCustomHeaderMap()); + return map; + } + public static Map<String, Object> createHeaderMap() { var map = new HashMap<String, Object>(); map.put(AfmHeaderMapper.ID, ID); @@ -69,7 +76,6 @@ public class AfmHeaderTestFactory { map.put(AfmHeaderMapper.FORM_ID, FORM_ID); map.put(AfmHeaderMapper.FORM, FORM); map.put(AfmHeaderMapper.SENDER, SENDER); - map.putAll(createCustomHeaderMap()); return map; }