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