Skip to content
Snippets Groups Projects
Commit ec8381ab authored by OZGCloud's avatar OZGCloud
Browse files

OZG-6735 refactor service

parent bd7c6a31
Branches
Tags
1 merge request!2Ozg 6735 fim metadata
......@@ -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) {
......
......@@ -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) {
......
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
......@@ -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);
......
......@@ -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);
}
}
......
......@@ -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
......
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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment