From af4c02ee2d904194b6216bf9b7a99b5c9c15a3a5 Mon Sep 17 00:00:00 2001 From: Jan Zickermann <jan.zickermann@dataport.de> Date: Tue, 26 Nov 2024 15:30:12 +0100 Subject: [PATCH] #4 OZG-7112 Use correct postfach-facade url --- spec/postfach-api-facade.yaml | 8 --- ...ation.java => ApiClientConfiguration.java} | 13 ++-- .../osiv2/transfer/RequestMapper.java | 2 +- .../osiv2/OsiPostfachRemoteServiceITCase.java | 31 +++------- .../extension/OsiMockServerExtension.java | 61 ++++++++++++++----- .../factory/PostfachNachrichtTestFactory.java | 4 ++ 6 files changed, 66 insertions(+), 53 deletions(-) rename src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/{WebClientConfiguration.java => ApiClientConfiguration.java} (92%) diff --git a/spec/postfach-api-facade.yaml b/spec/postfach-api-facade.yaml index 5355a6b..13769a9 100644 --- a/spec/postfach-api-facade.yaml +++ b/spec/postfach-api-facade.yaml @@ -4,8 +4,6 @@ info: description: <h3>Zentraler Service zur Nutzung der Plattformdienste des <i>Plattformdienstteams Postfach</i></h3>siehe auch <a href=https://docs.osi.dataport.de/x/VgO8Bw>PF-Facade</a> version: '1.0' -servers: -- url: /facade paths: /Filestorage/v1: post: @@ -4854,12 +4852,6 @@ components: description: SeverityLevel</p><table><tr><td>Low</td><td>Low - wird grĂ¼n angezeigt</td></tr> <tr><td>Medium</td><td>Medium - wird gelb angezeigt</td></tr> <tr><td>High</td><td>High - wird rot angezeigt</td></tr> </table><p> - securitySchemes: - OIDC: - type: openIdConnect - openIdConnectUrl: /Facade/WellKnownOpenidConfiguration -security: -- OIDC: [] tags: - name: Filestorage description: Der <i>Filestorage Controller</i> bietet eine Schnittstelle zum <i>Plattformdienst diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/WebClientConfiguration.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java similarity index 92% rename from src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/WebClientConfiguration.java rename to src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java index 90c751b..16d7d79 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/WebClientConfiguration.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/config/ApiClientConfiguration.java @@ -16,6 +16,7 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.client.WebClient; 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; @@ -23,21 +24,25 @@ import reactor.netty.transport.ProxyProvider; @Configuration @RequiredArgsConstructor @ConditionalOnProperty("ozgcloud.osiv2-postfach.enabled") -public class WebClientConfiguration { +public class ApiClientConfiguration { private final OsiPostfachProperties.ApiConfiguration apiConfiguration; private final OsiPostfachProperties.ProxyConfiguration proxyConfiguration; + @Bean + MessageExchangeApi messageExchangeApi(ApiClient apiClient) { + return new MessageExchangeApi(apiClient); + } @Bean - public ApiClient apiClient(ReactiveClientRegistrationRepository clientRegistrations) { - return new ApiClient(osi2PostfachWebClient(clientRegistrations)); + ApiClient apiClient(ReactiveClientRegistrationRepository clientRegistrations) { + return new ApiClient(osi2PostfachWebClient(clientRegistrations)) + .setBasePath(apiConfiguration.getUrl()); } private WebClient osi2PostfachWebClient( ReactiveClientRegistrationRepository clientRegistrations) { return WebClient.builder() - .baseUrl(apiConfiguration.getUrl()) .clientConnector(new ReactorClientHttpConnector(httpClient())) .filter(serverOAuth2AuthorizedClientExchangeFilterFunction(clientRegistrations)) .build(); diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/RequestMapper.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/RequestMapper.java index 43f6b20..127d16d 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/RequestMapper.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/RequestMapper.java @@ -32,7 +32,7 @@ public interface RequestMapper { .map(PostfachAddress::getIdentifier) .filter(PostfachAddressIdentifier::isStringBasedIdentifier) .map(Object::toString) - .orElseThrow(() -> new IllegalArgumentException("Expect MailboxId to be a string-based PostfachAddress of PostfachNachricht!")); + .orElseThrow(() -> new IllegalArgumentException("Missing MailboxId! Expect MailboxId to be a string-based PostfachAddress of PostfachNachricht.")); } } 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 c1f97ce..b980765 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,9 @@ package de.ozgcloud.nachrichten.postfach.osiv2; import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*; +import static de.ozgcloud.nachrichten.postfach.osiv2.factory.PostfachAddressTestFactory.*; import static org.assertj.core.api.Assertions.*; -import static org.mockserver.matchers.Times.*; import static org.mockserver.model.HttpRequest.*; -import static org.mockserver.model.HttpResponse.*; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -22,6 +21,7 @@ import org.springframework.test.context.TestPropertySource; 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.PostfachNachrichtTestFactory; import lombok.SneakyThrows; @SpringBootTest(classes = TestApplication.class, webEnvironment = SpringBootTest.WebEnvironment.NONE) @@ -34,10 +34,7 @@ public class OsiPostfachRemoteServiceITCase { @RegisterExtension static final OsiMockServerExtension OSI_MOCK_SERVER_EXTENSION = new OsiMockServerExtension(); - private static final String MESSAGE_ID = "message-id"; - private final PostfachNachricht postfachNachricht = PostfachNachricht.builder() - .messageId(MESSAGE_ID) - .build(); + private final PostfachNachricht postfachNachricht = PostfachNachrichtTestFactory.create(); @Autowired private OsiPostfachRemoteService osiPostfachRemoteService; @@ -56,7 +53,7 @@ public class OsiPostfachRemoteServiceITCase { @BeforeEach @SneakyThrows public void setup() { - mockClient = OSI_MOCK_SERVER_EXTENSION.getMockClient(); + mockClient = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockClient(); } @DisplayName("send message") @@ -66,25 +63,11 @@ public class OsiPostfachRemoteServiceITCase { @DisplayName("should send dummy request with jwt") @Test void shouldSendDummyRequestWithJwt() { - mockClient - .when( - request() - .withMethod("GET") - .withPath("/_metrics"), - exactly(1) - ) - .respond( - response() - .withStatusCode(200) - ); - osiPostfachRemoteService.sendMessage(postfachNachricht); - var requests = mockClient.retrieveRecordedRequests( - request() - .withMethod("GET") - .withPath("/_metrics") - ); + var requests = mockClient.retrieveRecordedRequests(request() + .withPathParameter("mailboxId", MAILBOX_ID) + .withPath("/MessageExchange/v1/Send/{mailboxId}")); assertThat(requests).hasSize(1); var jwt = Jwt.parseAuthHeaderValue( requests[0].getHeader("Authorization").getFirst() 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 1c745f5..7de1108 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 @@ -2,12 +2,16 @@ package de.ozgcloud.nachrichten.postfach.osiv2.extension; import static de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory.*; import static org.mockserver.matchers.Times.*; +import static org.mockserver.mock.OpenAPIExpectation.*; import static org.mockserver.model.Header.*; import static org.mockserver.model.HttpRequest.*; import static org.mockserver.model.HttpResponse.*; import static org.mockserver.model.Parameter.*; import static org.mockserver.model.ParameterBody.*; +import java.nio.file.Files; +import java.nio.file.Path; + import org.junit.jupiter.api.extension.AfterAllCallback; import org.junit.jupiter.api.extension.AfterEachCallback; import org.junit.jupiter.api.extension.BeforeAllCallback; @@ -21,6 +25,7 @@ import org.testcontainers.utility.DockerImageName; import de.ozgcloud.nachrichten.postfach.osiv2.factory.JwtFactory; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.log4j.Log4j2; @Log4j2 @@ -28,9 +33,13 @@ import lombok.extern.log4j.Log4j2; @RequiredArgsConstructor public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback { - private MockServerClient mockClient; - private final MockServerContainer mockServerContainer = new MockServerContainer(DockerImageName.parse("mockserver/mockserver") - .withTag("mockserver-5.15.0")) + private MockServerClient serviceKontoMockClient; + private MockServerClient postfachFacadeMockClient; + + private static final DockerImageName MOCK_SERVER_IMAGE = DockerImageName.parse("mockserver/mockserver") + .withTag("mockserver-5.15.0"); + + private final MockServerContainer serviceKontoMockContainer = new MockServerContainer(MOCK_SERVER_IMAGE) .withLogConsumer(outputFrame -> { var line = outputFrame.getUtf8String().stripTrailing(); if (outputFrame.getType() == OutputFrame.OutputType.STDERR) { @@ -39,46 +48,66 @@ public class OsiMockServerExtension implements BeforeAllCallback, AfterAllCallba LOG.info(line); } }); + private final MockServerContainer postfachFacadeMockContainer = new MockServerContainer(MOCK_SERVER_IMAGE); @Override public void beforeAll(ExtensionContext context) { - setupMockServer(); + setupPostfachFacadeMock(); + setupServiceKontoMock(); } @Override public void afterEach(ExtensionContext context) { - mockClient.reset(); + postfachFacadeMockClient.reset(); + serviceKontoMockClient.reset(); } @Override public void afterAll(ExtensionContext context) { - mockServerContainer.stop(); - mockClient.stop(); + serviceKontoMockClient.stop(); + serviceKontoMockContainer.stop(); + + postfachFacadeMockClient.stop(); + postfachFacadeMockContainer.stop(); } - private void setupMockServer() { - mockServerContainer.start(); - mockClient = new MockServerClient( - mockServerContainer.getHost(), - mockServerContainer.getServerPort() + @SneakyThrows + private void setupPostfachFacadeMock() { + postfachFacadeMockContainer.start(); + postfachFacadeMockClient = new MockServerClient( + postfachFacadeMockContainer.getHost(), + postfachFacadeMockContainer.getServerPort() + ); + } + + @SneakyThrows + private void setupServiceKontoMock() { + serviceKontoMockContainer.start(); + serviceKontoMockClient = new MockServerClient( + serviceKontoMockContainer.getHost(), + serviceKontoMockContainer.getServerPort() ); } public String getAccessTokenUrl() { - return getMockServerUrl() + "/access-token"; + return getMockServerUrl(serviceKontoMockClient) + "/access-token"; } public String getPostfachFacadeUrl() { - return getMockServerUrl(); + return getMockServerUrl(postfachFacadeMockClient); } - private String getMockServerUrl() { + private String getMockServerUrl(MockServerClient mockClient) { return "http://" + mockClient.remoteAddress().getHostName() + ":" + mockClient.remoteAddress().getPort(); } + @SneakyThrows @Override public void beforeEach(ExtensionContext context) { - mockClient + postfachFacadeMockClient.upsert( + openAPIExpectation(Files.readString(Path.of("spec", "postfach-api-facade.yaml"))) + ); + serviceKontoMockClient .when( request() .withMethod("POST") diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java index 2f217ee..c57b2aa 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/PostfachNachrichtTestFactory.java @@ -1,5 +1,7 @@ package de.ozgcloud.nachrichten.postfach.osiv2.factory; +import java.time.ZonedDateTime; + import de.ozgcloud.nachrichten.postfach.PostfachNachricht; public class PostfachNachrichtTestFactory { @@ -15,6 +17,8 @@ public class PostfachNachrichtTestFactory { return PostfachNachricht.builder() .mailBody(MAIL_BODY) .subject(MAIL_SUBJECT) + .createdAt(ZonedDateTime.now()) + .vorgangId("test-vorgang-id") .postfachAddress(PostfachAddressTestFactory.create()); } } -- GitLab