From 4f6d91b1200766ab9c0e95f760d30cd1616f88ad Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Sun, 26 Feb 2023 21:34:56 +0100
Subject: [PATCH] OZG-3371 implement BayernID Postfach remote service ITCase

Sub-task: OZG-3496
---
 .../bayernid/BayernIdPostfachClient.java      |   6 ++
 pluto-server/pom.xml                          |  11 +-
 .../ozg/mail/postfach/PostfachMailITCase.java |   6 +-
 .../BayernIdPostfachServiceITCase.java        |  96 ++++++++++++++++++
 .../osi/OsiPostfachServiceITCase.java         |   4 +-
 .../application-itcase-bayernid-postfach.yml  |  13 +++
 .../application-itcase-osi-postfach.yml       |   9 ++
 .../src/test/resources/application-itcase.yml |  10 --
 pluto-server/src/test/resources/bayernid.p12  | Bin 0 -> 6349 bytes
 .../src/test/resources/bayernid/bsp-nachricht |   1 +
 .../src/test/resources/bayernid/bsp-quittung  |   9 ++
 .../bayernid/bsp-quittung-error-in-schema     |   9 ++
 12 files changed, 161 insertions(+), 13 deletions(-)
 create mode 100644 pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachServiceITCase.java
 create mode 100644 pluto-server/src/test/resources/application-itcase-bayernid-postfach.yml
 create mode 100644 pluto-server/src/test/resources/application-itcase-osi-postfach.yml
 create mode 100644 pluto-server/src/test/resources/bayernid.p12
 create mode 100644 pluto-server/src/test/resources/bayernid/bsp-nachricht
 create mode 100644 pluto-server/src/test/resources/bayernid/bsp-quittung
 create mode 100644 pluto-server/src/test/resources/bayernid/bsp-quittung-error-in-schema

diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachClient.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachClient.java
index 902912fdb..98b800858 100644
--- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachClient.java
+++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachClient.java
@@ -4,6 +4,7 @@ import javax.xml.bind.JAXBElement;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.oxm.jaxb.Jaxb2Marshaller;
+import org.springframework.ws.client.core.WebServiceTemplate;
 import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
 import org.springframework.xml.transform.StringResult;
 import org.springframework.xml.transform.StringSource;
@@ -40,4 +41,9 @@ class BayernIdPostfachClient extends WebServiceGatewaySupport {
 
 		return reply.getValue();
 	}
+
+	public WebServiceTemplate getWSTemplate() {
+		return this.getWebServiceTemplate();
+	}
+
 }
diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml
index 47476f7b2..0663b55b1 100644
--- a/pluto-server/pom.xml
+++ b/pluto-server/pom.xml
@@ -55,8 +55,10 @@
 		<jsoup.version>1.15.3</jsoup.version>
 		<mongock.version>5.1.4</mongock.version>
 		<testcontainer.version>1.17.3</testcontainer.version>
-		
+
 		<maven-deploy-plugin.version>3.0.0</maven-deploy-plugin.version>
+
+		<spring-ws-test.version>2.0.2.RELEASE</spring-ws-test.version>
 	</properties>
 
 	<dependencies>
@@ -256,6 +258,13 @@
 			<groupId>org.springframework.security</groupId>
 			<artifactId>spring-security-test</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>org.springframework.ws</groupId>
+			<artifactId>spring-ws-test</artifactId>
+			<version>${spring-ws-test.version}</version>
+			<scope>test</scope>
+		</dependency>
+
 
 		<dependency>
 			<groupId>org.junit.jupiter</groupId>
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/PostfachMailITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/PostfachMailITCase.java
index 7a52b898a..f51a80074 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/PostfachMailITCase.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/PostfachMailITCase.java
@@ -34,7 +34,9 @@ import java.time.temporal.ChronoUnit;
 import java.util.List;
 
 import org.assertj.core.api.Assertions;
-import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;
@@ -45,6 +47,7 @@ import org.springframework.data.mongodb.core.MongoOperations;
 import org.springframework.http.HttpMethod;
 import org.springframework.http.MediaType;
 import org.springframework.security.test.context.support.WithMockUser;
+import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.web.client.ExpectedCount;
 import org.springframework.test.web.client.MockRestServiceServer;
 import org.springframework.web.client.RestTemplate;
