diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapper.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapper.java index c090b773514c9547f55c20ca2cf981abc67ceb86..0f808337e735facf53907a528625137260ca09a6 100644 --- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapper.java +++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapper.java @@ -1,28 +1,51 @@ package de.ozgcloud.eingang.semantik.enginebased.afm; +import static java.util.Objects.*; +import static org.apache.commons.lang3.StringUtils.*; + +import java.util.Collections; +import java.util.Map; + import org.springframework.stereotype.Component; +import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.common.formdata.FormData; @Component public class AfmAntragstellerHeaderMapper { - static final String HEADER_POSTFACH_ID = "u:saml_legacypostkorbhandle"; - static final String HEADER_VORNAME = "u:saml_givenname"; - static final String HEADER_NACHNAME = "u:saml_surename"; - static final String HEADER_GEBURTSORT = "u:saml_placeofbirth"; + static final String KEY_POSTFACH_ID = "u:saml_legacypostkorbhandle"; + static final String KEY_VORNAME = "u:saml_givenname"; + static final String KEY_NACHNAME = "u:saml_surename"; + static final String KEY_GEBURTSORT = "u:saml_placeofbirth"; // TODO: public static final String HEADER_GEBURTSNAME = "u:saml_??"; - static final String HEADER_EMAIL = "u:saml_mail"; - static final String HEADER_TELEFON = "u:saml_telephonenumber"; - static final String HEADER_STRASSE = "u:saml_postaladdress"; - static final String HEADER_PLZ = "u:saml_postalcode"; - static final String HEADER_ORT = "u:saml_localityname"; + static final String KEY_EMAIL = "u:saml_mail"; + static final String KEY_TELEFON = "u:saml_telephonenumber"; + static final String KEY_STRASSE = "u:saml_postaladdress"; + static final String KEY_PLZ = "u:saml_postalcode"; + static final String KEY_ORT = "u:saml_localityname"; public FormData parseAntragstellerData(FormData formData) { return formData; } public boolean isResponsible(FormData formData) { - return false; + var headers = getHeaders(formData); + return headers.containsKey(KEY_POSTFACH_ID) && isPostfachIdNotBlank(headers.get(KEY_POSTFACH_ID)); + } + + @SuppressWarnings("unchecked") + Map<String, Object> getHeaders(FormData formData) { + return (Map<String, Object>) formData.getFormData().getOrDefault(AfmHeaderMapper.HEADER_FIELD, Collections.emptyMap()); + } + + boolean isPostfachIdNotBlank(Object postfachId) { + if (isNull(postfachId)) { + return false; + } + if (postfachId instanceof String id) { + return isNotBlank(id); + } + throw new TechnicalException("Unexpected type of postfach id: " + postfachId.getClass().getName()); } } diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapperTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f659992813a66eb649b627e4d979f8e154031d0c --- /dev/null +++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/enginebased/afm/AfmAntragstellerHeaderMapperTest.java @@ -0,0 +1,142 @@ +package de.ozgcloud.eingang.semantik.enginebased.afm; + +import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; + +import de.ozgcloud.eingang.common.errorhandling.TechnicalException; +import de.ozgcloud.eingang.common.formdata.FormData; + +class AfmAntragstellerHeaderMapperTest { + + @Spy + @InjectMocks + private AfmAntragstellerHeaderMapper mapper; + + @Nested + class TestParseAntragstellerData { + + } + + @Nested + class TestIsResponsible { + + @Mock + private FormData formData; + + @BeforeEach + void setup() { + + } + + @Test + void shouldApproveResponsibility() { + doReturn(true).when(mapper).isPostfachIdNotBlank(any()); + doReturn(createHeaders(AfmAntragstellerHeaderMapper.KEY_POSTFACH_ID, "123")).when(mapper).getHeaders(any()); + + var isResponsible = mapper.isResponsible(formData); + + assertTrue(isResponsible); + } + + @Nested + class TestDenyResponsibility { + + @Test + void shouldDenyWhenNoHeader() { + doReturn(Collections.emptyMap()).when(mapper).getHeaders(any()); + + var isResponsible = mapper.isResponsible(FormData.builder().build()); + + assertFalse(isResponsible); + } + + @Test + void shouldDenyWhenNoPostfachId() { + doReturn(createHeaders(AfmAntragstellerHeaderMapper.KEY_VORNAME, "name")).when(mapper).getHeaders(any()); + + var isResponsible = mapper.isResponsible(formData); + + assertFalse(isResponsible); + } + + void shouldDenyWhenPostfachIdIsBlank() { + doReturn(createHeaders(AfmAntragstellerHeaderMapper.KEY_POSTFACH_ID, null)).when(mapper).getHeaders(any()); + doReturn(false).when(mapper).isPostfachIdNotBlank(any()); + + var isResponsible = mapper.isResponsible(formData); + + assertFalse(isResponsible); + } + + @Nested + class TestGetHeaders { + + @Test + void shouldReturnHeaders() { + var headers = createHeaders(AfmAntragstellerHeaderMapper.KEY_POSTFACH_ID, "123"); + var formData = FormData.builder().formData(createHeaders(AfmHeaderMapper.HEADER_FIELD, headers)).build(); + + var result = mapper.getHeaders(formData); + + assertThat(result).isEqualTo(headers); + } + + @Test + void shouldReturnEmptyMapWhenNoHeaders() { + var formData = FormData.builder().build(); + + var result = mapper.getHeaders(formData); + + assertThat(result).isEmpty(); + } + } + + @Nested + class TestIsPostfachIdNotBlank { + + @ParameterizedTest + @NullAndEmptySource + void shouldReturnFalseWhenPostfachIdIsBlank(String postfachId) { + var isNotBlank = mapper.isPostfachIdNotBlank(postfachId); + + assertFalse(isNotBlank); + } + + @Test + void shouldApprove() { + var isNotBlank = mapper.isPostfachIdNotBlank("123"); + + assertTrue(isNotBlank); + } + + @Test + void shouldFailOnUnexpectedType() { + var postfachId = new Object(); + + assertThrows(TechnicalException.class, () -> mapper.isPostfachIdNotBlank(postfachId)); + } + } + } + } + + private Map<String, Object> createHeaders(String key, Object value) { + var map = new HashMap<String, Object>(); + map.put(key, value); + return map; + } +} \ 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 b59daddd07d84cfd5743880836dfb15d0b500c62..2ade6abdcc57a9963450a108e33bc88f3380cec9 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 @@ -74,15 +74,15 @@ public class AfmHeaderTestFactory { public static Map<String, Object> createCustomHeaderMap() { var map = new HashMap<String, Object>(); - map.put(AfmAntragstellerHeaderMapper.HEADER_POSTFACH_ID, CUSTOM_POSTFACH_ID); - map.put(AfmAntragstellerHeaderMapper.HEADER_VORNAME, CUSTOM_VORNAME); - map.put(AfmAntragstellerHeaderMapper.HEADER_NACHNAME, CUSTOM_NACHNAME); - map.put(AfmAntragstellerHeaderMapper.HEADER_GEBURTSORT, CUSTOM_GEBURTSORT); - map.put(AfmAntragstellerHeaderMapper.HEADER_EMAIL, CUSTOM_EMAIL); - map.put(AfmAntragstellerHeaderMapper.HEADER_TELEFON, CUSTOM_TELEFON); - map.put(AfmAntragstellerHeaderMapper.HEADER_STRASSE, CUSTOM_STRASSE); - map.put(AfmAntragstellerHeaderMapper.HEADER_PLZ, CUSTOM_PLZ); - map.put(AfmAntragstellerHeaderMapper.HEADER_ORT, CUSTOM_ORT); + map.put(AfmAntragstellerHeaderMapper.KEY_POSTFACH_ID, CUSTOM_POSTFACH_ID); + map.put(AfmAntragstellerHeaderMapper.KEY_VORNAME, CUSTOM_VORNAME); + map.put(AfmAntragstellerHeaderMapper.KEY_NACHNAME, CUSTOM_NACHNAME); + map.put(AfmAntragstellerHeaderMapper.KEY_GEBURTSORT, CUSTOM_GEBURTSORT); + map.put(AfmAntragstellerHeaderMapper.KEY_EMAIL, CUSTOM_EMAIL); + map.put(AfmAntragstellerHeaderMapper.KEY_TELEFON, CUSTOM_TELEFON); + map.put(AfmAntragstellerHeaderMapper.KEY_STRASSE, CUSTOM_STRASSE); + map.put(AfmAntragstellerHeaderMapper.KEY_PLZ, CUSTOM_PLZ); + map.put(AfmAntragstellerHeaderMapper.KEY_ORT, CUSTOM_ORT); return map; }