diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java index a58411a47551496e1813c02934e5310ef4c91188..8ffe47ae143539920df0c69ab94c4d151e92e339 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaConfiguration.java @@ -2,6 +2,10 @@ package de.ozgcloud.archive.common.xta; import java.io.IOException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -58,4 +62,9 @@ class XtaConfiguration { ObjectMapper objectMapper() { return new ObjectMapper(); } + + @Bean + DocumentBuilder documentBuilder() throws ParserConfigurationException { + return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder(); + } } diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java new file mode 100644 index 0000000000000000000000000000000000000000..70e10b3348bd4b3581df8a75e222c6e5865397df --- /dev/null +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileParser.java @@ -0,0 +1,41 @@ +package de.ozgcloud.archive.common.xta; + +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; + +import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +import de.ozgcloud.xta.client.model.XtaFile; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@RequiredArgsConstructor +@Component +public class XtaFileParser { + + private final DocumentBuilder documentBuilder; + + public boolean isType(XtaFile file, XtaFileType type) { + try { + var doc = parse(file); + return type.getTypeStr().equals(getRootTagName(doc)); + } catch (Exception e) { + LOG.warn("Error parsing xta file.", e); + return false; + } + } + + Document parse(XtaFile file) throws SAXException, IOException { + var document = documentBuilder.parse(file.content().getDataSource().getInputStream()); + document.getDocumentElement().normalize(); + return document; + } + + private String getRootTagName(Document doc) { + return doc.getDocumentElement().getTagName(); + } +} \ No newline at end of file diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileXmlUtils.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileXmlUtils.java deleted file mode 100644 index b1fa014a4390a3c9e96fac8e58f33ef309e42099..0000000000000000000000000000000000000000 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/common/xta/XtaFileXmlUtils.java +++ /dev/null @@ -1,44 +0,0 @@ -package de.ozgcloud.archive.common.xta; - -import java.io.IOException; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -import de.ozgcloud.xta.client.model.XtaFile; -import lombok.AccessLevel; -import lombok.NoArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@NoArgsConstructor(access = AccessLevel.PRIVATE) -public class XtaFileXmlUtils { - - public static boolean isType(XtaFile file, XtaFileType type) { - try { - var doc = XtaFileXmlUtils.parse(file); - return type.getTypeStr().equals(XtaFileXmlUtils.getRootTagName(doc)); - } catch (Exception e) { - LOG.warn("Error parsing xta file.", e); - return false; - } - } - - private static String getRootTagName(Document doc) { - return doc.getDocumentElement().getTagName(); - } - - static Document parse(XtaFile file) throws SAXException, IOException, ParserConfigurationException { - var document = XtaFileXmlUtils.createDocumentBuilder().parse(file.content().getDataSource().getInputStream()); - document.getDocumentElement().normalize(); - return document; - } - - private static DocumentBuilder createDocumentBuilder() throws ParserConfigurationException { - return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder(); - } -} \ No newline at end of file diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java index f80e00d71a0af61ccf86f2f3b703bc590ed16e2e..08df946a4f2ec6537405ba4ed79c37defa4fa9a7 100644 --- a/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java +++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/quittung/QuittungService.java @@ -10,8 +10,8 @@ import de.ozgcloud.archive.common.command.ArchiveManagerCommand; import de.ozgcloud.archive.common.command.CommandOrder; import de.ozgcloud.archive.common.command.CommandService; import de.ozgcloud.archive.common.xta.XtaFileHelper; +import de.ozgcloud.archive.common.xta.XtaFileParser; import de.ozgcloud.archive.common.xta.XtaFileType; -import de.ozgcloud.archive.common.xta.XtaFileXmlUtils; import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter; import de.ozgcloud.archive.common.xta.XtaService; import de.ozgcloud.command.Command; @@ -29,6 +29,7 @@ class QuittungService { private final XtaService xtaService; private final XtaFileHelper xtaFileHelper; + private final XtaFileParser xtaFileParser; private final CommandService commandService; @@ -45,7 +46,7 @@ class QuittungService { } boolean isImportConfirmation(XtaFile xtaFile) { - return XtaFileXmlUtils.isType(xtaFile, XtaFileType.IMPORT_CONFIRMATION); + return xtaFileParser.isType(xtaFile, XtaFileType.IMPORT_CONFIRMATION); } void handleAbgabe(XtaAbgabeAdapter abgabeHandler) { diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java index 1b7e8be653f0d5b7d46473310006f4e64c3d2f69..d034a25e99f4699183b736593be47bde4b271d41 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/AbgabeImportBestaetigen0402TestFactory.java @@ -29,6 +29,6 @@ public class AbgabeImportBestaetigen0402TestFactory { @SneakyThrows public static Document createAsDocument() { - return XtaFileXmlUtils.parse(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH)); + return DocumentTestFactory.createFrom(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH)); } } \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..36d4a24ef635b9f1b8f17493cf3cf86dfd21815d --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/DocumentTestFactory.java @@ -0,0 +1,23 @@ +package de.ozgcloud.archive.common.xta; + +import javax.xml.parsers.DocumentBuilderFactory; + +import org.w3c.dom.Document; + +import de.ozgcloud.xta.client.model.XtaFile; +import lombok.SneakyThrows; + +public class DocumentTestFactory { + + public static final XtaFile FILE = XtaFileTestFactory.create(); + + public static Document create() { + return createFrom(FILE); + } + + @SneakyThrows + public static Document createFrom(XtaFile file) { + return DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(file.content().getDataSource().getInputStream()); + } + +} diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..47cca112e543d89778b4f4ce4764d3c754d44a4e --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserITCase.java @@ -0,0 +1,38 @@ +package de.ozgcloud.archive.common.xta; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import de.ozgcloud.common.test.ITCase; + +@ITCase +class XtaFileParserITCase { + + @Autowired + private XtaFileParser parser; + + @DisplayName("Is import confirmation") + @Nested + class TestIsType { + + @Test + void shouldReturnTrueOnMatchingTag() { + var isImportConfirmation = parser.isType(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH), + XtaFileType.IMPORT_CONFIRMATION); + + assertThat(isImportConfirmation).isTrue(); + } + + @Test + void shouldReturnFalseOnNonMatchingTag() { + var isImportConfirmation = parser.isType(XtaFileTestFactory.create(), XtaFileType.ABGABE); + + assertThat(isImportConfirmation).isFalse(); + } + } + +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2f3713ad2b66b577bbda5200903e45f5fffc2cb2 --- /dev/null +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileParserTest.java @@ -0,0 +1,124 @@ +package de.ozgcloud.archive.common.xta; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + +import java.io.InputStream; + +import javax.xml.parsers.DocumentBuilder; + +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.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Spy; +import org.springframework.core.io.ClassPathResource; +import org.w3c.dom.Document; + +import de.ozgcloud.common.errorhandling.TechnicalException; +import de.ozgcloud.xta.client.model.XtaFile; +import lombok.SneakyThrows; + +class XtaFileParserTest { + + @Spy + @InjectMocks + private XtaFileParser parser; + + @Mock + private DocumentBuilder documentBuilder; + + @DisplayName("Is import confirmation") + @Nested + class TestIsType { + + private final XtaFile file = XtaFileTestFactory.create(); + + @Test + @SneakyThrows + void shouldCallParse() { + isType(); + + verify(parser).parse(file); + } + + @Test + @SneakyThrows + void shouldReturnTrueOnMatchingTag() { + doReturn(AbgabeImportBestaetigen0402TestFactory.createAsDocument()).when(parser).parse(file); + + var isImportConfirmation = isType(); + + assertThat(isImportConfirmation).isTrue(); + } + + @Test + @SneakyThrows + void shouldReturnFalseOnNonMatchingTag() { + doReturn(DocumentTestFactory.create()).when(parser).parse(file); + + var isImportConfirmation = isType(); + + assertThat(isImportConfirmation).isFalse(); + } + + @Test + @SneakyThrows + void shouldReturnFalseOnException() { + doThrow(TechnicalException.class).when(parser).parse(any()); + + var isType = isType(); + + assertThat(isType).isFalse(); + } + + private boolean isType() { + return parser.isType(file, XtaFileType.IMPORT_CONFIRMATION); + } + } + + @Nested + class TestParse { + + private final XtaFile file = XtaFileTestFactory.create(); + private final Document document = AbgabeImportBestaetigen0402TestFactory.createAsDocument(); + + @Captor + private ArgumentCaptor<InputStream> inputStreamCaptor; + + @BeforeEach + @SneakyThrows + void mock() { + when(documentBuilder.parse(any(InputStream.class))).thenReturn(document); + } + + @Test + @SneakyThrows + void shouldCallDocumentBuilder() { + var expectedBytes = new ClassPathResource(XtaFileTestFactory.DUMMY_XML_FILE_PATH).getContentAsByteArray(); + + parse(); + + verify(documentBuilder).parse(inputStreamCaptor.capture()); + assertThat(inputStreamCaptor.getValue().readAllBytes()).isEqualTo(expectedBytes); + } + + @Test + @SneakyThrows + void shouldReturnDocument() { + var result = parse(); + + assertThat(result).isEqualTo(document); + } + + @SneakyThrows + private Document parse() { + return parser.parse(file); + } + } +} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java index 35183dd9596733ce0d852458863f3a8b8ff1b6bd..4e03b8db6ffae2c86c18f18e07b03bda9231cb98 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileTestFactory.java @@ -10,7 +10,7 @@ import lombok.SneakyThrows; public class XtaFileTestFactory { - private static final String DUMMY_XML_FILE_PATH = "xml-templates/dummy.xml"; + public static final String DUMMY_XML_FILE_PATH = "xml-templates/dummy.xml"; public static XtaFile create() { return create(DUMMY_XML_FILE_PATH); diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileXmlUtilsTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileXmlUtilsTest.java deleted file mode 100644 index 9da78a09c2fd11e1c138a3dda8b39a5f73b873b7..0000000000000000000000000000000000000000 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/common/xta/XtaFileXmlUtilsTest.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.ozgcloud.archive.common.xta; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; - -import java.util.function.Consumer; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.MockedStatic; -import org.mockito.Mockito; - -import de.ozgcloud.common.errorhandling.TechnicalException; - -class XtaFileXmlUtilsTest { - - @DisplayName("Is import confirmation") - @Nested - class TestIsType { - - @Test - void shouldReturnTrueOnMatchingTag() { - var isImportConfirmation = XtaFileXmlUtils.isType(XtaFileTestFactory.create(AbgabeImportBestaetigen0402TestFactory.FILE_PATH), - XtaFileType.IMPORT_CONFIRMATION); - - assertThat(isImportConfirmation).isTrue(); - } - - @Test - void shouldReturnFalseOnNonMatchingTag() { - var isImportConfirmation = XtaFileXmlUtils.isType(XtaFileTestFactory.create(), XtaFileType.ABGABE); - - assertThat(isImportConfirmation).isFalse(); - } - - @Test - void shouldReturnFalseOnException() { - mockStatic(XtaFileXmlUtils.class, mock -> { - mock.when(() -> XtaFileXmlUtils.parse(any())).thenThrow(new TechnicalException("DummyException")); - - var isType = XtaFileXmlUtils.isType(XtaFileTestFactory.create(), XtaFileType.IMPORT_CONFIRMATION); - assertThat(isType).isFalse(); - }); - } - - private <T> void mockStatic(Class<T> clazz, Consumer<MockedStatic<T>> mockConfigurer) { - try (var staticMock = Mockito.mockStatic(clazz, Mockito.CALLS_REAL_METHODS)) { - mockConfigurer.accept(staticMock); - } - } - } -} \ No newline at end of file diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java index e2c6e9cd8d066e42cfceccacdf0edff16b2f44af..dc5082c545173554aaae0adf6f0e967b4565258b 100644 --- a/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java +++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/quittung/QuittungServiceTest.java @@ -12,6 +12,8 @@ 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.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; @@ -25,6 +27,9 @@ import de.ozgcloud.archive.common.command.CommandService; import de.ozgcloud.archive.common.command.CommandTestFactory; import de.ozgcloud.archive.common.xta.AbgabeImportBestaetigen0402TestFactory; import de.ozgcloud.archive.common.xta.XtaFileHelper; +import de.ozgcloud.archive.common.xta.XtaFileParser; +import de.ozgcloud.archive.common.xta.XtaFileTestFactory; +import de.ozgcloud.archive.common.xta.XtaFileType; import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler; import de.ozgcloud.archive.common.xta.XtaImportConfirmationHandler.XtaAbgabeAdapter; import de.ozgcloud.archive.common.xta.XtaMessageTestFactory; @@ -32,6 +37,7 @@ import de.ozgcloud.archive.common.xta.XtaService; import de.ozgcloud.archive.vorgang.VorgangWithEingangTestFactory; import de.ozgcloud.command.CommandExecutedEvent; import de.ozgcloud.command.CommandFailedEvent; +import de.ozgcloud.xta.client.model.XtaFile; import de.ozgcloud.xta.client.model.XtaMessage; class QuittungServiceTest { @@ -47,6 +53,8 @@ class QuittungServiceTest { private ApplicationEventPublisher eventPublisher; @Mock private XtaFileHelper xtaFileHelper; + @Mock + private XtaFileParser xtaFileParser; @Nested class TestFetchQuittung { @@ -132,6 +140,30 @@ class QuittungServiceTest { } } + @Nested + class TestIsImportConfirmation { + + private XtaFile xtaFile = XtaFileTestFactory.create(); + + @Test + void shouldCallXtaFileParser() { + service.isImportConfirmation(xtaFile); + + verify(xtaFileParser).isType(xtaFile, XtaFileType.IMPORT_CONFIRMATION); + } + + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void shouldReturnIsType(boolean isImportConfirmation) { + when(xtaFileParser.isType(any(), any())).thenReturn(isImportConfirmation); + + var returnValue = service.isImportConfirmation(xtaFile); + + assertThat(returnValue).isEqualTo(isImportConfirmation); + } + + } + @DisplayName("Handle abgabe") @Nested class TestHandleAbgabe {