diff --git a/pom.xml b/pom.xml index e373fe58bc4e49a221adf1f87747306731589e8c..ab38b5127fc5a3f2ecbb29ed5bd3e97daac85c29 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ <parent> <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> - <version>4.6.0</version> + <version>4.9.0-SNAPSHOT</version> </parent> <groupId>de.ozgcloud.osiv2</groupId> @@ -42,11 +42,26 @@ </dependency> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-oauth2-client</artifactId> + <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-webflux</artifactId> + <artifactId>spring-boot-starter-oauth2-client</artifactId> + </dependency> + <dependency> + <groupId>jakarta.servlet</groupId> + <artifactId>jakarta.servlet-api</artifactId> + </dependency> + <dependency> + <groupId>jakarta.json.bind</groupId> + <artifactId>jakarta.json.bind-api</artifactId> + <version>3.0.1</version> + </dependency> + <dependency> + <groupId>org.eclipse</groupId> + <artifactId>yasson</artifactId> + <version>3.0.4</version> + <scope>test</scope> </dependency> <dependency> @@ -91,7 +106,10 @@ <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> - + <dependency> + <groupId>org.apache.httpcomponents.client5</groupId> + <artifactId>httpclient5</artifactId> + </dependency> <!-- used by generated code --> <!-- @Nullable annotation --> <dependency> @@ -148,7 +166,7 @@ <configOptions> <sourceFolder>src/gen/java/main</sourceFolder> <serializationLibrary>jackson</serializationLibrary> - <library>webclient</library> + <library>restclient</library> <annotationLibrary>swagger2</annotationLibrary> <apiPackage>de.ozgcloud.nachrichten.postfach.osiv2.gen.api</apiPackage> <modelPackage>de.ozgcloud.nachrichten.postfach.osiv2.gen.model</modelPackage> diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java index 4584e529a58c4b5798795afe25956a7cfb72fac5..82ea45f9be3c833242551186e6f7fea9e400c9c7 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java @@ -1,27 +1,36 @@ package de.ozgcloud.nachrichten.postfach.osiv2.config; +import org.apache.hc.client5.http.auth.AuthScope; +import org.apache.hc.client5.http.auth.UsernamePasswordCredentials; +import org.apache.hc.client5.http.impl.auth.BasicCredentialsProvider; +import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; +import org.apache.hc.core5.http.HttpHost; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.security.oauth2.client.AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager; -import org.springframework.security.oauth2.client.InMemoryReactiveOAuth2AuthorizedClientService; -import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProvider; -import org.springframework.security.oauth2.client.ReactiveOAuth2AuthorizedClientProviderBuilder; -import org.springframework.security.oauth2.client.endpoint.WebClientReactiveClientCredentialsTokenResponseClient; -import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; -import org.springframework.security.oauth2.client.web.reactive.function.client.ServerOAuth2AuthorizedClientExchangeFilterFunction; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.oauth2.client.AuthorizedClientServiceOAuth2AuthorizedClientManager; +import org.springframework.security.oauth2.client.InMemoryOAuth2AuthorizedClientService; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider; +import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder; +import org.springframework.security.oauth2.client.endpoint.RestClientClientCredentialsTokenResponseClient; +import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.client.OAuth2ClientHttpRequestInterceptor; +import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; -import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.client.RestClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.ApiClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.MessageExchangeApi; import lombok.RequiredArgsConstructor; -import reactor.netty.http.client.HttpClient; -import reactor.netty.transport.ProxyProvider; @Configuration +@EnableWebSecurity @RequiredArgsConstructor @ConditionalOnProperty(prefix = Osi2PostfachProperties.PREFIX, name = "enabled", havingValue = "true") public class ApiClientConfiguration { @@ -35,45 +44,56 @@ public class ApiClientConfiguration { } @Bean - ApiClient apiClient(ReactiveClientRegistrationRepository clientRegistrations) { - return new ApiClient(osi2PostfachWebClient(clientRegistrations)) - .setBasePath(apiConfiguration.getUrl()); + ApiClient apiClient(ClientRegistrationRepository clientRegistrations) { + var apiClient = new ApiClient(restClient(clientRegistrations)); + apiClient.setBasePath(apiConfiguration.getUrl()); + return apiClient; } - private WebClient osi2PostfachWebClient( - ReactiveClientRegistrationRepository clientRegistrations) { - return WebClient.builder() - .clientConnector(new ReactorClientHttpConnector(httpClient())) - .filter(serverOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations)) + private RestClient restClient(ClientRegistrationRepository clientRegistrations) { + OAuth2ClientHttpRequestInterceptor requestInterceptor = + new OAuth2ClientHttpRequestInterceptor(authorizedClientManager(clientRegistrations)); + requestInterceptor.setClientRegistrationIdResolver(request -> "osi2"); + + return defaultRestClientBuilder() + .requestInterceptor(requestInterceptor) .build(); } - @SuppressWarnings("ConstantConditions") - private HttpClient httpClient() { - var webClient = HttpClient.create(); - return proxyConfiguration.isEnabled() ? webClient - .proxy(proxy -> proxy - .type(ProxyProvider.Proxy.HTTP) - .host(proxyConfiguration.getHost()) - .port(proxyConfiguration.getPort()) - .username(proxyConfiguration.getUsername()) - .password(username -> proxyConfiguration.getPassword()) - ) : webClient; + private RestClient.Builder defaultRestClientBuilder() { + return RestClient.builder() + .requestFactory(createProxyRequestFactory()); } - private ServerOAuth2AuthorizedClientExchangeFilterFunction serverOAuth2AuthorizedClientExchangeFilterFunction( - ReactiveClientRegistrationRepository clientRegistrations) { + private ClientHttpRequestFactory createProxyRequestFactory() { + var requestFactory = new HttpComponentsClientHttpRequestFactory(); + if (proxyConfiguration.isEnabled()) { + requestFactory.setHttpClient( + HttpClientBuilder.create() + .setProxy(new HttpHost(proxyConfiguration.getHost(), proxyConfiguration.getPort())) + .setDefaultCredentialsProvider(basicCredentialsProviderForProxy()) + .build() + ); + } + return requestFactory; + } - var oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(authorizedClientManager(clientRegistrations)); - oauth.setDefaultClientRegistrationId("osi2"); - return oauth; + private BasicCredentialsProvider basicCredentialsProviderForProxy() { + var credentialsProvider = new BasicCredentialsProvider(); + var username = proxyConfiguration.getUsername(); + var password = proxyConfiguration.getPassword(); + if (username != null && password != null) { + credentialsProvider.setCredentials(new AuthScope(proxyConfiguration.getHost(), proxyConfiguration.getPort()), + new UsernamePasswordCredentials(username, password.toCharArray())); + } + return credentialsProvider; } - private AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager authorizedClientManager( - ReactiveClientRegistrationRepository clientRegistrations) { - var clientService = new InMemoryReactiveOAuth2AuthorizedClientService( + private AuthorizedClientServiceOAuth2AuthorizedClientManager authorizedClientManager( + ClientRegistrationRepository clientRegistrations) { + var clientService = new InMemoryOAuth2AuthorizedClientService( clientRegistrations); - var authorizedClientManager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager( + var authorizedClientManager = new AuthorizedClientServiceOAuth2AuthorizedClientManager( clientRegistrations, clientService); authorizedClientManager.setAuthorizedClientProvider(authorizedClientProvider()); @@ -81,28 +101,33 @@ public class ApiClientConfiguration { return authorizedClientManager; } - private ReactiveOAuth2AuthorizedClientProvider authorizedClientProvider() { - return ReactiveOAuth2AuthorizedClientProviderBuilder.builder() + private OAuth2AuthorizedClientProvider authorizedClientProvider() { + return OAuth2AuthorizedClientProviderBuilder.builder() .clientCredentials(builder -> builder.accessTokenResponseClient(clientCredentialsTokenResponseClient()) ) .build(); } - private WebClientReactiveClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient() { - var client = new WebClientReactiveClientCredentialsTokenResponseClient(); - configureHttpClientForTokenRequests(client); + private RestClientClientCredentialsTokenResponseClient clientCredentialsTokenResponseClient() { + var client = new RestClientClientCredentialsTokenResponseClient(); + configureClientCredentialsRestClient(client); configureParametersForTokenRequests(client); return client; } - private void configureHttpClientForTokenRequests(WebClientReactiveClientCredentialsTokenResponseClient client) { - client.setWebClient(WebClient.builder() - .clientConnector(new ReactorClientHttpConnector(httpClient())) + private void configureClientCredentialsRestClient(RestClientClientCredentialsTokenResponseClient client) { + client.setRestClient(defaultRestClientBuilder() + .messageConverters(messageConverters -> { + messageConverters.clear(); + messageConverters.add(new FormHttpMessageConverter()); + messageConverters.add(new OAuth2AccessTokenResponseHttpMessageConverter()); + }) + .defaultStatusHandler(new OAuth2ErrorResponseErrorHandler()) .build()); } - private void configureParametersForTokenRequests(WebClientReactiveClientCredentialsTokenResponseClient client) { + private void configureParametersForTokenRequests(RestClientClientCredentialsTokenResponseClient client) { client.addParametersConverter(source -> { MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>(); // Pass a resource indicator parameter https://datatracker.ietf.org/doc/html/rfc8707 diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java index d3aaa130fe44c77fb3734fe2456ed4c86245bc82..7f62892e8b031e4ce89a716db9c1d2a6952497c1 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java @@ -29,21 +29,21 @@ public class PostfachApiFacadeService { messageExchangeApi.sendMessage( requestMapper.mapMailboxId(nachricht), requestMapper.mapOutSendMessageRequestV2(nachricht) - ).block(); + ); } public Stream<PostfachNachricht> receiveMessages() { - var response = messageExchangeApi.receiveMessages(MAX_NUMBER_RECEIVED_MESSAGES, 0).block(); + var response = messageExchangeApi.receiveMessages(MAX_NUMBER_RECEIVED_MESSAGES, 0); return response.getMessages().stream().map(this::fetchMessageByGuid); } PostfachNachricht fetchMessageByGuid(final MessageExchangeReceiveMessage message) { - var messageReply = messageExchangeApi.getMessage(message.getGuid()).block(); + var messageReply = messageExchangeApi.getMessage(message.getGuid()); return responseMapper.toPostfachNachricht(messageReply); } public void deleteMessage(final String messageId) { - messageExchangeApi.deleteMessage(UUID.fromString(messageId)).block(); + messageExchangeApi.deleteMessage(UUID.fromString(messageId)); } } 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 2c07c7829eecea5369ae091c96b892161fe2095d..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,13 +7,11 @@ 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; @@ -29,30 +27,31 @@ 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, webEnvironment = SpringBootTest.WebEnvironment.NONE) +@SpringBootTest(classes = TestApplication.class) @ActiveProfiles("itcase") @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 @@ -75,17 +74,13 @@ public class OsiPostfachRemoteServiceITCase { postfachFacadeMockClient = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockClient(); } - @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); @@ -98,86 +93,77 @@ public class OsiPostfachRemoteServiceITCase { assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN); } - ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - @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); } @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)); - } - - 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); + .respond( + response() + .withHeader("Content-type", "application/json") + .withBody(JsonUtil.toJson(body)) + ); } @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/OsiPostfachRemoteServiceRemoteITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java index 344c3de7e35a2f68761a726cf963248aae4dbcf8..9978f987a8d331528a8a8b86b4bf1ed0b21348a4 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceRemoteITCase.java @@ -22,8 +22,8 @@ import de.ozgcloud.nachrichten.postfach.osiv2.factory.DummyStringBasedIdentifier import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachAddressTestFactory; import de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachNachrichtTestFactory; -@SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) -@ActiveProfiles("itcase") +@SpringBootTest(classes = TestApplication.class) +@ActiveProfiles("local") @EnabledIfEnvironmentVariable(named = "SH_STAGE_CLIENT_SECRET", matches = ".+") public class OsiPostfachRemoteServiceRemoteITCase { @@ -83,8 +83,10 @@ public class OsiPostfachRemoteServiceRemoteITCase { @Test void shouldReceiveAllMessage(){ Stream<PostfachNachricht> allMessages = osiPostfachRemoteService.getAllMessages(); + var messages = allMessages.toList(); - assertThat(messages.size() > 0); + + assertThat(messages).isNotEmpty(); } } 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 5ce2169b26b87ac81589556b0a6f5469d89f68fb..9d59d950c805922702d0a18bf38cbdb30e6c3a5c 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 @@ -105,7 +105,7 @@ public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallba .withMethod("POST") .withPath("/access-token") .withHeaders( - header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8") + header("Content-Type", "application/x-www-form-urlencoded") ) .withBody( params( 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) { diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java index f8a3c19c34125ece0bf242dea493888a2fd2050c..139ba192c9394ddb55d2657e094a2d9d15765866 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeServiceTest.java @@ -22,7 +22,6 @@ import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeReceiveMe import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.MessageExchangeSendMessageResponse; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.OutSendMessageRequestV2; import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyMessage; -import reactor.core.publisher.Mono; class PostfachApiFacadeServiceTest { @@ -52,10 +51,9 @@ class PostfachApiFacadeServiceTest { @BeforeEach void mock() { - var responseMono = Mono.just(messageExchangeSendMessageResponse); when(requestMapper.mapMailboxId(nachricht)).thenReturn(MAILBOX_ID); when(requestMapper.mapOutSendMessageRequestV2(nachricht)).thenReturn(outSendMessageRequestV2); - when(messageExchangeApi.sendMessage(any(), any())).thenReturn(responseMono); + when(messageExchangeApi.sendMessage(any(), any())).thenReturn(messageExchangeSendMessageResponse); } @DisplayName("should call sendMessage") @@ -77,8 +75,7 @@ class PostfachApiFacadeServiceTest { @BeforeEach void mock(){ - var responseMono = Mono.just(messageExchangeReceiveMessagesResponse); - when(messageExchangeApi.receiveMessages(anyInt(),anyInt())).thenReturn(responseMono); + when(messageExchangeApi.receiveMessages(anyInt(),anyInt())).thenReturn(messageExchangeReceiveMessagesResponse); } @Test @@ -100,8 +97,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldCallGetMessage(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.getMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); postfachApiFacadeService.fetchMessageByGuid(receiveMessage); @@ -110,8 +106,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldCallResponseMapper(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.getMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); when(responseMapper.toPostfachNachricht(any())).thenReturn(PostfachNachrichtTestFactory.create()); postfachApiFacadeService.fetchMessageByGuid(receiveMessage); @@ -121,8 +116,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldReturnPostfachNachricht(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.getMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.getMessage(any())).thenReturn(replyMessage); when(responseMapper.toPostfachNachricht(any())).thenReturn(PostfachNachrichtTestFactory.create()); var postfachNachricht = postfachApiFacadeService.fetchMessageByGuid(receiveMessage); @@ -139,8 +133,7 @@ class PostfachApiFacadeServiceTest { @Test void shouldCallDeleteMessage(){ - var replyMono = Mono.just(replyMessage); - when(messageExchangeApi.deleteMessage(any())).thenReturn(replyMono); + when(messageExchangeApi.deleteMessage(any())).thenReturn(replyMessage); postfachApiFacadeService.deleteMessage(UUID.randomUUID().toString());