From a4fc76aaf2c60c57dcc39d396f27496a96ebe7d7 Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Thu, 13 Feb 2025 15:04:51 +0100
Subject: [PATCH] OZG-4097 itcase: Try out grpc mocking with wiremock

---
 pom.xml                                       |  8 +++
 .../postfach/osiv2/ServiceIfOsi2Enabled.java  |  7 +++
 .../osiv2/config/ApiClientConfiguration.java  |  7 ++-
 .../storage/Osi2BinaryFileRemoteService.java  |  2 +
 src/main/resources/application-local.yml      |  8 ++-
 src/main/resources/application.yml            |  3 +-
 .../osiv2/OsiPostfachRemoteServiceITCase.java | 21 +++++++
 .../VorgangManagerServerExtension.java        | 63 +++++++++++++++++++
 src/test/resources/application-itcase.yml     |  8 ++-
 9 files changed, 123 insertions(+), 4 deletions(-)
 create mode 100644 src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java

diff --git a/pom.xml b/pom.xml
index 57d54c0..9458fa6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,6 +22,7 @@
 		<openapi-generator.version>7.11.0</openapi-generator.version>
 		<swagger-parser.version>2.1.23</swagger-parser.version>
 		<wiremock-spring-boot.version>3.6.0</wiremock-spring-boot.version>
+		<wiremock-grpc-extension.version>0.9.0</wiremock-grpc-extension.version>
 	</properties>
 	<dependencies>
 		<!-- OZG-Cloud -->
@@ -85,6 +86,13 @@
 			<version>${wiremock-spring-boot.version}</version>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.wiremock</groupId>
