diff --git a/pom.xml b/pom.xml index 57d54c077f1d83562d58f388d5c81d7ab644ffbd..9458fa610751cabea993cd2d380d539fd1149119 100644 --- a/pom.xml +++ b/pom.xml @@ -22,6 +22,7 @@ <openapi-generator.version>7.11.0</openapi-generator.version> <swagger-parser.version>2.1.23</swagger-parser.version> <wiremock-spring-boot.version>3.6.0</wiremock-spring-boot.version> + <wiremock-grpc-extension.version>0.9.0</wiremock-grpc-extension.version> </properties> <dependencies> <!-- OZG-Cloud --> @@ -85,6 +86,13 @@ <version>${wiremock-spring-boot.version}</version> <scope>test</scope> </dependency> + <dependency> + <groupId>org.wiremock</groupId> + <artifactId>wiremock-grpc-extension-jetty12</artifactId> + <version>${wiremock-grpc-extension.version}</version> + <scope>test</scope> + </dependency> + <!-- commons --> <dependency> diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java index 2aa3c2cd3edc7411b253969f47b35eef4e67cd3d..a49709999ad359ed7bff2cb00b060fd453cee18b 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/ServiceIfOsi2Enabled.java @@ -1,10 +1,17 @@ package de.ozgcloud.nachrichten.postfach.osiv2; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; import de.ozgcloud.nachrichten.postfach.osiv2.config.Osi2PostfachProperties; +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) @Service @ConditionalOnProperty(prefix = Osi2PostfachProperties.PREFIX, name = "enabled", havingValue = "true") public @interface ServiceIfOsi2Enabled { 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 e9948c36a99efc62d6d03c533da3971a5c515438..d5403ac00de3d07ad398e8b7ff020fd10f676012 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 @@ -11,7 +11,6 @@ import org.springframework.context.annotation.Configuration; 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; @@ -31,6 +30,7 @@ import org.springframework.web.client.RestClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.ApiClient; import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.MessageExchangeApi; +import de.ozgcloud.nachrichten.postfach.osiv2.gen.api.QuarantineApi; import lombok.RequiredArgsConstructor; @Configuration @@ -49,6 +49,11 @@ public class ApiClientConfiguration { return new MessageExchangeApi(apiClient); } + @Bean + QuarantineApi quarantineApi(ApiClient apiClient) { + return new QuarantineApi(apiClient); + } + @Bean ApiClient apiClient() { var apiClient = new ApiClient(restClient()); diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java index efa3a16c71ee5d51997d304c6bd60a6af82cceed..6c4acafedd830e78740ed1a4bcc3fff0ce5f941c 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/storage/Osi2BinaryFileRemoteService.java @@ -11,11 +11,13 @@ import de.ozgcloud.vorgang.grpc.binaryFile.GrpcBinaryFilesRequest; import de.ozgcloud.vorgang.grpc.binaryFile.GrpcGetBinaryFileDataRequest; import lombok.RequiredArgsConstructor; import lombok.extern.log4j.Log4j2; +import net.devh.boot.grpc.client.inject.GrpcClient; @Log4j2 @ServiceIfOsi2Enabled @RequiredArgsConstructor public class Osi2BinaryFileRemoteService { + @GrpcClient("vorgang-manager") private final BinaryFileServiceGrpc.BinaryFileServiceBlockingStub binaryFileService; private final Osi2BinaryFileMapper binaryFileMapper; diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index dcbea65d1bba45b8c4882d109a07064f09581a61..47df577c154833691dff2958f2d711bc4fb6167a 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -2,4 +2,10 @@ logging: level: de.ozgcloud.nachrichten.postfach.osiv2: DEBUG org.springframework.http: DEBUG - org.springframework.web.client: DEBUG \ No newline at end of file + org.springframework.web.client: DEBUG + +grpc: + client: + vorgang-manager: + address: static://127.0.0.1:9090 + negotiationType: PLAINTEXT \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 065fffe83bf04cd7a435ee3d7a96b347b2f9379e..6b2cd38abf23654bce2740cfcbd7ff1ba9d4f324 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,4 @@ spring: jackson: - default-property-inclusion: NON_NULL \ No newline at end of file + default-property-inclusion: NON_NULL + 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 94405d692b164bdf5d1d3b3c51974274a314d39b..b20578b06beacc63b7f3133ada87ec960eb4e579 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java @@ -17,13 +17,18 @@ import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.DynamicPropertyRegistry; import org.springframework.test.context.DynamicPropertySource; import org.springframework.test.context.TestPropertySource; +import org.wiremock.grpc.dsl.WireMockGrpcService; import com.github.tomakehurst.wiremock.WireMockServer; import com.github.tomakehurst.wiremock.client.ResponseDefinitionBuilder; +import de.ozgcloud.nachrichten.postfach.PostfachException; +import de.ozgcloud.nachrichten.postfach.PostfachMessageCode; import de.ozgcloud.nachrichten.postfach.PostfachNachricht; +import de.ozgcloud.nachrichten.postfach.osiv2.exception.Osi2PostfachException; 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; @@ -41,6 +46,9 @@ class OsiPostfachRemoteServiceITCase { @RegisterExtension static final OsiMockServerExtension OSI_MOCK_SERVER_EXTENSION = new OsiMockServerExtension(); + @RegisterExtension + static final VorgangManagerServerExtension VORGANG_MANAGER_SERVER_EXTENSION = new VorgangManagerServerExtension(); + private final PostfachNachricht postfachNachricht = PostfachNachrichtTestFactory.create(); @Autowired @@ -53,14 +61,17 @@ class OsiPostfachRemoteServiceITCase { registry.add("ozgcloud.osiv2.auth.client-id", () -> CLIENT_ID); registry.add("ozgcloud.osiv2.api.url", OSI_MOCK_SERVER_EXTENSION::getPostfachFacadeUrl); registry.add("ozgcloud.osiv2.auth.resource", () -> RESOURCE_URN); + registry.add("grpc.client.vorgang-manager.address", VORGANG_MANAGER_SERVER_EXTENSION::getVorgangManagerAddress); } private WireMockServer postfachFacadeMockServer; + private WireMockGrpcService binaryFileMockService; @BeforeEach @SneakyThrows public void setup() { postfachFacadeMockServer = OSI_MOCK_SERVER_EXTENSION.getPostfachFacadeMockServer(); + binaryFileMockService = VORGANG_MANAGER_SERVER_EXTENSION.getBinaryFileServiceGrpcService(); } @DisplayName("should send request with jwt") @@ -87,6 +98,16 @@ class OsiPostfachRemoteServiceITCase { assertThat(jwt.body().read("$.aud", String.class)).isEqualTo(RESOURCE_URN); } + @DisplayName("should throw postfach exception with connection error code") + @Test + void shouldThrowPostfachExceptionWithConnectionErrorCode() { + postfachFacadeMockServer.stop(); + + assertThatThrownBy(() -> osiPostfachRemoteService.sendMessage(postfachNachricht)) + .isInstanceOf(Osi2PostfachException.class) + .hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE); + } + @DisplayName("should receive one messages") @Test @SneakyThrows 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 new file mode 100644 index 0000000000000000000000000000000000000000..947d0e7df3edeb9af3150775029c9429b264ec9f --- /dev/null +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/extension/VorgangManagerServerExtension.java @@ -0,0 +1,63 @@ +package de.ozgcloud.nachrichten.postfach.osiv2.extension; + +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.*; + +import org.junit.jupiter.api.extension.AfterAllCallback; +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeAllCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.wiremock.grpc.GrpcExtensionFactory; +import org.wiremock.grpc.Jetty12GrpcExtensionFactory; +import org.wiremock.grpc.dsl.WireMockGrpcService; + +import com.github.tomakehurst.wiremock.WireMockServer; +import com.github.tomakehurst.wiremock.client.WireMock; + +import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +@Getter +@RequiredArgsConstructor +public class VorgangManagerServerExtension implements BeforeAllCallback, AfterAllCallback, AfterEachCallback { + + private WireMockServer vorgangManagerMockServer; + private WireMockGrpcService binaryFileServiceGrpcService; + + @Override + public void beforeAll(ExtensionContext context) { + setupVorgangManagerMock(); + binaryFileServiceGrpcService = new WireMockGrpcService( + new WireMock(vorgangManagerMockServer), + BinaryFileServiceGrpc.SERVICE_NAME + ); + } + + @Override + public void afterEach(ExtensionContext context) { + binaryFileServiceGrpcService.resetAll(); + vorgangManagerMockServer.resetAll(); + } + + @Override + public void afterAll(ExtensionContext context) { + vorgangManagerMockServer.shutdown(); + } + + private void setupVorgangManagerMock() { + vorgangManagerMockServer = new WireMockServer( + wireMockConfig() + .dynamicPort() + .extensions(new Jetty12GrpcExtensionFactory()) + ); + vorgangManagerMockServer.start(); + } + + public String getVorgangManagerAddress() { + return "static://127.0.0.1:%d".formatted(vorgangManagerMockServer.port()); + } + + +} diff --git a/src/test/resources/application-itcase.yml b/src/test/resources/application-itcase.yml index 41e84786e9e76db63c2d6671a55ae56dddae6ea7..cbafa6a7cbaf0a852223bbce96e06db332a01890 100644 --- a/src/test/resources/application-itcase.yml +++ b/src/test/resources/application-itcase.yml @@ -5,4 +5,10 @@ logging: level: de.ozgcloud.nachrichten.postfach.osiv2: DEBUG org.springframework.http: DEBUG - org.springframework.web.client: DEBUG \ No newline at end of file + org.springframework.web.client: DEBUG + +grpc: + client: + vorgang-manager: + address: static://127.0.0.1:9090 + negotiationType: PLAINTEXT \ No newline at end of file