From 248cabeebca275bcd3092256f960762f6ef15895 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 7 Feb 2025 10:00:00 +0100 Subject: [PATCH 1/5] OZG-6354 use correct zufi interface to get Organisationseinheit --- lombok.config | 3 +- pom.xml | 14 +-- .../OrganisationsEinheitRemoteService.java | 26 +++-- .../eingang/common/zufi/ZufiService.java | 2 +- ...ltipleOrganisationsEinheitenException.java | 34 +++++++ ...nisationsEinheitIdRequestTestFactory.java} | 17 ++-- ...nisationsEinheitIdResponseTestFactory.java | 41 ++++++++ ...OrganisationsEinheitRemoteServiceTest.java | 94 ++++++++++++------- .../eingang/common/zufi/ZufiServiceTest.java | 4 +- 9 files changed, 175 insertions(+), 60 deletions(-) create mode 100644 router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java rename router/src/test/java/de/ozgcloud/eingang/common/zufi/{GrpcOrganisationsEinheitGetResponseTestFactory.java => GrpcGetByOrganisationsEinheitIdRequestTestFactory.java} (63%) create mode 100644 router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcGetByOrganisationsEinheitIdResponseTestFactory.java diff --git a/lombok.config b/lombok.config index 32903abaf..d248ae3c4 100644 --- a/lombok.config +++ b/lombok.config @@ -27,4 +27,5 @@ lombok.log.slf4j.flagUsage = ERROR lombok.log.log4j.flagUsage = ERROR lombok.data.flagUsage = ERROR lombok.nonNull.exceptionType = IllegalArgumentException -lombok.addLombokGeneratedAnnotation = true \ No newline at end of file +lombok.addLombokGeneratedAnnotation = true +lombok.copyableAnnotations += net.devh.boot.grpc.client.inject.GrpcClient \ No newline at end of file diff --git a/pom.xml b/pom.xml index 700589324..8629c9353 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,9 @@ unter der Lizenz sind dem Lizenztext zu entnehmen. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> @@ -32,7 +34,7 @@ <groupId>de.ozgcloud.common</groupId> <artifactId>ozgcloud-common-parent</artifactId> <version>4.9.0</version> - <relativePath/> <!-- lookup parent from repository --> + <relativePath /> <!-- lookup parent from repository --> </parent> <groupId>de.ozgcloud.eingang</groupId> @@ -48,12 +50,12 @@ <module>semantik-adapter</module> <module>formcycle-adapter</module> <module>enterprise-adapter</module> - <module>fim-adapter</module> - </modules> + <module>fim-adapter</module> + </modules> <properties> <vorgang-manager.version>2.10.0</vorgang-manager.version> - <zufi-manager.version>1.2.0</zufi-manager.version> + <zufi-manager.version>1.7.0-SNAPSHOT</zufi-manager.version> <jsoup.version>1.14.3</jsoup.version> <xmlschema.version>2.3.0</xmlschema.version> @@ -205,4 +207,4 @@ </snapshotRepository> </distributionManagement> -</project> +</project> \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java index c7e01f4c1..e42d5d210 100644 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java +++ b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java @@ -23,25 +23,33 @@ */ package de.ozgcloud.eingang.common.zufi; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import de.ozgcloud.eingang.Application; -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetRequest; +import de.ozgcloud.eingang.router.errorhandling.MultipleOrganisationsEinheitenException; +import de.ozgcloud.eingang.router.errorhandling.UnknownOrganisationseinheitException; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdRequest; import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrpc.OrganisationsEinheitServiceBlockingStub; +import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; @Service +@RequiredArgsConstructor class OrganisationsEinheitRemoteService { @GrpcClient(Application.ZUFI_MANAGER_GRPC_CLIENT) - private OrganisationsEinheitServiceBlockingStub serviceStub; - @Autowired - private OrganisationsEinheitMapper mapper; + private final OrganisationsEinheitServiceBlockingStub serviceStub; + private final OrganisationsEinheitMapper mapper; - public OrganisationsEinheit getById(String id) { - var response = serviceStub.getById(GrpcOrganisationsEinheitGetRequest.newBuilder().setId(id).build()); - - return mapper.fromGrpc(response.getOrganisationsEinheit()); + public OrganisationsEinheit getByOrganisationEinheitId(String id) { + var response = serviceStub + .getByOrganisationsEinheitId(GrpcGetByOrganisationsEinheitIdRequest.newBuilder().setOrganisationsEinheitId(id).build()); + if (response.getOrganisationsEinheitenCount() > 1) { + throw new MultipleOrganisationsEinheitenException(id); + } + if (response.getOrganisationsEinheitenCount() == 0) { + throw new UnknownOrganisationseinheitException(); + } + return mapper.fromGrpc(response.getOrganisationsEinheitenList().get(0)); } } diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/ZufiService.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/ZufiService.java index 96e89340a..c015f0e10 100644 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/ZufiService.java +++ b/router/src/main/java/de/ozgcloud/eingang/common/zufi/ZufiService.java @@ -34,6 +34,6 @@ public class ZufiService { private final OrganisationsEinheitRemoteService remoteService; public String getVorgangManagerUrl(String organisationsEinheitId) { - return remoteService.getById(organisationsEinheitId).getVorgangManagerAddress(); + return remoteService.getByOrganisationEinheitId(organisationsEinheitId).getVorgangManagerAddress(); } } \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java b/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java new file mode 100644 index 000000000..e59a88e4b --- /dev/null +++ b/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.eingang.router.errorhandling; + +public class MultipleOrganisationsEinheitenException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public MultipleOrganisationsEinheitenException(String organisationEinheitId) { + super("Multiple Organisationseinheiten with Id %s found!".formatted(organisationEinheitId)); + } + +} diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitGetResponseTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcGetByOrganisationsEinheitIdRequestTestFactory.java similarity index 63% rename from router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitGetResponseTestFactory.java rename to router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcGetByOrganisationsEinheitIdRequestTestFactory.java index d74aa9d39..234b90f18 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitGetResponseTestFactory.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcGetByOrganisationsEinheitIdRequestTestFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den * Ministerpräsidenten des Landes Schleswig-Holstein * Staatskanzlei * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung @@ -23,16 +23,17 @@ */ package de.ozgcloud.eingang.common.zufi; -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetResponse; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdRequest; -public class GrpcOrganisationsEinheitGetResponseTestFactory { +public class GrpcGetByOrganisationsEinheitIdRequestTestFactory { - public static GrpcOrganisationsEinheitGetResponse create() { + private static final String ORGANISATION_EINHEIT_ID = OrganisationsEinheitTestFactory.ID; + + public static GrpcGetByOrganisationsEinheitIdRequest create() { return createBuilder().build(); } - public static GrpcOrganisationsEinheitGetResponse.Builder createBuilder() { - return GrpcOrganisationsEinheitGetResponse.newBuilder() - .setOrganisationsEinheit(GrpcOrganisationsEinheitTestFactory.create()); + public static GrpcGetByOrganisationsEinheitIdRequest.Builder createBuilder() { + return GrpcGetByOrganisationsEinheitIdRequest.newBuilder().setOrganisationsEinheitId(ORGANISATION_EINHEIT_ID); } -} \ No newline at end of file +} diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcGetByOrganisationsEinheitIdResponseTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcGetByOrganisationsEinheitIdResponseTestFactory.java new file mode 100644 index 000000000..df5cfb822 --- /dev/null +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcGetByOrganisationsEinheitIdResponseTestFactory.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.eingang.common.zufi; + +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdResponse; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit; + +public class GrpcGetByOrganisationsEinheitIdResponseTestFactory { + + public static final GrpcOrganisationsEinheit ORGANISATIONS_EINHEIT = GrpcOrganisationsEinheitTestFactory.create(); + + public static GrpcGetByOrganisationsEinheitIdResponse create() { + return createBuilder().build(); + } + + public static GrpcGetByOrganisationsEinheitIdResponse.Builder createBuilder() { + return GrpcGetByOrganisationsEinheitIdResponse.newBuilder() + .addOrganisationsEinheiten(ORGANISATIONS_EINHEIT); + } +} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java index 6c25468db..3561c1f85 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java @@ -28,19 +28,14 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheit; -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheitMapper; -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheitRemoteService; -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetRequest; -import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheitGetResponse; +import de.ozgcloud.eingang.router.errorhandling.MultipleOrganisationsEinheitenException; +import de.ozgcloud.eingang.router.errorhandling.UnknownOrganisationseinheitException; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdResponse; import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrpc.OrganisationsEinheitServiceBlockingStub; class OrganisationsEinheitRemoteServiceTest { @@ -52,42 +47,75 @@ class OrganisationsEinheitRemoteServiceTest { @Mock private OrganisationsEinheitMapper mapper; - @DisplayName("Get by id") @Nested - class TestGetById { + class TestGetByOrganisationEinheitId { - private final GrpcOrganisationsEinheitGetResponse response = GrpcOrganisationsEinheitGetResponseTestFactory.create(); - private final OrganisationsEinheit mappedOrganisationsEinheit = OrganisationsEinheitTestFactory.create(); + @Nested + class TestOnSingleOrganisationEinheitFound { - @BeforeEach - void mock() { - when(stub.getById(any())).thenReturn(response); - when(mapper.fromGrpc(any())).thenReturn(mappedOrganisationsEinheit); - } + private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.create(); + private final OrganisationsEinheit mappedOrganisationsEinheit = OrganisationsEinheitTestFactory.create(); + + @BeforeEach + void mock() { + when(stub.getByOrganisationsEinheitId(any())).thenReturn(response); + when(mapper.fromGrpc(any())).thenReturn(mappedOrganisationsEinheit); + } + + @Test + void shouldCallRemoteService() { + service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); - @Captor - private ArgumentCaptor<GrpcOrganisationsEinheitGetRequest> requestCaptor; + verify(stub).getByOrganisationsEinheitId(GrpcGetByOrganisationsEinheitIdRequestTestFactory.create()); + } - @Test - void shouldCallRemoteService() { - service.getById(OrganisationsEinheitTestFactory.ID); + @Test + void shouldCallMapper() { + service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); - verify(stub).getById(requestCaptor.capture()); - assertThat(requestCaptor.getValue().getId()).isEqualTo(OrganisationsEinheitTestFactory.ID); + verify(mapper).fromGrpc(GrpcGetByOrganisationsEinheitIdResponseTestFactory.ORGANISATIONS_EINHEIT); + } + + @Test + void shouldReturnValue() { + var organisationsEinheit = service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); + + assertThat(organisationsEinheit).isEqualTo(mappedOrganisationsEinheit); + } } - @Test - void shouldCallMapper() { - service.getById(OrganisationsEinheitTestFactory.ID); + @Nested + class TestOnMultipleOrganisationEinheitFound { + + private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.createBuilder() + .addOrganisationsEinheiten(GrpcOrganisationsEinheitTestFactory.create()) + .build(); - verify(mapper).fromGrpc(response.getOrganisationsEinheit()); + @Test + void shouldThrowMultipleOrganisationsEinheitenException() { + when(stub.getByOrganisationsEinheitId(any())).thenReturn(response); + + assertThatExceptionOfType(MultipleOrganisationsEinheitenException.class) + .isThrownBy(() -> service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID)); + + } } - @Test - void shouldReturnValue() { - var organisationsEinheit = service.getById(OrganisationsEinheitTestFactory.ID); + @Nested + class TestOnNoOrganisationEinheitFound { + + private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.createBuilder() + .clearOrganisationsEinheiten() + .build(); + + @Test + void shouldThrowUnknownOrganisationseinheitException() { + when(stub.getByOrganisationsEinheitId(any())).thenReturn(response); + + assertThatExceptionOfType(UnknownOrganisationseinheitException.class) + .isThrownBy(() -> service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID)); - assertThat(organisationsEinheit).isEqualTo(mappedOrganisationsEinheit); + } } } -} +} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/ZufiServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/ZufiServiceTest.java index c89a22966..5348135ee 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/ZufiServiceTest.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/ZufiServiceTest.java @@ -49,14 +49,14 @@ class ZufiServiceTest { @BeforeEach void mock() { - when(remoteService.getById(any())).thenReturn(organisationsEinheit); + when(remoteService.getByOrganisationEinheitId(any())).thenReturn(organisationsEinheit); } @Test void shouldCallRemoteService() { service.getVorgangManagerUrl(OrganisationsEinheitTestFactory.ID); - verify(remoteService).getById(OrganisationsEinheitTestFactory.ID); + verify(remoteService).getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); } @Test -- GitLab From e217fd45579b1008d71e1971eb35bb675c832ac8 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 7 Feb 2025 10:19:23 +0100 Subject: [PATCH 2/5] OZG-6354 add xzufi id --- .../common/zufi/OrganisationsEinheit.java | 1 + .../ozgcloud/eingang/common/zufi/XzufiId.java | 13 +++++ .../GrpcOrganisationsEinheitTestFactory.java | 20 +++++++- .../common/zufi/GrpcXzufiIdTestFactory.java | 44 +++++++++++++++++ .../zufi/OrganisationsEinheitMapperTest.java | 2 - .../zufi/OrganisationsEinheitTestFactory.java | 14 +++--- .../common/zufi/XzufiIdTestFactory.java | 48 +++++++++++++++++++ 7 files changed, 132 insertions(+), 10 deletions(-) create mode 100644 router/src/main/java/de/ozgcloud/eingang/common/zufi/XzufiId.java create mode 100644 router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcXzufiIdTestFactory.java create mode 100644 router/src/test/java/de/ozgcloud/eingang/common/zufi/XzufiIdTestFactory.java diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheit.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheit.java index 24fd9e469..24a39f9ba 100644 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheit.java +++ b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheit.java @@ -36,4 +36,5 @@ class OrganisationsEinheit { private String name; private String synonyme; private String vorgangManagerAddress; + private XzufiId xzufiId; } \ No newline at end of file diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/XzufiId.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/XzufiId.java new file mode 100644 index 000000000..ff731658b --- /dev/null +++ b/router/src/main/java/de/ozgcloud/eingang/common/zufi/XzufiId.java @@ -0,0 +1,13 @@ +package de.ozgcloud.eingang.common.zufi; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; + +@Builder +@Getter +@EqualsAndHashCode +public class XzufiId { + private String id; + private String schemeAgencyId; +} \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java index c516ccf4d..08dd88e1c 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java @@ -24,14 +24,32 @@ package de.ozgcloud.eingang.common.zufi; import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit.Builder; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcXzufiId; public class GrpcOrganisationsEinheitTestFactory { + public static final String ID = OrganisationsEinheitTestFactory.ID; + public static final GrpcXzufiId XZUFI_ID = GrpcXzufiIdTestFactory.create(); + public static final String NAME = OrganisationsEinheitTestFactory.NAME; + public static final String SYNONYME = OrganisationsEinheitTestFactory.SYNONYME; + public static final String VORGANG_MANAGER_ADDRESS = OrganisationsEinheitTestFactory.VORGANG_MANAGER_ADDRESS; + public static GrpcOrganisationsEinheit create() { return createBuilder().build(); } - public static GrpcOrganisationsEinheit.Builder createBuilder() { + public static GrpcOrganisationsEinheit createWithoutSynonyme() { + return createBuilderWithoutSynonyme() + .build(); + } + + public static Builder createBuilder() { + return createBuilderWithoutSynonyme() + .setSynonyme(SYNONYME); + } + + public static Builder createBuilderWithoutSynonyme() { return GrpcOrganisationsEinheit.newBuilder() .setId(OrganisationsEinheitTestFactory.ID) .setName(OrganisationsEinheitTestFactory.NAME) diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcXzufiIdTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcXzufiIdTestFactory.java new file mode 100644 index 000000000..99c8dc0ca --- /dev/null +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcXzufiIdTestFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.eingang.common.zufi; + +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcXzufiId; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcXzufiId.Builder; + +public class GrpcXzufiIdTestFactory { + public static final String ORGANISATIONS_EINHEIT_ID = XzufiIdTestFactory.ID; + public static final String SCHEME_AGENCY_ID = XzufiIdTestFactory.SCHEME_AGENCY_ID; + + public static GrpcXzufiId create() { + return createBuilder(ORGANISATIONS_EINHEIT_ID, SCHEME_AGENCY_ID).build(); + } + + public static GrpcXzufiId create(String id, String schemeAgencyId) { + return createBuilder(id, schemeAgencyId).build(); + } + + public static Builder createBuilder(String id, String schemeAgencyId) { + return GrpcXzufiId.newBuilder().setId(id).setSchemeAgencyId(schemeAgencyId); + } +} diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapperTest.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapperTest.java index 2e4e596a6..7cc8008db 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapperTest.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitMapperTest.java @@ -28,8 +28,6 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.Test; import org.mapstruct.factory.Mappers; -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheitMapper; - class OrganisationsEinheitMapperTest { private final OrganisationsEinheitMapper mapper = Mappers.getMapper(OrganisationsEinheitMapper.class); diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitTestFactory.java index 060811d88..cc14d84a5 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitTestFactory.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitTestFactory.java @@ -27,14 +27,13 @@ import java.util.UUID; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.eingang.common.zufi.OrganisationsEinheit; - public class OrganisationsEinheitTestFactory { - public final static String ID = UUID.randomUUID().toString(); - public final static String NAME = LoremIpsum.getInstance().getName(); - public final static String SYNONYME = LoremIpsum.getInstance().getName(); - public final static String VORGANG_MANAGER_ADDRESS = LoremIpsum.getInstance().getUrl(); + public static final XzufiId XZUFI_ID = XzufiIdTestFactory.create(); + public static final String ID = UUID.randomUUID().toString(); + public static final String NAME = LoremIpsum.getInstance().getName(); + public static final String SYNONYME = LoremIpsum.getInstance().getName(); + public static final String VORGANG_MANAGER_ADDRESS = LoremIpsum.getInstance().getUrl(); public static OrganisationsEinheit create() { return createBuilder().build(); @@ -45,6 +44,7 @@ public class OrganisationsEinheitTestFactory { .id(ID) .name(NAME) .synonyme(SYNONYME) - .vorgangManagerAddress(VORGANG_MANAGER_ADDRESS); + .vorgangManagerAddress(VORGANG_MANAGER_ADDRESS) + .xzufiId(XZUFI_ID); } } \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/XzufiIdTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/XzufiIdTestFactory.java new file mode 100644 index 000000000..7aa7d29cb --- /dev/null +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/XzufiIdTestFactory.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.eingang.common.zufi; + +import java.util.UUID; + +public class XzufiIdTestFactory { + + public static final String ID = UUID.randomUUID().toString(); + public static final String SCHEME_AGENCY_ID = UUID.randomUUID().toString(); + + public static XzufiId create() { + return createBuilder().build(); + } + + public static XzufiId createWithId(String id) { + return createBuilder() + .id(id) + .build(); + } + + public static XzufiId.XzufiIdBuilder createBuilder() { + return XzufiId.builder() + .id(ID) + .schemeAgencyId(SCHEME_AGENCY_ID); + } +} -- GitLab From 867fdb7d53d089484e57ab91e7481afc7f8cdd5f Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 7 Feb 2025 10:25:51 +0100 Subject: [PATCH 3/5] OZG-6354 fix GrpcOrganisationsEinheitTestFactory --- .../common/zufi/GrpcOrganisationsEinheitTestFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java index 08dd88e1c..d61ca027d 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java @@ -54,6 +54,7 @@ public class GrpcOrganisationsEinheitTestFactory { .setId(OrganisationsEinheitTestFactory.ID) .setName(OrganisationsEinheitTestFactory.NAME) .setSynonyme(OrganisationsEinheitTestFactory.SYNONYME) - .setVorgangManagerAddress(OrganisationsEinheitTestFactory.VORGANG_MANAGER_ADDRESS); + .setVorgangManagerAddress(OrganisationsEinheitTestFactory.VORGANG_MANAGER_ADDRESS) + .setXzufiId(XZUFI_ID); } } \ No newline at end of file -- GitLab From de6964691148f198143baaca0ae611b137cd56cc Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 7 Feb 2025 13:44:43 +0100 Subject: [PATCH 4/5] OZG-6354 apply code review comments --- .../OrganisationsEinheitRemoteService.java | 12 ++- ...ltipleOrganisationsEinheitenException.java | 2 - .../GrpcOrganisationsEinheitTestFactory.java | 21 ++--- ...OrganisationsEinheitRemoteServiceTest.java | 93 ++++++++++++------- 4 files changed, 74 insertions(+), 54 deletions(-) diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java index e42d5d210..02f4e6bfd 100644 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java +++ b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java @@ -29,6 +29,8 @@ import de.ozgcloud.eingang.Application; import de.ozgcloud.eingang.router.errorhandling.MultipleOrganisationsEinheitenException; import de.ozgcloud.eingang.router.errorhandling.UnknownOrganisationseinheitException; import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdRequest; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcGetByOrganisationsEinheitIdResponse; +import de.ozgcloud.zufi.grpc.organisationseinheit.GrpcOrganisationsEinheit; import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrpc.OrganisationsEinheitServiceBlockingStub; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.client.inject.GrpcClient; @@ -44,12 +46,20 @@ class OrganisationsEinheitRemoteService { public OrganisationsEinheit getByOrganisationEinheitId(String id) { var response = serviceStub .getByOrganisationsEinheitId(GrpcGetByOrganisationsEinheitIdRequest.newBuilder().setOrganisationsEinheitId(id).build()); + verifyResponse(id, response); + return mapper.fromGrpc(getOrganisationEinheit(response)); + } + + void verifyResponse(String id, GrpcGetByOrganisationsEinheitIdResponse response) { if (response.getOrganisationsEinheitenCount() > 1) { throw new MultipleOrganisationsEinheitenException(id); } if (response.getOrganisationsEinheitenCount() == 0) { throw new UnknownOrganisationseinheitException(); } - return mapper.fromGrpc(response.getOrganisationsEinheitenList().get(0)); + } + + private GrpcOrganisationsEinheit getOrganisationEinheit(GrpcGetByOrganisationsEinheitIdResponse response) { + return response.getOrganisationsEinheitenList().get(0); } } diff --git a/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java b/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java index e59a88e4b..2228d9209 100644 --- a/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java +++ b/router/src/main/java/de/ozgcloud/eingang/router/errorhandling/MultipleOrganisationsEinheitenException.java @@ -25,8 +25,6 @@ package de.ozgcloud.eingang.router.errorhandling; public class MultipleOrganisationsEinheitenException extends RuntimeException { - private static final long serialVersionUID = 1L; - public MultipleOrganisationsEinheitenException(String organisationEinheitId) { super("Multiple Organisationseinheiten with Id %s found!".formatted(organisationEinheitId)); } diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java index d61ca027d..e25de9618 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/GrpcOrganisationsEinheitTestFactory.java @@ -39,22 +39,13 @@ public class GrpcOrganisationsEinheitTestFactory { return createBuilder().build(); } - public static GrpcOrganisationsEinheit createWithoutSynonyme() { - return createBuilderWithoutSynonyme() - .build(); - } - public static Builder createBuilder() { - return createBuilderWithoutSynonyme() - .setSynonyme(SYNONYME); - } - - public static Builder createBuilderWithoutSynonyme() { return GrpcOrganisationsEinheit.newBuilder() - .setId(OrganisationsEinheitTestFactory.ID) - .setName(OrganisationsEinheitTestFactory.NAME) - .setSynonyme(OrganisationsEinheitTestFactory.SYNONYME) - .setVorgangManagerAddress(OrganisationsEinheitTestFactory.VORGANG_MANAGER_ADDRESS) - .setXzufiId(XZUFI_ID); + .setId(ID) + .setName(NAME) + .setSynonyme(SYNONYME) + .setVorgangManagerAddress(VORGANG_MANAGER_ADDRESS) + .setXzufiId(XZUFI_ID) + .setSynonyme(SYNONYME); } } \ No newline at end of file diff --git a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java index 3561c1f85..52004608e 100644 --- a/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java +++ b/router/src/test/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteServiceTest.java @@ -24,6 +24,7 @@ package de.ozgcloud.eingang.common.zufi; import static org.assertj.core.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -32,6 +33,7 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import de.ozgcloud.eingang.router.errorhandling.MultipleOrganisationsEinheitenException; import de.ozgcloud.eingang.router.errorhandling.UnknownOrganisationseinheitException; @@ -41,6 +43,7 @@ import de.ozgcloud.zufi.grpc.organisationseinheit.OrganisationsEinheitServiceGrp class OrganisationsEinheitRemoteServiceTest { @InjectMocks + @Spy private OrganisationsEinheitRemoteService service; @Mock private OrganisationsEinheitServiceBlockingStub stub; @@ -50,53 +53,62 @@ class OrganisationsEinheitRemoteServiceTest { @Nested class TestGetByOrganisationEinheitId { - @Nested - class TestOnSingleOrganisationEinheitFound { + private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.create(); + private final OrganisationsEinheit mappedOrganisationsEinheit = OrganisationsEinheitTestFactory.create(); - private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.create(); - private final OrganisationsEinheit mappedOrganisationsEinheit = OrganisationsEinheitTestFactory.create(); + @BeforeEach + void mock() { + when(stub.getByOrganisationsEinheitId(any())).thenReturn(response); + when(mapper.fromGrpc(any())).thenReturn(mappedOrganisationsEinheit); + doNothing().when(service).verifyResponse(any(), any()); + } - @BeforeEach - void mock() { - when(stub.getByOrganisationsEinheitId(any())).thenReturn(response); - when(mapper.fromGrpc(any())).thenReturn(mappedOrganisationsEinheit); - } + @Test + void shouldCallRemoteService() { + service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); - @Test - void shouldCallRemoteService() { - service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); + verify(stub).getByOrganisationsEinheitId(GrpcGetByOrganisationsEinheitIdRequestTestFactory.create()); + } - verify(stub).getByOrganisationsEinheitId(GrpcGetByOrganisationsEinheitIdRequestTestFactory.create()); - } + @Test + void shouldCallVerifyResponse() { + service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); - @Test - void shouldCallMapper() { - service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); + verify(service).verifyResponse(OrganisationsEinheitTestFactory.ID, response); + } - verify(mapper).fromGrpc(GrpcGetByOrganisationsEinheitIdResponseTestFactory.ORGANISATIONS_EINHEIT); - } + @Test + void shouldCallMapperAfterVerifyingResponse() { + var order = inOrder(service, mapper); - @Test - void shouldReturnValue() { - var organisationsEinheit = service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); + service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); - assertThat(organisationsEinheit).isEqualTo(mappedOrganisationsEinheit); - } + order.verify(service).verifyResponse(any(), any()); + order.verify(mapper).fromGrpc(GrpcGetByOrganisationsEinheitIdResponseTestFactory.ORGANISATIONS_EINHEIT); + } + + @Test + void shouldReturnMappedOrganisationsEinheit() { + var organisationsEinheit = service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID); + + assertThat(organisationsEinheit).isEqualTo(mappedOrganisationsEinheit); } + } + + @Nested + class TestVerifyResponse { @Nested class TestOnMultipleOrganisationEinheitFound { - private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.createBuilder() - .addOrganisationsEinheiten(GrpcOrganisationsEinheitTestFactory.create()) - .build(); - @Test void shouldThrowMultipleOrganisationsEinheitenException() { - when(stub.getByOrganisationsEinheitId(any())).thenReturn(response); + var response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.createBuilder() + .addOrganisationsEinheiten(GrpcOrganisationsEinheitTestFactory.create()) + .build(); assertThatExceptionOfType(MultipleOrganisationsEinheitenException.class) - .isThrownBy(() -> service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID)); + .isThrownBy(() -> service.verifyResponse(OrganisationsEinheitTestFactory.ID, response)); } } @@ -104,17 +116,26 @@ class OrganisationsEinheitRemoteServiceTest { @Nested class TestOnNoOrganisationEinheitFound { - private final GrpcGetByOrganisationsEinheitIdResponse response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.createBuilder() - .clearOrganisationsEinheiten() - .build(); - @Test void shouldThrowUnknownOrganisationseinheitException() { - when(stub.getByOrganisationsEinheitId(any())).thenReturn(response); + var response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.createBuilder() + .clearOrganisationsEinheiten() + .build(); assertThatExceptionOfType(UnknownOrganisationseinheitException.class) - .isThrownBy(() -> service.getByOrganisationEinheitId(OrganisationsEinheitTestFactory.ID)); + .isThrownBy(() -> service.verifyResponse(OrganisationsEinheitTestFactory.ID, response)); + + } + } + + @Nested + class TestOnSingleOrganisationEinheitFound { + + @Test + void shouldNotThrowException() { + var response = GrpcGetByOrganisationsEinheitIdResponseTestFactory.create(); + assertDoesNotThrow(() -> service.verifyResponse(OrganisationsEinheitTestFactory.ID, response)); } } } -- GitLab From a6c58df700fe9d1fa59005a298370f1a4b2497e0 Mon Sep 17 00:00:00 2001 From: Felix Reichenbach <felix.reichenbach@mgm-tp.com> Date: Fri, 7 Feb 2025 14:37:08 +0100 Subject: [PATCH 5/5] OZG-6354 use getFirst instead of get(0) --- .../eingang/common/zufi/OrganisationsEinheitRemoteService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java index 02f4e6bfd..3e7ca5cfe 100644 --- a/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java +++ b/router/src/main/java/de/ozgcloud/eingang/common/zufi/OrganisationsEinheitRemoteService.java @@ -60,6 +60,6 @@ class OrganisationsEinheitRemoteService { } private GrpcOrganisationsEinheit getOrganisationEinheit(GrpcGetByOrganisationsEinheitIdResponse response) { - return response.getOrganisationsEinheitenList().get(0); + return response.getOrganisationsEinheitenList().getFirst(); } } -- GitLab