diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java index 755692329b83d31074fbdbebbfcfbf50f24e120b..17653d91cb1dbdb75c8dc4533e8075ce005faef0 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/AntragstellerMapper.java @@ -5,7 +5,6 @@ import java.util.Map; import org.springframework.stereotype.Component; import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; @Component class AntragstellerMapper { @@ -22,7 +21,7 @@ class AntragstellerMapper { static final String PLZ_KEY = "F60000246"; static final String ORT_KEY = "F60000247"; - public Antragsteller map(FormData formData) { + public Antragsteller map(Map<String, Object> formData) { var antragsteller = getAntragsteller(formData); var anschrift = getAnschrift(antragsteller); @@ -37,8 +36,8 @@ class AntragstellerMapper { .build(); } - private Map<String, Object> getAntragsteller(FormData formData) { - return FimDataUtil.getSubmap(formData.getFormData(), ANTRAGSTELLER_KEY); + private Map<String, Object> getAntragsteller(Map<String, Object> formData) { + return FimDataUtil.getSubmap(formData, ANTRAGSTELLER_KEY); } private Map<String, Object> getAnschrift(Map<String, Object> antragsteller) { diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java index 86b2f8738e84035d602e577756f98ffaa41cfe21..8b91a29fa41c3489fa8a304423a36d10e1c6194d 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimDataMapper.java @@ -13,20 +13,16 @@ import org.w3c.dom.Text; import de.ozgcloud.eingang.common.formdata.FormData; import lombok.extern.log4j.Log4j2; -@Service @Log4j2 -class FimDataMapper implements TriFunction<Document, FimScheme, FormData, FormData> { +@Service +class FimDataMapper implements TriFunction<Document, FimScheme, FormData, Map<String, Object>> { private static final String LABEL_KEY = "label"; private static final String VALUE_KEY = "value"; @Override - public FormData apply(Document document, FimScheme fimScheme, FormData initialFormData) { - return FormData.builder() - .formData(extractDocumentData(document.getDocumentElement(), fimScheme)) - .attachments(initialFormData.getAttachments()) - .representations(initialFormData.getRepresentations()) - .build(); + public Map<String, Object> apply(Document document, FimScheme fimScheme, FormData initialFormData) { + return extractDocumentData(document.getDocumentElement(), fimScheme); } Map<String, Object> extractDocumentData(Element documentRoot, FimScheme fimScheme) { diff --git a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java index 447bf27985d0b08ad00abc3c4e0e164b29370507..f6b4bbb019ecd8807209cca4952cb63082f0e2da 100644 --- a/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java +++ b/fim-adapter/src/main/java/de/ozgcloud/eingang/fim/FimService.java @@ -1,15 +1,16 @@ package de.ozgcloud.eingang.fim; +import java.util.Map; import java.util.Objects; import java.util.Optional; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.w3c.dom.Document; import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.fim.common.errorhandling.FimException; -import io.micrometer.common.util.StringUtils; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; @@ -20,44 +21,52 @@ public class FimService { private final FimDataMapper fimDataMapper; private final AntragstellerMapper antragstellerMapper; - private final FimSchemeHelper schemeCatalogueHelper; + private final FimSchemeHelper schemeHelper; - public FormData transformDocument(Document document, FormData initialFormData) { - var schemeName = getSchemeName(document); - if (StringUtils.isEmpty(schemeName)) { - throw new FimException("XML Document does not provide a scheme"); - } - var formData = fimDataMapper.apply(document, getSchemeForIdentifier(schemeName), initialFormData); + public FormData transformDocument(Document document, FormData formData) { + var formDataMap = getFormDataMap(document, formData); return formData.toBuilder() - .header(initialFormData.getHeader()) - .antragsteller(antragstellerMapper.map(formData)) - .header(buildFormHeader(formData)) + .formData(formDataMap) + .antragsteller(antragstellerMapper.map(formDataMap)) + .header(buildFormHeader(formData, formDataMap)) .build(); } - private static String getSchemeName(Document doc) { + private Map<String, Object> getFormDataMap(Document document, FormData formData) { + return fimDataMapper.apply(document, getSchemeForIdentifier(getSchemeName(document)), formData); + } + + String getSchemeName(Document doc) { + var schemeName = extractSchemeName(doc); + if (StringUtils.isEmpty(schemeName)) { + throw new FimException("XML Document does not provide a scheme."); + } + return schemeName; + } + + String extractSchemeName(Document doc) { var tagParts = doc.getDocumentElement().getTagName().split(":"); var namespacePrefix = tagParts.length < 2 ? "" : (":" + tagParts[0]); return doc.getDocumentElement().getAttribute("xmlns" + namespacePrefix); } FimScheme getSchemeForIdentifier(String fimSchemaName) { - var fimScheme = schemeCatalogueHelper.getScheme(fimSchemaName); + var fimScheme = schemeHelper.getScheme(fimSchemaName); if (Objects.isNull(fimScheme)) { LOG.error("Cannot find schema for: " + fimSchemaName); - return schemeCatalogueHelper.getDefaultScheme(); + return schemeHelper.getDefaultScheme(); } return fimScheme; } - private FormHeader buildFormHeader(FormData formData) { + FormHeader buildFormHeader(FormData formData, Map<String, Object> formDataMap) { return formData.getHeader().toBuilder() - .formName(getVorgangsName(formData).orElse(null)) + .formName(getVorgangsName(formDataMap).orElse(null)) .build(); } - private Optional<String> getVorgangsName(FormData formData) { - return FimDataUtil.getValue(formData.getFormData(), "G17003529", "G05001479", "G05001480", "F05002753"); + Optional<String> getVorgangsName(Map<String, Object> formData) { + return FimDataUtil.getValue(formData, "G17003529", "G05001479", "G05001480", "F05002753"); } } \ No newline at end of file diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java index 80a4c0b6bb4f59a072b29dcff7375e3ceb252e8f..142f8c2a5f701c9196b42fd1e90728d0f8877847 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/AntragstellerMapperTest.java @@ -11,7 +11,6 @@ import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import de.ozgcloud.eingang.common.formdata.Antragsteller; -import de.ozgcloud.eingang.common.formdata.FormData; class AntragstellerMapperTest { @@ -25,7 +24,7 @@ class AntragstellerMapperTest { @Test void shouldMap() { var antragstellerMap = AntragstellerTestFactory.createAntragstellerAsFimMap(); - var formData = FormData.builder().formData(Map.of(AntragstellerMapper.ANTRAGSTELLER_KEY, antragstellerMap)).build(); + var formData = Map.<String, Object>of(AntragstellerMapper.ANTRAGSTELLER_KEY, antragstellerMap); var antragsteller = mapper.map(formData); @@ -34,7 +33,7 @@ class AntragstellerMapperTest { @Test void shouldMapEmpty() { - var formData = FormData.builder().formData(Collections.emptyMap()).build(); + var formData = Collections.<String, Object>emptyMap(); var antragsteller = mapper.map(formData); diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java index 3a53dd9665d2678c5f1dc49e87817453704240b3..0ea6ec2b100bdc89d16f78b8b253e4fe17639090 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimDataMapperTest.java @@ -55,27 +55,13 @@ class FimDataMapperTest { } @Test - void shouldPutExtractDocumentDataInFormData() { + void shouldReturnFormDataMap() { var appliedFormData = apply(); - assertThat(appliedFormData.getFormData()).isEqualTo(extractedDocumentData); + assertThat(appliedFormData).isEqualTo(extractedDocumentData); } - @Test - void shouldKeepAttachmentsInFormData() { - var appliedFormData = apply(); - - assertThat(appliedFormData.getAttachments()).isEqualTo(FormDataTestFactory.ATTACHMENTS); - } - - @Test - void shouldKeepRepresentationsInFormData() { - var appliedFormData = apply(); - - assertThat(appliedFormData.getRepresentations()).isEqualTo(FormDataTestFactory.REPRESENTATIONS); - } - - private FormData apply() { + private Map<String, Object> apply() { return mapper.apply(document, fimScheme, formData); } } diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java index f54b961ef805c945f1416cc9292855d314c95c1c..ae3902ce142bdc5a1d1ec671c80ecdaf1baae079 100644 --- a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceITCase.java @@ -36,7 +36,7 @@ class FimServiceITCase { assertThatThrownBy(() -> { final Document document = loadDocument("src/test/resources/test1.xml"); fimService.transformDocument(document, FormData.builder().build()); - }).isInstanceOf(FimException.class).hasMessage("XML Document does not provide a scheme"); + }).isInstanceOf(FimException.class).hasMessage("XML Document does not provide a scheme."); } @Test diff --git a/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1c4cb152a7e4e117bea59eda5fcf700029bbb51c --- /dev/null +++ b/fim-adapter/src/test/java/de/ozgcloud/eingang/fim/FimServiceTest.java @@ -0,0 +1,267 @@ +package de.ozgcloud.eingang.fim; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.util.Collections; +import java.util.Map; +import java.util.Optional; + +import org.apache.commons.lang3.StringUtils; +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; +import org.mockito.Mock; +import org.mockito.Spy; +import org.w3c.dom.Document; + +import com.thedeanda.lorem.LoremIpsum; + +import de.ozgcloud.eingang.common.formdata.FormData; +import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; +import de.ozgcloud.eingang.common.formdata.FormHeader; +import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; +import de.ozgcloud.eingang.fim.common.errorhandling.FimException; + +class FimServiceTest { + + @Spy + @InjectMocks + private FimService service; + @Mock + private FimDataMapper mapper; + @Mock + private AntragstellerMapper antragstellerMapper; + @Mock + private FimSchemeHelper schemeHelper; + + @DisplayName("Transform document") + @Nested + class TestTransformDocument { + + @Mock + private Document doc; + @Mock + private FimScheme fimScheme; + + private final FormData formData = FormDataTestFactory.create(); + private final String schemeName = LoremIpsum.getInstance().getName(); + private final Map<String, Object> formDataMap = Collections.emptyMap(); + private final FormHeader formHeader = FormHeaderTestFactory.create(); + + @BeforeEach + void mock() { + doReturn(schemeName).when(service).getSchemeName(any()); + doReturn(fimScheme).when(service).getSchemeForIdentifier(any()); + doReturn(formHeader).when(service).buildFormHeader(any(), any()); + + when(mapper.apply(any(), any(), any())).thenReturn(formDataMap); + when(antragstellerMapper.map(any())).thenReturn(AntragstellerTestFactory.create()); + } + + @Test + void shouldCallGetSchemeName() { + transformDocument(); + + verify(service).getSchemeName(doc); + } + + @Test + void shouldCallGetSchemeForIdentifier() { + transformDocument(); + + verify(service).getSchemeForIdentifier(schemeName); + } + + @Test + void shouldCallFimDataMapper() { + transformDocument(); + + verify(mapper).apply(doc, fimScheme, formData); + } + + @Test + void shouldCallAntragstellerMapper() { + transformDocument(); + + verify(antragstellerMapper).map(formDataMap); + } + + @Test + void shouldCallBuildFormHeader() { + transformDocument(); + + verify(service).buildFormHeader(formData, formDataMap); + } + + @DisplayName("should return formdata contains") + @Nested + class TestShouldReturn { + + @DisplayName("antragsteller") + @Test + void shouldReturnAntragsteller() { + var transformedFormData = transformDocument(); + + assertThat(transformedFormData.getAntragsteller()).usingRecursiveComparison().isEqualTo(AntragstellerTestFactory.create()); + } + + @DisplayName("form header") + @Test + void shouldReturnFormHeader() { + var transformedFormData = transformDocument(); + + assertThat(transformedFormData.getHeader()).isEqualTo(formHeader); + } + } + + private FormData transformDocument() { + return service.transformDocument(doc, formData); + } + } + + @DisplayName("Get scheme name") + @Nested + class TestGetSchemeName { + + @Mock + private Document doc; + + private final String schemeName = LoremIpsum.getInstance().getName(); + + @Test + void shouldCallExtractSchemeName() { + doReturn(schemeName).when(service).extractSchemeName(any()); + + service.getSchemeName(doc); + + verify(service).extractSchemeName(doc); + } + + @Test + void shouldThrowExceptionOnEmptyName() { + doReturn(StringUtils.EMPTY).when(service).extractSchemeName(any()); + + assertThatThrownBy(() -> service.getSchemeName(doc)).isInstanceOf(FimException.class); + } + + @Test + void shouldReturnValue() { + doReturn(schemeName).when(service).extractSchemeName(any()); + + var name = service.getSchemeName(doc); + + assertThat(name).isEqualTo(schemeName); + } + } + + @DisplayName("Get scheme for identifier") + @Nested + class TestGetSchemeForIdentifier { + + @Mock + private FimScheme fimScheme; + + private final String schemeName = LoremIpsum.getInstance().getName(); + + @DisplayName("on existing scheme") + @Nested + class TestOnExistingScheme { + + @BeforeEach + void mock() { + when(schemeHelper.getScheme(any())).thenReturn(fimScheme); + } + + @Test + void shouldCallSchemeHelper() { + service.getSchemeForIdentifier(schemeName); + + verify(schemeHelper).getScheme(schemeName); + } + + @Test + void shouldReturnScheme() { + var scheme = service.getSchemeForIdentifier(schemeName); + + assertThat(scheme).isEqualTo(fimScheme); + } + } + + @DisplayName("on missing scheme") + @Nested + class TestOnMissingScheme { + + @BeforeEach + void mock() { + when(schemeHelper.getScheme(any())).thenReturn(null); + when(schemeHelper.getDefaultScheme()).thenReturn(fimScheme); + } + + @Test + void shouldCallSchemeHelperToGetDefaultScheme() { + service.getSchemeForIdentifier(schemeName); + + verify(schemeHelper).getDefaultScheme(); + } + + @Test + void shouldReturnDefaultScheme() { + var scheme = service.getSchemeForIdentifier(schemeName); + + assertThat(scheme).isEqualTo(fimScheme); + } + } + } + + @DisplayName("Build form header") + @Nested + class TestBuildFormHeader { + + private final Map<String, Object> formDataMap = Collections.emptyMap(); + private final FormData formData = FormDataTestFactory.createBuilder() + .header(FormHeaderTestFactory.createBuilder().formName(null).build()) + .build(); + private final String vorgangName = LoremIpsum.getInstance().getName(); + + @Test + void shouldCallGetVorgangName() { + service.buildFormHeader(formData, formDataMap); + + verify(service).getVorgangsName(formDataMap); + } + + @DisplayName("form name") + @Nested + class TestFormName { + + @Test + void shouldSetIfVorgangNameExists() { + doReturn(Optional.of(vorgangName)).when(service).getVorgangsName(any()); + + var formHeader = service.buildFormHeader(formData, formDataMap); + + assertThat(formHeader.getFormName()).isEqualTo(vorgangName); + } + + @Test + void shouldBeNullIfVorgangNameNotExist() { + doReturn(Optional.empty()).when(service).getVorgangsName(any()); + + var formHeader = service.buildFormHeader(formData, formDataMap); + + assertThat(formHeader.getFormName()).isNull(); + } + } + + @Test + void shouldReturnValue() { + var formHeader = service.buildFormHeader(formData, formDataMap); + + assertThat(formHeader).usingRecursiveComparison().isEqualTo(formData.getHeader()); + } + } +} \ No newline at end of file