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 eaf8f546886bd13409d8f28596bc86b23c530d25..2771bbda602f4abcee66c4c946c6c093223a4c32 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java @@ -7,17 +7,14 @@ import static org.mockserver.mock.OpenAPIExpectation.*; import static org.mockserver.model.HttpRequest.*; import static org.mockserver.model.HttpResponse.*; -import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.time.OffsetDateTime; import java.util.Arrays; import java.util.Map; -import java.util.Objects; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -30,18 +27,14 @@ import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.ObjectWriter; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; - import de.ozgcloud.nachrichten.postfach.PostfachNachricht; import de.ozgcloud.nachrichten.postfach.osiv2.extension.Jwt; import de.ozgcloud.nachrichten.postfach.osiv2.extension.OsiMockServerExtension; +import de.ozgcloud.nachrichten.postfach.osiv2.factory.JsonUtil; import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory; +import de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageFactory; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeReceiveMessage; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeReceiveMessagesResponse; -import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyBehavior; -import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyMessage; import lombok.SneakyThrows; @SpringBootTest(classes = TestApplication.class) @@ -49,11 +42,16 @@ import lombok.SneakyThrows; @TestPropertySource(properties = { "ozgcloud.osiv2-postfach.http-proxy.enabled=false", }) -public class OsiPostfachRemoteServiceITCase { +class OsiPostfachRemoteServiceITCase { @RegisterExtension static final OsiMockServerExtension OSI_MOCK_SERVER_EXTENSION = new OsiMockServerExtension(); + @SneakyThrows + private static String getPostfachApiSpec() { + return Files.readString(Path.of("spec", "postfach-api-facade.yaml")); + } + private final PostfachNachricht postfachNachricht = PostfachNachrichtTestFactory.create(); @Autowired @@ -76,19 +74,13 @@ public class OsiPostfachRemoteServiceITCase { postfachFacadeMockClient = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockClient(); } -// @Disabled - @DisplayName("should send dummy request with jwt") + @DisplayName("should send request with jwt") @Test @SneakyThrows - void shouldSendDummyRequestWithJwt() { - postfachFacadeMockClient.upsert( - openAPIExpectation() - .withSpecUrlOrPayload(Files.readString(Path.of("spec", "postfach-api-facade.yaml"))) - .withOperationsAndResponses(Map.of( - "SendMessage", "200" - )) - ); - + void shouldSendRequestWithJwt() { + mockOperationsAndResponses(Map.of( + "SendMessage", "200" + )); osiPostfachRemoteService.sendMessage(postfachNachricht); @@ -101,89 +93,77 @@ public class OsiPostfachRemoteServiceITCase { assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN); } - ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - - @Disabled @DisplayName("should receive one messages") @Test @SneakyThrows void shouldReceiveMessages() { - var uuid = UUID.fromString("00000000-0000-0000-0000-000000000000"); - - createMessagesJson(uuid, null); - - createOneReplyMessageJson(uuid); + mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000"); - var messageStream = osiPostfachRemoteService.getAllMessages(); + var messageList = osiPostfachRemoteService.getAllMessages().toList(); - var messageList = messageStream.toList(); - assertThat(messageList).size().isEqualTo(1); + assertThat(messageList).hasSize(1); } - @Disabled @DisplayName("should receive two messages") @Test @SneakyThrows void shouldReceiveTwoMessages() { - var uuid1 = UUID.fromString("00000000-0000-0000-0000-000000000000"); - var uuid2 = UUID.fromString("00000000-0000-0000-0000-000000000001"); + mockPostfachMessageAndResponse("00000000-0000-0000-0000-000000000000", "00000000-0000-0000-0000-000000000001"); - createMessagesJson(uuid1, uuid2); + var messageList = osiPostfachRemoteService.getAllMessages().toList(); - createOneReplyMessageJson(uuid1); - createOneReplyMessageJson(uuid2); - - var messageStream = osiPostfachRemoteService.getAllMessages(); - - var messageList = messageStream.toList(); - assertThat(messageList).size().isEqualTo(2); + assertThat(messageList).hasSize(2); } - private void createMessagesJson(final UUID... uuids) throws IOException { - var messagesList = Arrays.stream(uuids).filter(Objects::nonNull).map(uuid -> new MessageExchangeReceiveMessage().guid(uuid)).toList(); - - var messages = new MessageExchangeReceiveMessagesResponse().messages(messagesList); - - ObjectWriter ow = objectMapper.writer().withDefaultPrettyPrinter(); - String messagesJson = ow.writeValueAsString(messages); - - createMessagesCall("receiveMessages", messagesJson); + private void mockPostfachMessageAndResponse(final String... uuids) { + // Stub message listing response + mockJsonOperation("receiveMessages", new MessageExchangeReceiveMessagesResponse() + .messages(Arrays.stream(uuids) + .map(uuid -> new MessageExchangeReceiveMessage() + .guid(UUID.fromString(uuid))) + .toList())); + for (String uuid : uuids) { + // Stub individual response for message + mockJsonOperation("getMessage", V1ReplyMessageFactory.create() + .messageBox(UUID.fromString(uuid)) + .responseTime(OffsetDateTime.now())); + } } - private void createMessagesCall(final String receiveMessages, final String messagesJson) throws IOException { + private void mockJsonOperation(final String operationId, final Object body) { postfachFacadeMockClient .when( new OpenAPIDefinition() - .withSpecUrlOrPayload(Files.readString(Path.of("spec", "postfach-api-facade.yaml"))) - .withOperationId(receiveMessages) + .withSpecUrlOrPayload(getPostfachApiSpec()) + .withOperationId(operationId) ) - .respond(response().withHeader("Content-type", "application/json").withBody(messagesJson)); + .respond( + response() + .withHeader("Content-type", "application/json") + .withBody(JsonUtil.toJson(body)) + ); } - private void createOneReplyMessageJson(final UUID uuid) throws IOException { - ObjectWriter ow = objectMapper.writer().withDefaultPrettyPrinter(); - - var replyMessage = new V1ReplyMessage() - .body("das ist ein toller Body").replyAction(V1ReplyBehavior.REPLYPOSSIBLE).messageBox(uuid).responseTime(OffsetDateTime.now()); - String messageJson = ow.writeValueAsString(replyMessage); - - createMessagesCall("getMessage", messageJson); - } - - @Disabled @DisplayName("should delete message") @Test @SneakyThrows void shouldDeleteMessage() { + mockOperationsAndResponses(Map.of( + "deleteMessage", "200" + )); + + assertDoesNotThrow(() -> osiPostfachRemoteService.deleteMessage("00000000-0000-0000-0000-000000000000")); + + // TODO verify delete message called + // var requests = postfachFacadeMockClient.retrieveRecordedRequests(request()); + } + + private void mockOperationsAndResponses(Map<String, String> operationsAndResponses) { postfachFacadeMockClient.upsert( openAPIExpectation() - .withSpecUrlOrPayload(Files.readString(Path.of("spec", "postfach-api-facade.yaml"))) - .withOperationsAndResponses(Map.of( - "deleteMessage", "200" - )) + .withSpecUrlOrPayload(getPostfachApiSpec()) + .withOperationsAndResponses(operationsAndResponses) ); - - assertDoesNotThrow(() -> osiPostfachRemoteService.deleteMessage("00000000-0000-0000-0000-000000000000")); } } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/JsonUtil.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/JsonUtil.java index 5353606ac693ef6d98d03dc58d77d900c4943279..ac01337f93e1fb6223b049dd616f1a94dd1ab9c9 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/JsonUtil.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/JsonUtil.java @@ -1,11 +1,13 @@ package de.ozgcloud.nachrichten.postfach.osiv2.factory; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.SneakyThrows; public class JsonUtil { - private static final ObjectMapper jsonMapper = new ObjectMapper(); + private static final ObjectMapper jsonMapper = new ObjectMapper() + .registerModule(new JavaTimeModule()); @SneakyThrows public static String toJson(Object object) {