@@ -65,6 +68,7 @@ import io.grpc.stub.StreamObserver;
 @SpringBootTest(classes = { PlutoServerApplication.class, OsiPostfachProperties.class })
 @DataITCase
 @WithMockUser
+@ActiveProfiles({ "itcase", "with_db", "itcase-osi-postfach" })
 class PostfachMailITCase {
 
 	private static final String TEST_OSI_POSTFACH_URI = "http://localhost/ApiProxy/V1/Message";
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachServiceITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachServiceITCase.java
new file mode 100644
index 000000000..c41fab7dc
--- /dev/null
+++ b/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/bayernid/BayernIdPostfachServiceITCase.java
@@ -0,0 +1,96 @@
+package de.itvsh.ozg.mail.postfach.bayernid;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.springframework.ws.test.client.RequestMatchers.*;
+import static org.springframework.ws.test.client.ResponseCreators.*;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.core.io.Resource;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit4.SpringRunner;
+import org.springframework.ws.test.client.MockWebServiceServer;
+
+import de.itvsh.kop.common.test.ITCase;
+import de.itvsh.ozg.mail.postfach.PostfachAddressTestFactory;
+import de.itvsh.ozg.mail.postfach.PostfachBadRequestException;
+import de.itvsh.ozg.mail.postfach.PostfachNachrichtTestFactory;
+import de.itvsh.ozg.mail.postfach.StringBasedIdentifier;
+import de.itvsh.ozg.pluto.PlutoServerApplication;
+import lombok.val;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = { PlutoServerApplication.class, BayernIdProperties.class })
+@ITCase
+@ActiveProfiles({ "itcase", "itcase-bayernid-postfach" })
+class BayernIdPostfachServiceITCase {
+
+	@Autowired
+	private BayernIdPostfachRemoteService bayernIdPostfachRemoteService;
+
+	@Autowired
+	private BayernIdPostfachClient bayernIdPostfachClient;
+
+	@Value("classpath:bayernid/bsp-nachricht")
+	private Resource bspNachrichtNativeResource;
+
+	@Value("classpath:bayernid/bsp-quittung")
+	private Resource bspQuittungNativeResource;
+
+	@Value("classpath:bayernid/bsp-quittung-error-in-schema")
+	private Resource bspQuittungErrorNativeResource;
+
+	private MockWebServiceServer mockWebServiceServer;
+
+	@BeforeEach
+	void createMockWebServiceServer() {
+		mockWebServiceServer = MockWebServiceServer.createServer(bayernIdPostfachClient.getWSTemplate());
+	}
+
+	@Test
+	void shouldSendMessageSuccessfully() throws IOException {
+		mockWebServiceServer.expect(payload(bspNachrichtNativeResource)).andRespond(withPayload(bspQuittungNativeResource));
+
+		val nachricht = PostfachNachrichtTestFactory.createBuilder()
+				.vorgangId("1")
+				.postfachAddress(PostfachAddressTestFactory.createBuilder()
+						.type(PostfachAddressTestFactory.TYPE)
+						.version(PostfachAddressTestFactory.VERSION)
+						.identifier(StringBasedIdentifier.builder().postfachId("1").build())
+						.build())
+				.messageId("1")
+				.attachments(Collections.emptyList())
+				.build();
+
+		assertThatCode(() -> bayernIdPostfachRemoteService.sendMessage(nachricht)).doesNotThrowAnyException();
+
+		mockWebServiceServer.verify();
+	}
+
+	@Test
+	void shouldThrowPostfachBadRequestException() throws IOException {
+		mockWebServiceServer.expect(payload(bspNachrichtNativeResource)).andRespond(withPayload(bspQuittungErrorNativeResource));
+
+		val nachricht = PostfachNachrichtTestFactory.createBuilder()
+				.vorgangId("1")
+				.postfachAddress(PostfachAddressTestFactory.createBuilder()
+						.type(PostfachAddressTestFactory.TYPE)
+						.version(PostfachAddressTestFactory.VERSION)
+						.identifier(StringBasedIdentifier.builder().postfachId("1").build())
+						.build())
+				.messageId("1")
+				.attachments(Collections.emptyList())
+				.build();
+
+		assertThatThrownBy(() -> bayernIdPostfachRemoteService.sendMessage(nachricht)).isInstanceOf(PostfachBadRequestException.class);
+
+		mockWebServiceServer.verify();
+	}
+}
diff --git a/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachServiceITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachServiceITCase.java
index aa1866a4c..bc9966216 100644
--- a/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachServiceITCase.java
+++ b/pluto-server/src/test/java/de/itvsh/ozg/mail/postfach/osi/OsiPostfachServiceITCase.java
@@ -29,7 +29,9 @@ import static org.springframework.test.web.client.response.MockRestResponseCreat
 
 import java.util.Collections;
 
