From 8ecc982ea79ae0e72aad15ae99d64c4319fd0f70 Mon Sep 17 00:00:00 2001
From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com>
Date: Wed, 19 Mar 2025 14:43:10 +0100
Subject: [PATCH] OZG-7573 OZG-7923 More tests

---
 .../redirect/ForwardingRemoteService.java     |  7 +-
 .../redirect/ForwardingRemoteServiceTest.java | 94 +++++++++++++++++++
 2 files changed, 97 insertions(+), 4 deletions(-)

diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java
index 416b80956..533e68341 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java
@@ -24,7 +24,6 @@
 package de.ozgcloud.vorgang.vorgang.redirect;
 
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
 
 import org.springframework.stereotype.Service;
 
@@ -77,11 +76,11 @@ class ForwardingRemoteService {
 		return GrpcRouteForwardingRequest.newBuilder().setRouteForwarding(routeForwarding).build();
 	}
 
-	private static void waitForCompletion(CompletableFuture<Void> responseFuture) {
+	void waitForCompletion(CompletableFuture<Void> responseFuture) {
 		try {
 			responseFuture.get();
-		} catch (InterruptedException | ExecutionException e) {
-			throw new TechnicalException("Forwarding failed", e);
+		} catch (Throwable t) {
+			throw new TechnicalException("Forwarding failed", t);
 		}
 	}
 
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java
index bef62d1fa..4ddbc9bc2 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java
@@ -26,13 +26,19 @@ package de.ozgcloud.vorgang.vorgang.redirect;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import java.util.concurrent.CompletableFuture;
+
 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.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Spy;
 
+import de.ozgcloud.common.errorhandling.TechnicalException;
+import de.ozgcloud.common.test.ReflectionTestUtils;
 import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc;
 import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding;
 import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest;
@@ -44,6 +50,7 @@ import de.ozgcloud.vorgang.vorgang.VorgangService;
 import de.ozgcloud.vorgang.vorgang.VorgangTestFactory;
 import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRemoteService.ForwardingResponseObserver;
 import io.grpc.stub.StreamObserver;
+import lombok.SneakyThrows;
 
 class ForwardingRemoteServiceTest {
 
@@ -66,7 +73,36 @@ class ForwardingRemoteServiceTest {
 	@Nested
 	class TestForward {
 
+		@Captor
+		private ArgumentCaptor<ForwardingResponseObserver> responseObserverCaptor;
+		@Captor
+		private ArgumentCaptor<CompletableFuture<Void>> futureCaptor;
+
+		@BeforeEach
+		void init() {
+			doNothing().when(service).routeForwarding(any(), any());
+			doNothing().when(service).waitForCompletion(any());
+		}
+
+		@Test
+		void shouldRouteForwarding() {
+			forward();
+
+			verify(service).routeForwarding(eq(request), any(ForwardingResponseObserver.class));
+		}
+
+		@Test
+		void shouldWaitForCompletion() {
+			forward();
+
+			verify(service).waitForCompletion(futureCaptor.capture());
+			verify(service).routeForwarding(any(), responseObserverCaptor.capture());
+			assertThat(futureCaptor.getValue()).isSameAs(ReflectionTestUtils.getField(responseObserverCaptor.getValue(), "future", CompletableFuture.class));
+		}
 
+		private void forward() {
+			service.forward(request);
+		}
 	}
 
 	@Nested
@@ -135,6 +171,7 @@ class ForwardingRemoteServiceTest {
 				doThrow(error).when(service).sendEingang(any(), any());
 			}
 
+			@SuppressWarnings("ResultOfMethodCallIgnored")
 			@Test
 			void shouldCallOnError() {
 				catchThrowableOfType(RuntimeException.class, TestRouteForwarding.this::routeForwarding);
@@ -225,4 +262,61 @@ class ForwardingRemoteServiceTest {
 			return service.buildRouteForwardingRequest(request, eingang);
 		}
 	}
+
+	@Nested
+	class TestWaitForCompletion {
+
+		@Mock
+		private CompletableFuture<Void> future;
+
+		@SneakyThrows
+		@Test
+		void shouldGetFromFuture() {
+			waitForCompletion();
+
+			verify(future).get();
+		}
+
+		@SneakyThrows
+		@Test
+		void shouldThrowTechnicalException() {
+			var exception = new RuntimeException();
+			when(future.get()).thenThrow(exception);
+
+			assertThatThrownBy(this::waitForCompletion).isInstanceOf(TechnicalException.class).hasCause(exception);
+		}
+
+		private void waitForCompletion() {
+			service.waitForCompletion(future);
+		}
+	}
+
+	@Nested
+	class ForwardingResponseObserverTest {
+
+		@Mock
+		private CompletableFuture<Void> future;
+		private ForwardingResponseObserver responseObserver;
+
+		@BeforeEach
+		void init() {
+			responseObserver = new ForwardingResponseObserver(future);
+		}
+
+		@Test
+		void shouldCompleteExceptionallyOnError() {
+			var error = new Throwable();
+
+			responseObserver.onError(error);
+
+			verify(future).completeExceptionally(error);
+		}
+
+		@Test
+		void shouldCompleteOnCompleted() {
+			responseObserver.onCompleted();
+
+			verify(future).complete(null);
+		}
+	}
 }
-- 
GitLab