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 71a645f8feec2638bd44472479ee7348ea1b4cf2..71c3be1335a5bbc768248ed0f2a210953945a9c7 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java @@ -1,10 +1,20 @@ package de.ozgcloud.nachrichten.postfach.osiv2; +import static com.github.tomakehurst.wiremock.client.WireMock.*; import static de.ozgcloud.nachrichten.NachrichtenManagerConfiguration.*; import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*; +import static org.assertj.core.api.Assertions.*; + +import java.time.OffsetDateTime; +import java.util.List; +import java.util.UUID; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; +import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; @@ -13,10 +23,22 @@ import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; +import de.ozgcloud.nachrichten.postfach.PostfachMessageCode; import de.ozgcloud.nachrichten.postfach.osiv2.attachment.Osi2AttachmentFileService; +import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException; +import de.ozgcloud.nachrichten.postfach.osiv2.extension.AttachmentExampleUploadUtil; +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; +import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory; +import de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageTestFactory; +import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineFileResult; +import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineStatus; import lombok.SneakyThrows; @SpringBootTest(classes = TestApplication.class) @@ -24,6 +46,7 @@ import lombok.SneakyThrows; @TestPropertySource(properties = { "ozgcloud.osiv2.proxy.enabled=false", }) +@ExtendWith(MockitoExtension.class) class OsiPostfachRemoteServiceITCase { @RegisterExtension @@ -55,4 +78,203 @@ class OsiPostfachRemoteServiceITCase { public void setup() { postfachFacadeMockServer = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockServer(); } + + @DisplayName("should send request with jwt") + @Test + @SneakyThrows + void shouldSendRequestWithJwt() { + var postfachNachricht = PostfachNachrichtTestFactory.create(); + mockSendResponse(); + + osiPostfachRemoteService.sendMessage(postfachNachricht); + + var requests = postfachFacadeMockServer.findAll( + postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))); + assertThat(requests).hasSize(1); + var jwt = Jwt.parseAuthHeaderValue(requests.getFirst().getHeader("Authorization")); + assertThat(jwt.body().read("$.client_id", String.class)).isEqualTo(CLIENT_ID); + assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN); + } + + @DisplayName("should send message with attachment") + @Test + void shouldSendMessageWithAttachment() { + var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService); + postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) + .willReturn(okJsonObj(QuarantineFileResult.builder() + .success(true) + .build())) + ); + postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) + .willReturn(okJsonObj(QuarantineStatus.SAFE)) + ); + var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder() + .attachments(List.of(textFileId)) + .build(); + mockSendResponse(); + + osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment); + + postfachFacadeMockServer.verify( + exactly(1), + postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) + ); + postfachFacadeMockServer.verify( + exactly(1), + postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) + ); + postfachFacadeMockServer.verify( + exactly(1), + postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}")) + ); + } + + @DisplayName("should throw postfach exception with connection error code") + @Test + void shouldThrowPostfachExceptionWithConnectionErrorCode() { + postfachFacadeMockServer.stop(); + + var postfachNachricht = PostfachNachrichtTestFactory.create(); + + assertThatThrownBy(() -> osiPostfachRemoteService.sendMessage(postfachNachricht)) + .isInstanceOf(Osi2PostfachException.class) + .hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE); + } + + @DisplayName("should delete attachments on upload exception") + @Test + void shouldDeleteAttachmentsOnUploadException() { + var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService); + postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) + .willReturn(okJsonObj(QuarantineFileResult.builder() + .success(false) + .error("Upload failure") + .build())) + ); + postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) + .willReturn(ok()) + ); + var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder() + .attachments(List.of(textFileId)) + .build(); + + try { + osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment); + } catch (Osi2PostfachException e) { + // ignore + } + + postfachFacadeMockServer.verify( + exactly(1), + deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) + ); + } + + @DisplayName("should delete attachments on scan exception") + @Test + void shouldDeleteAttachmentsOnScanException() { + var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService); + postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) + .willReturn(okJsonObj(QuarantineFileResult.builder() + .success(true) + .build())) + ); + postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) + .willReturn(okJsonObj(QuarantineStatus.UNSAFE)) + ); + postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) + .willReturn(ok()) + ); + var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder() + .attachments(List.of(textFileId)) + .build(); + + try { + osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment); + } catch (Osi2PostfachException e) { + // ignore + } + + postfachFacadeMockServer.verify( + exactly(1), + deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) + ); + } + + private void mockSendResponse() { + // Stub message send response (MessageExchangeApi::sendMessage) + postfachFacadeMockServer.stubFor(post(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}")) + .willReturn( + okJsonObj( + MessageExchangeSendMessageResponseTestFactory.create() + .messageId(UUID.randomUUID()) + ) + ) + ); + } + + @DisplayName("should receive one messages") + @Test + @SneakyThrows + void shouldReceiveMessages() { + mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000"); + + var messageList = osiPostfachRemoteService.getAllMessages().toList(); + + assertThat(messageList).hasSize(1); + } + + @DisplayName("should receive two messages") + @Test + @SneakyThrows + void shouldReceiveTwoMessages() { + mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000001"); + + var messageList = osiPostfachRemoteService.getAllMessages().toList(); + + assertThat(messageList).hasSize(2); + } + + private void mockPostfachMessageAndResponse(final String... uuids) { + // Stub message listing response (MessageExchangeApi::receiveMessages) + postfachFacadeMockServer.stubFor(get(urlPathEqualTo("/MessageExchange/v1/Receive")) + .withQueryParam("take", equalTo("100")) + .withQueryParam("skip", equalTo("0")) + .willReturn(okJsonObj(MessageExchangeReceiveMessagesResponseTestFactory.create(uuids))) + ); + for (String uuid : uuids) { + // Stub individual response for message (MessageExchangeApi::getMessage) + postfachFacadeMockServer.stubFor(get(urlPathTemplate("/MessageExchange/v1/Receive/{messageId}")) + .withPathParam("messageId", equalTo(uuid)) + .willReturn(okJsonObj( + V1ReplyMessageTestFactory.create() + .messageBox(UUID.fromString(uuid)) + .responseTime(OffsetDateTime.now()) + )) + ); + } + } + + private ResponseDefinitionBuilder okJsonObj(final Object body) { + return okJson(JsonUtil.toJson(body)); + } + + @DisplayName("should delete message") + @Test + @SneakyThrows + void shouldDeleteMessage() { + var messageId = "00000000-0000-0000-0000-000000000000"; + // Stub delete message response (MessageExchangeApi::deleteMessage) + postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}")) + .willReturn(ok()) + ); + + osiPostfachRemoteService.deleteMessage(messageId); + + postfachFacadeMockServer.verify( + exactly(1), + deleteRequestedFor(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}")) + .withPathParam("messageId", equalTo(messageId)) + ); + } } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServicePrimaryITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServicePrimaryITCase.java deleted file mode 100644 index 0b9b9b5280346c8a21f66b9964002257a9d9373d..0000000000000000000000000000000000000000 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServicePrimaryITCase.java +++ /dev/null @@ -1,216 +0,0 @@ -package de.ozgcloud.nachrichten.postfach.osiv2; - -import static com.github.tomakehurst.wiremock.client.WireMock.*; -import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*; -import static org.assertj.core.api.Assertions.*; - -import java.time.OffsetDateTime; -import java.util.List; -import java.util.UUID; - -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; - -import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException; -import de.ozgcloud.nachrichten.postfach.osiv2.extension.AttachmentExampleUploadUtil; -import de.ozgcloud.nachrichten.postfach.osiv2.extension.Jwt; -import de.ozgcloud.nachrichten.postfach.osiv2.factory.JsonUtil; -import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeReceiveMessagesResponseTestFactory; -import de.ozgcloud.nachrichten.postfach.osiv2.factory.MessageExchangeSendMessageResponseTestFactory; -import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory; -import de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageTestFactory; -import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineFileResult; -import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.QuarantineStatus; -import lombok.SneakyThrows; - -class OsiPostfachRemoteServicePrimaryITCase extends OsiPostfachRemoteServiceITCase { - - @DisplayName("should send request with jwt") - @Test - @SneakyThrows - void shouldSendRequestWithJwt() { - var postfachNachricht = PostfachNachrichtTestFactory.create(); - mockSendResponse(); - - osiPostfachRemoteService.sendMessage(postfachNachricht); - - var requests = postfachFacadeMockServer.findAll( - postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))); - assertThat(requests).hasSize(1); - var jwt = Jwt.parseAuthHeaderValue(requests.getFirst().getHeader("Authorization")); - assertThat(jwt.body().read("$.client_id", String.class)).isEqualTo(CLIENT_ID); - assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN); - } - - @DisplayName("should send message with attachment") - @Test - void shouldSendMessageWithAttachment() { - var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService); - postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) - .willReturn(okJsonObj(QuarantineFileResult.builder() - .success(true) - .build())) - ); - postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) - .willReturn(okJsonObj(QuarantineStatus.SAFE)) - ); - var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder() - .attachments(List.of(textFileId)) - .build(); - mockSendResponse(); - - osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment); - - postfachFacadeMockServer.verify( - exactly(1), - postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) - ); - postfachFacadeMockServer.verify( - exactly(1), - postRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) - ); - postfachFacadeMockServer.verify( - exactly(1), - postRequestedFor(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}")) - ); - } - - @DisplayName("should delete attachments on upload exception") - @Test - void shouldDeleteAttachmentsOnUploadException() { - var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService); - postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) - .willReturn(okJsonObj(QuarantineFileResult.builder() - .success(false) - .error("Upload failure") - .build())) - ); - postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) - .willReturn(ok()) - ); - var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder() - .attachments(List.of(textFileId)) - .build(); - - try { - osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment); - } catch (Osi2PostfachException e) { - // ignore - } - - postfachFacadeMockServer.verify( - exactly(1), - deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) - ); - } - - @DisplayName("should delete attachments on scan exception") - @Test - void shouldDeleteAttachmentsOnScanException() { - var textFileId = AttachmentExampleUploadUtil.uploadTextFile(osi2AttachmentFileService); - postfachFacadeMockServer.stubFor(post(urlPathTemplate("/Quarantine/v1/Upload/Chunked")) - .willReturn(okJsonObj(QuarantineFileResult.builder() - .success(true) - .build())) - ); - postfachFacadeMockServer.stubFor(get(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) - .willReturn(okJsonObj(QuarantineStatus.UNSAFE)) - ); - postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) - .willReturn(ok()) - ); - var postfachNachrichtWithAttachment = PostfachNachrichtTestFactory.createBuilder() - .attachments(List.of(textFileId)) - .build(); - - try { - osiPostfachRemoteService.sendMessage(postfachNachrichtWithAttachment); - } catch (Osi2PostfachException e) { - // ignore - } - - postfachFacadeMockServer.verify( - exactly(1), - deleteRequestedFor(urlPathTemplate("/Quarantine/v1/Upload/{guid}")) - ); - } - - private void mockSendResponse() { - // Stub message send response (MessageExchangeApi::sendMessage) - postfachFacadeMockServer.stubFor(post(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}")) - .willReturn( - okJsonObj( - MessageExchangeSendMessageResponseTestFactory.create() - .messageId(UUID.randomUUID()) - ) - ) - ); - } - - @DisplayName("should receive one messages") - @Test - @SneakyThrows - void shouldReceiveMessages() { - mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000"); - - var messageList = osiPostfachRemoteService.getAllMessages().toList(); - - assertThat(messageList).hasSize(1); - } - - @DisplayName("should receive two messages") - @Test - @SneakyThrows - void shouldReceiveTwoMessages() { - mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000001"); - - var messageList = osiPostfachRemoteService.getAllMessages().toList(); - - assertThat(messageList).hasSize(2); - } - - private void mockPostfachMessageAndResponse(final String... uuids) { - // Stub message listing response (MessageExchangeApi::receiveMessages) - postfachFacadeMockServer.stubFor(get(urlPathEqualTo("/MessageExchange/v1/Receive")) - .withQueryParam("take", equalTo("100")) - .withQueryParam("skip", equalTo("0")) - .willReturn(okJsonObj(MessageExchangeReceiveMessagesResponseTestFactory.create(uuids))) - ); - for (String uuid : uuids) { - // Stub individual response for message (MessageExchangeApi::getMessage) - postfachFacadeMockServer.stubFor(get(urlPathTemplate("/MessageExchange/v1/Receive/{messageId}")) - .withPathParam("messageId", equalTo(uuid)) - .willReturn(okJsonObj( - V1ReplyMessageTestFactory.create() - .messageBox(UUID.fromString(uuid)) - .responseTime(OffsetDateTime.now()) - )) - ); - } - } - - private ResponseDefinitionBuilder okJsonObj(final Object body) { - return okJson(JsonUtil.toJson(body)); - } - - @DisplayName("should delete message") - @Test - @SneakyThrows - void shouldDeleteMessage() { - var messageId = "00000000-0000-0000-0000-000000000000"; - // Stub delete message response (MessageExchangeApi::deleteMessage) - postfachFacadeMockServer.stubFor(delete(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}")) - .willReturn(ok()) - ); - - osiPostfachRemoteService.deleteMessage(messageId); - - postfachFacadeMockServer.verify( - exactly(1), - deleteRequestedFor(urlPathTemplate("/MessageExchange/v1/Delete/{messageId}")) - .withPathParam("messageId", equalTo(messageId)) - ); - } -} diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceSecondaryITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceSecondaryITCase.java deleted file mode 100644 index 33f22c4feb9b2da7e871d7aa2b01cbdbcbf83385..0000000000000000000000000000000000000000 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceSecondaryITCase.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.ozgcloud.nachrichten.postfach.osiv2; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; - -import de.ozgcloud.nachrichten.postfach.PostfachMessageCode; -import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException; -import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory; - -class OsiPostfachRemoteServiceSecondaryITCase extends OsiPostfachRemoteServiceITCase { - - @BeforeEach - void mock() { - // Stopping the mock server - // Note that a restarting the server will configure a new unknown port. - postfachFacadeMockServer.stop(); - } - - @DisplayName("should throw postfach exception with connection error code") - @Test - void shouldThrowPostfachExceptionWithConnectionErrorCode() { - var postfachNachricht = PostfachNachrichtTestFactory.create(); - - assertThatThrownBy(() -> osiPostfachRemoteService.sendMessage(postfachNachricht)) - .isInstanceOf(Osi2PostfachException.class) - .hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE); - } -} diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/OsiMockServerExtension.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/OsiMockServerExtension.java index 71cd29cbd57f980c253f593a8c1a30f8286e38a4..84d367b808ca8a5fad1de979f57d46b32840351b 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/OsiMockServerExtension.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/OsiMockServerExtension.java @@ -3,6 +3,10 @@ package de.ozgcloud.nachrichten.postfach.osiv2.extension; import static com.github.tomakehurst.wiremock.client.WireMock.*; import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*; +import java.util.Optional; + +import jakarta.annotation.Nullable; + import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; @@ -19,7 +23,7 @@ import lombok.extern.log4j.Log4j2; @Log4j2 @Getter @RequiredArgsConstructor -public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback { +public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback { private WireMockServer serviceKontoMockServer; private WireMockServer postfachFacadeMockServer; @@ -30,26 +34,36 @@ public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallba setupServiceKontoMock(); } - @Override - public void afterEach(ExtensionContext context) { - postfachFacadeMockServer.resetAll(); - serviceKontoMockServer.resetAll(); - } - @Override public void afterAll(ExtensionContext context) { - serviceKontoMockServer.shutdown(); - postfachFacadeMockServer.shutdown(); + if (serviceKontoMockServer != null) { + serviceKontoMockServer.shutdown(); + serviceKontoMockServer = null; + } + + if (postfachFacadeMockServer != null) { + postfachFacadeMockServer.shutdown(); + postfachFacadeMockServer = null; + } } private void setupPostfachFacadeMock() { - postfachFacadeMockServer = new WireMockServer(0); - postfachFacadeMockServer.start(); + postfachFacadeMockServer = setupWiremockServer(postfachFacadeMockServer, 32813); } private void setupServiceKontoMock() { - serviceKontoMockServer = new WireMockServer(0); - serviceKontoMockServer.start(); + serviceKontoMockServer = setupWiremockServer(serviceKontoMockServer, 32812); + } + + private WireMockServer setupWiremockServer(@Nullable WireMockServer existingServer, int port) { + if (existingServer != null && existingServer.isRunning()) { + existingServer.resetAll(); + return existingServer; + } else { + var server = new WireMockServer(port); + server.start(); + return server; + } } public String getAccessTokenUrl() { @@ -57,11 +71,16 @@ public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallba } public String getPostfachFacadeUrl() { - return postfachFacadeMockServer.baseUrl(); + return Optional.ofNullable(postfachFacadeMockServer) + .map(WireMockServer::baseUrl) + .orElseThrow(() -> new IllegalStateException("PostfachFacadeMockServer not initialized")); } @Override public void beforeEach(ExtensionContext context) { + setupPostfachFacadeMock(); + setupServiceKontoMock(); + serviceKontoMockServer.stubFor(post("/access-token") .withHeader("Content-Type", equalTo("application/x-www-form-urlencoded")) .withFormParam("grant_type", equalTo("client_credentials")) 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 index 872ebbc820ad1e76278c07c296434a196ff7fd19..6de18dcd892e9a35984e2d46dee5368be30a341e 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java @@ -30,7 +30,9 @@ public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAl @Override public void beforeAll(ExtensionContext context) { - setupVorgangManager(); + if (vorgangManagerContainer == null || mongoDBContainer == null) { + setupVorgangManager(); + } } @SneakyThrows @@ -64,9 +66,11 @@ public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAl public void afterAll(ExtensionContext context) { if (mongoDBContainer != null) { mongoDBContainer.stop(); + mongoDBContainer = null; } if (vorgangManagerContainer != null) { vorgangManagerContainer.stop(); + vorgangManagerContainer = null; } }