-import org.junit.jupiter.api.*;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.http.MediaType;
diff --git a/pluto-server/src/test/resources/application-itcase-bayernid-postfach.yml b/pluto-server/src/test/resources/application-itcase-bayernid-postfach.yml
new file mode 100644
index 000000000..c2694bddb
--- /dev/null
+++ b/pluto-server/src/test/resources/application-itcase-bayernid-postfach.yml
@@ -0,0 +1,13 @@
+ozgcloud:
+  bayernid:
+    server: http://localhost
+    zertifikat:
+      keystore: classpath:bayernid.p12
+      password: SyPaRAxe97
+    absender:
+      postkorbId: 28721c6f-b78f-4d5c-a048-19fd2fc429d2
+      name: test name
+      anschrift: Niemalsgasse 5, 99999 Irgendwo Stadt
+      dienst: Stadtverwaltung
+      mandant: Fürth
+      gemeindeSchluessel: 09563000
\ No newline at end of file
diff --git a/pluto-server/src/test/resources/application-itcase-osi-postfach.yml b/pluto-server/src/test/resources/application-itcase-osi-postfach.yml
new file mode 100644
index 000000000..32f273be9
--- /dev/null
+++ b/pluto-server/src/test/resources/application-itcase-osi-postfach.yml
@@ -0,0 +1,9 @@
+kop:
+  osi:
+    postfach:
+      proxyapi:
+        url: http://localhost/ApiProxy/V1/Message
+        key: 1234
+        realm: test-realm
+  notification:
+    mail-from: test@local.host
diff --git a/pluto-server/src/test/resources/application-itcase.yml b/pluto-server/src/test/resources/application-itcase.yml
index 8af9c9e71..56b72852a 100644
--- a/pluto-server/src/test/resources/application-itcase.yml
+++ b/pluto-server/src/test/resources/application-itcase.yml
@@ -12,15 +12,5 @@ grpc:
     
 aktenzeichen: de.itvsh.ozg.pluto.vorgang.AktenzeichenProviderEA
 
-kop:
-  osi:
-    postfach:
-      proxyapi:
-        url: http://localhost/ApiProxy/V1/Message
-        key: 1234
-        realm: test-realm
-  notification:
-    mail-from: test@local.host
-
 mongock:
   enabled: false
\ No newline at end of file
diff --git a/pluto-server/src/test/resources/bayernid.p12 b/pluto-server/src/test/resources/bayernid.p12
new file mode 100644
index 0000000000000000000000000000000000000000..fa82ce9007cc50831496073cdb03d8b6a92b5ee4
GIT binary patch
literal 6349
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
Tvzv}ZT5L>J)@Nd7oWKA8<KO^t

literal 0
HcmV?d00001