+			<artifactId>wiremock-grpc-extension-jetty12</artifactId>
+			<version>${wiremock-grpc-extension.version}</version>
+			<scope>test</scope>
+		</dependency>
+
 
 		<!-- commons -->
 		<dependency>
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java
index 2aa3c2c..a497099 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java
@@ -1,10 +1,17 @@
 package de.ozgcloud.nachrichten.postfach.osiv2;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.nachrichten.postfach.osiv2.config.Osi2PostfachProperties;
 
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
 @Service
 @ConditionalOnProperty(prefix = Osi2PostfachProperties.PREFIX, name = "enabled", havingValue = "true")
 public @interface ServiceIfOsi2Enabled {
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java
index e9948c3..d5403ac 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java
@@ -11,7 +11,6 @@ import org.springframework.context.annotation.Configuration;
 import org.springframework.http.client.ClientHttpRequestFactory;
 import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
 import org.springframework.http.converter.FormHttpMessageConverter;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
 import org.springframework.security.oauth2.client.AuthorizedClientServiceOAuth2AuthorizedClientManager;
 import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService;
 import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider;
@@ -31,6 +30,7 @@ import org.springframework.web.client.RestClient;
 
 import de.ozgcloud.nachrichten.postfach.osiv2.gen.ApiClient;
 import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.MessageExchangeApi;
+import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.QuarantineApi;
 import lombok.RequiredArgsConstructor;
 
 @Configuration
@@ -49,6 +49,11 @@ public class ApiClientConfiguration {
 		return new MessageExchangeApi(apiClient);
 	}
 
+	@Bean
+	QuarantineApi quarantineApi(ApiClient apiClient) {
+		return new QuarantineApi(apiClient);
+	}
+
 	@Bean
 	ApiClient apiClient() {
 		var apiClient = new ApiClient(restClient());
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java
index efa3a16..6c4acaf 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java
@@ -11,11 +11,13 @@ import de.ozgcloud.vorgang.grpc.binaryFile.GrpcBinaryFilesRequest;
 import de.ozgcloud.vorgang.grpc.binaryFile.GrpcGetBinaryFileDataRequest;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.log4j.Log4j2;
+import net.devh.boot.grpc.client.inject.GrpcClient;
 
 @Log4j2
 @ServiceIfOsi2Enabled
 @RequiredArgsConstructor
 public class Osi2BinaryFileRemoteService {
+	@GrpcClient("vorgang-manager")
 	private final BinaryFileServiceGrpc.BinaryFileServiceBlockingStub binaryFileService;
 	private final Osi2BinaryFileMapper binaryFileMapper;
 
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index dcbea65..47df577 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -2,4 +2,10 @@ logging:
   level:
     de.ozgcloud.nachrichten.postfach.osiv2: DEBUG
     org.springframework.http: DEBUG
-    org.springframework.web.client: DEBUG
\ No newline at end of file
+    org.springframework.web.client: DEBUG
+
+grpc:
+  client:
+    vorgang-manager:
+      address: static://127.0.0.1:9090
+      negotiationType: PLAINTEXT
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 065fffe..6b2cd38 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,3 +1,4 @@
 spring:
   jackson:
-    default-property-inclusion: NON_NULL
\ No newline at end of file
+    default-property-inclusion: NON_NULL
+
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
index 94405d6..b20578b 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
@@ -17,13 +17,18 @@ import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.DynamicPropertyRegistry;
 import org.springframework.test.context.DynamicPropertySource;
 import org.springframework.test.context.TestPropertySource;
+import org.wiremock.grpc.dsl.WireMockGrpcService;
 
 import com.github.tomakehurst.wiremock.WireMockServer;
 import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder;
 
+import de.ozgcloud.nachrichten.postfach.PostfachException;
+import de.ozgcloud.nachrichten.postfach.PostfachMessageCode;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
+import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException;
 import de.ozgcloud.nachrichten.postfach.osiv2.extension.Jwt;
 import de.ozgcloud.nachrichten.postfach.osiv2.extension.OsiMockServerExtension;
+import de.ozgcloud.nachrichten.postfach.osiv2.extension.VorgangManagerServerExtension;
 import de.ozgcloud.nachrichten.postfach.osiv2.factory.JsonUtil;
 import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeReceiveMessagesResponseTestFactory;
 import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeSendMessageResponseTestFactory;
@@ -41,6 +46,9 @@ class OsiPostfachRemoteServiceITCase {
 	@RegisterExtension
 	static final OsiMockServerExtension OSI_MOCK_SERVER_EXTENSION = new OsiMockServerExtension();
 
+	@RegisterExtension
+	static final VorgangManagerServerExtension VORGANG_MANAGER_SERVER_EXTENSION = new VorgangManagerServerExtension();
+
 	private final PostfachNachricht postfachNachricht = PostfachNachrichtTestFactory.create();
 
 	@Autowired
@@ -53,14 +61,17 @@ class OsiPostfachRemoteServiceITCase {
 		registry.add("ozgcloud.osiv2.auth.client-id", () -> CLIENT_ID);
 		registry.add("ozgcloud.osiv2.api.url", OSI_MOCK_SERVER_EXTENSION::getPostfachFacadeUrl);
 		registry.add("ozgcloud.osiv2.auth.resource", () -> RESOURCE_URN);
+		registry.add("grpc.client.vorgang-manager.address", VORGANG_MANAGER_SERVER_EXTENSION::getVorgangManagerAddress);
 	}
 
 	private WireMockServer postfachFacadeMockServer;
+	private WireMockGrpcService binaryFileMockService;
 
 	@BeforeEach
 	@SneakyThrows
 	public void setup() {
 		postfachFacadeMockServer = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockServer();
+		binaryFileMockService = VORGANG_MANAGER_SERVER_EXTENSION.getBinaryFileServiceGrpcService();
 	}
 
 	@DisplayName("should send request with jwt")
@@ -87,6 +98,16 @@ class OsiPostfachRemoteServiceITCase {
 		assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN);
 	}
 
+	@DisplayName("should throw postfach exception with connection error code")
+	@Test
+	void shouldThrowPostfachExceptionWithConnectionErrorCode() {
+		postfachFacadeMockServer.stop();
+
+		assertThatThrownBy(() -> osiPostfachRemoteService.sendMessage(postfachNachricht))
+				.isInstanceOf(Osi2PostfachException.class)
+				.hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE);
+	}
+
 	@DisplayName("should receive one messages")
 	@Test
 	@SneakyThrows
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java
new file mode 100644
index 0000000..947d0e7
--- /dev/null
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java
@@ -0,0 +1,63 @@
+package de.ozgcloud.nachrichten.postfach.osiv2.extension;
+
+import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.*;
+
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.wiremock.grpc.GrpcExtensionFactory;
+import org.wiremock.grpc.Jetty12GrpcExtensionFactory;
+import org.wiremock.grpc.dsl.WireMockGrpcService;
+
+import com.github.tomakehurst.wiremock.WireMockServer;
+import com.github.tomakehurst.wiremock.client.WireMock;
+
+import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.log4j.Log4j2;
+
+@Log4j2
+@Getter
+@RequiredArgsConstructor
+public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAllCallback, AfterEachCallback {
+
+	private WireMockServer vorgangManagerMockServer;
+	private WireMockGrpcService binaryFileServiceGrpcService;
+
+	@Override
+	public void beforeAll(ExtensionContext context) {
+		setupVorgangManagerMock();
+		binaryFileServiceGrpcService = new WireMockGrpcService(
+				new WireMock(vorgangManagerMockServer),
+				BinaryFileServiceGrpc.SERVICE_NAME
+        );
+	}
+
+	@Override
+	public void afterEach(ExtensionContext context) {
+		binaryFileServiceGrpcService.resetAll();
+		vorgangManagerMockServer.resetAll();
+	}
+
+	@Override
+	public void afterAll(ExtensionContext context) {
+		vorgangManagerMockServer.shutdown();
+	}
+
+	private void setupVorgangManagerMock() {
+		vorgangManagerMockServer = new WireMockServer(
+				wireMockConfig()
+						.dynamicPort()
+						.extensions(new Jetty12GrpcExtensionFactory())
+		);
+		vorgangManagerMockServer.start();
+	}
+
+	public String getVorgangManagerAddress() {
+		return "static://127.0.0.1:%d".formatted(vorgangManagerMockServer.port());
+	}
+
+
+}
diff --git a/src/test/resources/application-itcase.yml b/src/test/resources/application-itcase.yml
index 41e8478..cbafa6a 100644
--- a/src/test/resources/application-itcase.yml
+++ b/src/test/resources/application-itcase.yml
@@ -5,4 +5,10 @@ logging:
   level:
     de.ozgcloud.nachrichten.postfach.osiv2: DEBUG
     org.springframework.http: DEBUG
-    org.springframework.web.client: DEBUG
\ No newline at end of file
+    org.springframework.web.client: DEBUG
+
+grpc:
+  client:
+    vorgang-manager:
+      address: static://127.0.0.1:9090
+      negotiationType: PLAINTEXT
\ No newline at end of file
-- 
GitLab