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 c615f1720ff76b9f71cc433e7158822dc606bd10..7f74468d3f1a1672c31df0293e0327cf4f3e2382 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 @@ -162,11 +162,11 @@ class ForwardingRemoteService { } } - 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 ccebcdf9118535c115a0a1ffc033066c7b5d5f69..653549de0e8b8814b8c3c53a50ea928625bb8303 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 @@ -52,17 +52,21 @@ import org.mockito.Spy; import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils; import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; 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; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; import de.ozgcloud.vorgang.files.FileService; +import de.ozgcloud.vorgang.vorgang.Eingang; import de.ozgcloud.vorgang.vorgang.EingangTestFactory; import de.ozgcloud.vorgang.vorgang.IncomingFile; import de.ozgcloud.vorgang.vorgang.IncomingFileGroup; import de.ozgcloud.vorgang.vorgang.IncomingFileGroupTestFactory; import de.ozgcloud.vorgang.vorgang.IncomingFileMapper; import de.ozgcloud.vorgang.vorgang.IncomingFileTestFactory; +import de.ozgcloud.vorgang.vorgang.Vorgang; import de.ozgcloud.vorgang.vorgang.VorgangService; import de.ozgcloud.vorgang.vorgang.VorgangTestFactory; import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRemoteService.ForwardingResponseObserver; @@ -78,7 +82,7 @@ class ForwardingRemoteServiceTest { @Mock private VorgangService vorgangService; @Mock - private ForwardingRemoteService forwardingRemoteService; + private ForwardingRequestMapper forwardingRequestMapper; @Mock private RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; @Mock @@ -89,10 +93,43 @@ class ForwardingRemoteServiceTest { @Mock private StreamObserver<GrpcRouteForwardingRequest> requestObserver; private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + private final Eingang eingang = EingangTestFactory.create(); + private final Vorgang vorgang = VorgangTestFactory.createBuilder().clearEingangs().eingang(eingang).build(); @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 @@ -161,6 +198,7 @@ class ForwardingRemoteServiceTest { doThrow(error).when(service).sendEingang(any(), any()); } + @SuppressWarnings("ResultOfMethodCallIgnored") @Test void shouldCallOnError() { catchThrowableOfType(RuntimeException.class, TestRouteForwarding.this::routeForwarding); @@ -189,10 +227,12 @@ class ForwardingRemoteServiceTest { @Nested class TestSendEingang { + private final GrpcRouteForwardingRequest routeForwardingRequest = GrpcRouteForwardingRequestTestFactory.create(); + @BeforeEach void init() { - when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); - doReturn(GrpcRouteForwardingRequestTestFactory.create()).when(service).buildRouteForwardingRequest(any(), any()); + when(vorgangService.getById(any())).thenReturn(vorgang); + doReturn(routeForwardingRequest).when(service).buildRouteForwardingRequest(any(), any()); doNothing().when(service).sendAttachments(any(), any()); } @@ -203,6 +243,19 @@ class ForwardingRemoteServiceTest { verify(vorgangService).getById(VorgangTestFactory.ID); } + void shouldBuildRouteForwardingRequest() { + sendEingang(); + + verify(service).buildRouteForwardingRequest(request, eingang); + } + + @Test + void shouldSendForwardingRequest() { + sendEingang(); + + verify(requestObserver).onNext(routeForwardingRequest); + } + @Test void shouldCallSendAttachments() { sendEingang(); @@ -215,6 +268,35 @@ class ForwardingRemoteServiceTest { } } + @Nested + class TestBuildRouteForwardingRequest { + + private final GrpcRouteForwarding routeForwarding = GrpcRouteForwardingTestFactory.create(); + + @BeforeEach + void init() { + when(forwardingRequestMapper.toGrpcRouteForwarding(any(), any())).thenReturn(routeForwarding); + } + + @Test + void shouldMapToRouteForwarding() { + buildRouteForwardingRequest(); + + verify(forwardingRequestMapper).toGrpcRouteForwarding(request, eingang); + } + + @Test + void shouldReturnRouteForwardingRequest() { + var builtRequest = buildRouteForwardingRequest(); + + assertThat(builtRequest).isEqualTo(GrpcRouteForwardingRequestTestFactory.create()); + } + + private GrpcRouteForwardingRequest buildRouteForwardingRequest() { + return service.buildRouteForwardingRequest(request, eingang); + } + } + @Nested class TestSendAttachments { @@ -591,4 +673,61 @@ class ForwardingRemoteServiceTest { service.waitForFinishedFileUpload(fileSender, inputStream); } } + + @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); + } + } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java index 58b939a4170938fb2b5a9f8d00879d98bbfef584..c5ef1c9d55399fea9847e8e3116362b29545ed27 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java @@ -36,7 +36,8 @@ class GrpcRouteForwardingRequestTestFactory { } public static GrpcRouteForwardingRequest.Builder createBuilder() { - return GrpcRouteForwardingRequest.newBuilder(); + return GrpcRouteForwardingRequest.newBuilder() + .setRouteForwarding(GrpcRouteForwardingTestFactory.create()); } public static GrpcRouteForwardingRequest createWithAttachmentMetadata() {