diff --git a/pluto-server/src/test/resources/bayernid/bsp-nachricht b/pluto-server/src/test/resources/bayernid/bsp-nachricht
new file mode 100644
index 000000000..531b80b09
--- /dev/null
+++ b/pluto-server/src/test/resources/bayernid/bsp-nachricht
@@ -0,0 +1 @@
+<ns4:sendBspNachrichtNative xmlns:ns3="http://www.akdb.de/egov/bsp/nachrichten" xmlns:ns4="urn:akdb:bsp:postkorb:komm:webservice"><bspNachricht>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;&lt;ns2:BspNachricht xmlns:ns2="http://www.akdb.de/egov/bsp/nachrichten" xmlns:ns3="urn:akdb:bsp:postkorb:komm:webservice"&gt;&lt;ns2:NachrichtenKopf&gt;&lt;ns2:Identifikation.Nachricht&gt;&lt;ns2:Erstellungszeitpunkt&gt;2020-04-01T10:30:10.000Z&lt;/ns2:Erstellungszeitpunkt&gt;&lt;ns2:NachrichtenId&gt;1&lt;/ns2:NachrichtenId&gt;&lt;/ns2:Identifikation.Nachricht&gt;&lt;ns2:Absender&gt;&lt;ns2:Dienst&gt;Stadtverwaltung&lt;/ns2:Dienst&gt;&lt;ns2:Mandant&gt;Fürth&lt;/ns2:Mandant&gt;&lt;ns2:Gemeindeschluessel&gt;&lt;ns2:Tabelle&gt;36&lt;/ns2:Tabelle&gt;&lt;ns2:Schluessel&gt;09563000&lt;/ns2:Schluessel&gt;&lt;/ns2:Gemeindeschluessel&gt;&lt;/ns2:Absender&gt;&lt;ns2:Empfaenger&gt;&lt;ns2:PostkorbId&gt;1&lt;/ns2:PostkorbId&gt;&lt;/ns2:Empfaenger&gt;&lt;/ns2:NachrichtenKopf&gt;&lt;ns2:NachrichtenInhalt&gt;&lt;ns2:Betreff&gt;Test Subject&lt;/ns2:Betreff&gt;&lt;ns2:StorkQaaLevel&gt;LEVEL_1&lt;/ns2:StorkQaaLevel&gt;&lt;ns2:ZuVorgang&gt;&lt;ns2:VorgangsId&gt;1&lt;/ns2:VorgangsId&gt;&lt;/ns2:ZuVorgang&gt;&lt;ns2:FreiText&gt;&lt;ns2:Encoding&gt;&lt;ns2:Tabelle&gt;9004&lt;/ns2:Tabelle&gt;&lt;ns2:Schluessel&gt;text/plain&lt;/ns2:Schluessel&gt;&lt;/ns2:Encoding&gt;&lt;ns2:Text&gt;BodyString&lt;/ns2:Text&gt;&lt;/ns2:FreiText&gt;&lt;/ns2:NachrichtenInhalt&gt;&lt;/ns2:BspNachricht&gt;</bspNachricht></ns4:sendBspNachrichtNative>
\ No newline at end of file
diff --git a/pluto-server/src/test/resources/bayernid/bsp-quittung b/pluto-server/src/test/resources/bayernid/bsp-quittung
new file mode 100644
index 000000000..15782e2e4
--- /dev/null
+++ b/pluto-server/src/test/resources/bayernid/bsp-quittung
@@ -0,0 +1,9 @@
+<ns2:sendBspNachrichtNativeOutput xmlns:ns2="urn:akdb:bsp:postkorb:komm:webservice"><bspQuittung>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
+&lt;BspQuittung version="1.5" fassung="2020-03-15" xmlns="http://www.akdb.de/egov/bsp/nachrichten"&gt;
+    &lt;AnnahmeErfolgreich&gt;true&lt;/AnnahmeErfolgreich&gt;
+    &lt;ErgebnisStatus&gt;
+        &lt;Tabelle&gt;9006&lt;/Tabelle&gt;
+        &lt;Schluessel&gt;0&lt;/Schluessel&gt;
+    &lt;/ErgebnisStatus&gt;
+&lt;/BspQuittung&gt;
+</bspQuittung></ns2:sendBspNachrichtNativeOutput>
\ No newline at end of file
diff --git a/pluto-server/src/test/resources/bayernid/bsp-quittung-error-in-schema b/pluto-server/src/test/resources/bayernid/bsp-quittung-error-in-schema
new file mode 100644
index 000000000..a1cbbc080
--- /dev/null
+++ b/pluto-server/src/test/resources/bayernid/bsp-quittung-error-in-schema
@@ -0,0 +1,9 @@
+<ns2:sendBspNachrichtNativeOutput xmlns:ns2="urn:akdb:bsp:postkorb:komm:webservice"><bspQuittung>&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt;
+&lt;BspQuittung version="1.5" fassung="2020-03-15" xmlns="http://www.akdb.de/egov/bsp/nachrichten"&gt;
+    &lt;AnnahmeErfolgreich&gt;false&lt;/AnnahmeErfolgreich&gt;
+    &lt;ErgebnisStatus&gt;
+        &lt;Tabelle&gt;9006&lt;/Tabelle&gt;
+        &lt;Schluessel&gt;20&lt;/Schluessel&gt;
+    &lt;/ErgebnisStatus&gt;
+&lt;/BspQuittung&gt;
+</bspQuittung></ns2:sendBspNachrichtNativeOutput>
\ No newline at end of file
-- 
GitLab