From bc463db7d47aa52709e4583bfed7f35564c7c82c Mon Sep 17 00:00:00 2001 From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com> Date: Wed, 19 Mar 2025 10:55:22 +0100 Subject: [PATCH] OZG-7573 OZG-7923 Fix tests --- .../redirect/ForwardingRemoteService.java | 5 +- .../redirect/ForwardingRemoteServiceTest.java | 109 ++++++++++++++++-- ...GrpcRouteForwardingRequestTestFactory.java | 37 ++++++ 3 files changed, 140 insertions(+), 11 deletions(-) create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java 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 dc4206747..416b80956 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 @@ -46,7 +46,7 @@ class ForwardingRemoteService { private final VorgangService vorgangService; private final ForwardingRequestMapper forwardingRequestMapper; @GrpcClient("forwarder") - private final RouteForwardingServiceGrpc.RouteForwardingServiceStub routeForwardingServiceGrpc; + private final RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; public void forward(ForwardingRequest request) { CompletableFuture<Void> responseFuture = new CompletableFuture<>(); @@ -55,13 +55,14 @@ class ForwardingRemoteService { } void routeForwarding(ForwardingRequest request, ForwardingResponseObserver responseObserver) { - var requestStreamObserver = routeForwardingServiceGrpc.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor()) + var requestStreamObserver = serviceStub.withInterceptors(new VorgangManagerClientCallContextAttachingInterceptor()) .routeForwarding(responseObserver); try { sendEingang(request, requestStreamObserver); requestStreamObserver.onCompleted(); } catch (Throwable t) { requestStreamObserver.onError(t); + throw 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 cf85265b4..df3940325 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 @@ -23,6 +23,7 @@ */ package de.ozgcloud.vorgang.vorgang.redirect; +import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; @@ -33,20 +34,39 @@ import org.mockito.Mock; import org.mockito.Spy; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; +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; class ForwardingRemoteServiceTest { + @Mock + private VorgangService vorgangService; + @Mock + private ForwardingRemoteService forwardingRemoteService; @Mock private RouteForwardingServiceGrpc.RouteForwardingServiceStub serviceStub; @Spy @InjectMocks private ForwardingRemoteService service; + @Mock + private StreamObserver<GrpcRouteForwardingRequest> requestObserver; + private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + @Nested class TestForward { - private final ForwardingRequest request = ForwardingRequestTestFactory.create(); + } + + @Nested + class TestRouteForwarding { + + @Mock + private ForwardingResponseObserver responseObserver; @BeforeEach void init() { @@ -54,10 +74,11 @@ class ForwardingRemoteServiceTest { } @Test - void shouldAttachClientCallContext() { + void shouldAttachClientCallContextToServiceStub() { givenGrpcCallCompletedSuccessfully(); + doNothing().when(service).sendEingang(any(), any()); - forward(); + routeForwarding(); verify(serviceStub).withInterceptors(any(VorgangManagerClientCallContextAttachingInterceptor.class)); } @@ -65,21 +86,91 @@ class ForwardingRemoteServiceTest { @Test void shouldMakeGrpcCallToRouteForwarding() { givenGrpcCallCompletedSuccessfully(); + doNothing().when(service).sendEingang(any(), any()); + + routeForwarding(); - forward(); + verify(serviceStub).routeForwarding(any(ForwardingResponseObserver.class)); + } + + @Nested + class OnSuccess { + + @BeforeEach + void init() { + givenGrpcCallCompletedSuccessfully(); + doNothing().when(service).sendEingang(any(), any()); + } + + @Test + void shouldSendEingang() { + routeForwarding(); + + verify(service).sendEingang(request, requestObserver); + } - verify(serviceStub).routeForwarding(any(ForwardingRemoteService.ForwardingResponseObserver.class)); + @Test + void shouldCallOnCompleted() { + routeForwarding(); + + verify(requestObserver).onCompleted(); + } + } + + @Nested + class OnFailure { + + private final RuntimeException error = new RuntimeException(); + + @BeforeEach + void init() { + givenGrpcCallCompletedSuccessfully(); + doThrow(error).when(service).sendEingang(any(), any()); + } + + @Test + void shouldCallOnError() { + catchThrowableOfType(RuntimeException.class, TestRouteForwarding.this::routeForwarding); + + verify(requestObserver).onError(error); + } + + @Test + void shouldThrowError() { + assertThatThrownBy(TestRouteForwarding.this::routeForwarding).isSameAs(error); + } } private void givenGrpcCallCompletedSuccessfully() { when(serviceStub.routeForwarding(any())).thenAnswer(invocation -> { - ((ForwardingRemoteService.ForwardingResponseObserver) invocation.getArgument(0)).onCompleted(); - return null; + ((ForwardingResponseObserver) invocation.getArgument(0)).onCompleted(); + return requestObserver; }); } - private void forward() { - service.forward(request); + private void routeForwarding() { + service.routeForwarding(request, responseObserver); + } + } + + @Nested + class TestSendEingang { + + @BeforeEach + void init() { + when(vorgangService.getById(any())).thenReturn(VorgangTestFactory.create()); + doReturn(GrpcRouteForwardingRequestTestFactory.create()).when(service).buildRouteForwardingRequest(any(), any()); + } + + @Test + void shouldGetVorgangById() { + sendEingang(); + + verify(vorgangService).getById(VorgangTestFactory.ID); + } + + private void sendEingang() { + service.sendEingang(request, requestObserver); } } } 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 new file mode 100644 index 000000000..d09b7af52 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; + +class GrpcRouteForwardingRequestTestFactory { + + public static GrpcRouteForwardingRequest create() { + return createBuilder().build(); + } + + public static GrpcRouteForwardingRequest.Builder createBuilder() { + return GrpcRouteForwardingRequest.newBuilder(); + } +} -- GitLab