From 3e064c263f38e17fe46988eb41466686e50064c5 Mon Sep 17 00:00:00 2001
From: Felix Reichenbach <felix.reichenbach@mgm-tp.com>
Date: Thu, 9 Jan 2025 14:38:57 +0100
Subject: [PATCH] OZG-7136 extend PostfachAddressIdentifier validation

---
 .../nachrichten/postfach/PostfachAddress.java |  4 +-
 .../postfach/StringBasedIdentifier.java       |  3 ++
 .../info/InfoManagerServiceTest.java          |  3 +-
 ...rsistPostfachNachrichtServiceImplTest.java |  4 +-
 .../postfach/PostfachAddressTestFactory.java  |  6 +--
 .../postfach/PostfachEventListenerTest.java   |  2 +-
 .../PostfachNachrichtTestFactory.java         |  2 +-
 .../StringBasedIdentifierTestFactory.java     | 40 +++++++++++++++++++
 .../BayernIdPostfachRemoteServiceITCase.java  | 12 ++++--
 .../osi/OsiPostfachMessageMapperTest.java     |  3 +-
 .../osi/OsiPostfachRemoteServiceITCase.java   | 12 ++++--
 11 files changed, 70 insertions(+), 21 deletions(-)
 create mode 100644 nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifierTestFactory.java

diff --git a/nachrichten-manager-postfach-interface/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachAddress.java b/nachrichten-manager-postfach-interface/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachAddress.java
index 86ee9d4..e9831aa 100644
--- a/nachrichten-manager-postfach-interface/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachAddress.java
+++ b/nachrichten-manager-postfach-interface/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachAddress.java
@@ -23,8 +23,8 @@
  */
 package de.ozgcloud.nachrichten.postfach;
 
+import jakarta.validation.Valid;
 import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
 
 import lombok.Builder;
 import lombok.Getter;
@@ -43,7 +43,7 @@ public class PostfachAddress {
 
 	private String version;
 	private int type;
-	@NotNull
+	@Valid
 	private PostfachAddressIdentifier identifier;
 	@NotBlank
 	private String serviceKontoType;
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifier.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifier.java
index 5be71d5..5724f86 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifier.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifier.java
@@ -23,6 +23,8 @@
  */
 package de.ozgcloud.nachrichten.postfach;
 
+import jakarta.validation.constraints.NotBlank;
+
 import lombok.Builder;
 import lombok.Getter;
 
@@ -30,6 +32,7 @@ import lombok.Getter;
 @Getter
 public class StringBasedIdentifier implements PostfachAddressIdentifier {
 
+	@NotBlank
 	private String postfachId;
 
 	@Override
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/info/InfoManagerServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/info/InfoManagerServiceTest.java
index 87daf33..55f8368 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/info/InfoManagerServiceTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/info/InfoManagerServiceTest.java
@@ -41,6 +41,7 @@ import de.ozgcloud.nachrichten.postfach.PostfachException;
 import de.ozgcloud.nachrichten.postfach.PostfachMessageCode;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
+import de.ozgcloud.nachrichten.postfach.StringBasedIdentifierTestFactory;
 import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
 
 class InfoManagerServiceTest {
@@ -134,7 +135,7 @@ class InfoManagerServiceTest {
 
 			var id = service.getPostfachId(address);
 
-			assertThat(id).isEqualTo(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
+			assertThat(id).isEqualTo(StringBasedIdentifierTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
 		}
 
 		@Test
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java
index d80fe36..9a65253 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PersistPostfachNachrichtServiceImplTest.java
@@ -467,7 +467,7 @@ class PersistPostfachNachrichtServiceImplTest {
 		void shouldCallVorgangRemoteService() {
 			doFindAnswers().toList();
 
-			verify(vorgangService).findVorgangIds(serviceKontoType, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
+			verify(vorgangService).findVorgangIds(serviceKontoType, StringBasedIdentifierTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
 		}
 
 		@Test
@@ -485,7 +485,7 @@ class PersistPostfachNachrichtServiceImplTest {
 		}
 
 		private Stream<PostfachNachricht> doFindAnswers() {
-			return service.findAnswers(serviceKontoType, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE,
+			return service.findAnswers(serviceKontoType, StringBasedIdentifierTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE,
 					GrpcPostfachMailTestFactory.REFERENCED_NACHRICHT_ID);
 		}
 	}
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachAddressTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachAddressTestFactory.java
index 572b41d..e3458bb 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachAddressTestFactory.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachAddressTestFactory.java
@@ -23,14 +23,10 @@
  */
 package de.ozgcloud.nachrichten.postfach;
 
-import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
-
 public class PostfachAddressTestFactory {
 
 	public final static int TYPE = 1;
-	public static final String STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE = MessageTestFactory.POSTFACH_ID;
-	public final static StringBasedIdentifier IDENTIFIER = StringBasedIdentifier.builder().postfachId(STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE)
-			.build();
+	public final static StringBasedIdentifier IDENTIFIER = StringBasedIdentifierTestFactory.create();
 	public static final String VERSION = "1.0";
 
 	public static PostfachAddress create() {
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerTest.java
index 46a2e81..b38987c 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachEventListenerTest.java
@@ -146,7 +146,7 @@ class PostfachEventListenerTest {
 							PostfachAddress.TYPE_FIELD, PostfachAddressTestFactory.TYPE,
 							PostfachAddress.SERVICEKONTO_TYPE_FIELD, PostfachTestFactory.POSTFACH_TYPE,
 							PostfachAddress.IDENTIFIER_FIELD, //
-							Map.of(PostfachAddress.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE)),
+							Map.of(PostfachAddress.FIELD_POSTFACH_ID, StringBasedIdentifierTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE)),
 					PostfachNachricht.FIELD_SUBJECT, MessageTestFactory.SUBJECT,
 					PostfachNachricht.FIELD_MAIL_BODY, PostfachNachrichtTestFactory.MAIL_BODY,
 					PostfachNachricht.FIELD_REPLY_OPTION, PostfachNachrichtTestFactory.REPLY_OPTION.name(),
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtTestFactory.java
index aec4cf7..6c4e1e5 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtTestFactory.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtTestFactory.java
@@ -104,6 +104,6 @@ public class PostfachNachrichtTestFactory {
 	}
 
 	private static Map<String, Object> getPostfachAddressIdentifierAsMap() {
-		return Map.of(PostfachAddress.FIELD_POSTFACH_ID, PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
+		return Map.of(PostfachAddress.FIELD_POSTFACH_ID, StringBasedIdentifierTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
 	}
 }
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifierTestFactory.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifierTestFactory.java
new file mode 100644
index 0000000..7404e00
--- /dev/null
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/StringBasedIdentifierTestFactory.java
@@ -0,0 +1,40 @@
+/*
+ * 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.nachrichten.postfach;
+
+import de.ozgcloud.nachrichten.postfach.StringBasedIdentifier.StringBasedIdentifierBuilder;
+import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
+
+public class StringBasedIdentifierTestFactory {
+
+	public static final String STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE = MessageTestFactory.POSTFACH_ID;
+
+	public static StringBasedIdentifier create() {
+		return createBuilder().build();
+	}
+
+	public static StringBasedIdentifierBuilder createBuilder() {
+		return StringBasedIdentifier.builder().postfachId(STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
+	}
+}
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/BayernIdPostfachRemoteServiceITCase.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/BayernIdPostfachRemoteServiceITCase.java
index 86f9e13..6b64dbc 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/BayernIdPostfachRemoteServiceITCase.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/BayernIdPostfachRemoteServiceITCase.java
@@ -28,7 +28,6 @@ import static org.junit.jupiter.api.Assertions.*;
 import jakarta.validation.ConstraintViolationException;
 
 import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.NullAndEmptySource;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +38,7 @@ import de.ozgcloud.common.test.ITCase;
 import de.ozgcloud.nachrichten.email.EmailGrpcService;
 import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
+import de.ozgcloud.nachrichten.postfach.StringBasedIdentifierTestFactory;
 
 @ITCase
 @SpringBootTest(properties = { "ozgcloud.bayernid.enabled = true" })
@@ -65,10 +65,14 @@ class BayernIdPostfachRemoteServiceITCase {
 			assertThrows(ConstraintViolationException.class, () -> service.sendMessage(nachricht));
 		}
 
-		@Test
-		void shouldThrowConstraintViolationExceptionOnMissingIdentifier() {
+		@ParameterizedTest
+		@NullAndEmptySource
+		void shouldThrowConstraintViolationExceptionOnMissingIdentifier(String postfachId) {
+			var postfachAddress = PostfachAddressTestFactory.createBuilder()
+					.identifier(StringBasedIdentifierTestFactory.createBuilder().postfachId(postfachId).build())
+					.build();
 			var nachricht = PostfachNachrichtTestFactory.createBuilder()
-					.postfachAddress(PostfachAddressTestFactory.createBuilder().identifier(null).build())
+					.postfachAddress(postfachAddress)
 					.build();
 
 			assertThrows(ConstraintViolationException.class, () -> service.sendMessage(nachricht));
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapperTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapperTest.java
index 29255fb..48ff7d0 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapperTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachMessageMapperTest.java
@@ -42,6 +42,7 @@ import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht.Direction;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
+import de.ozgcloud.nachrichten.postfach.StringBasedIdentifierTestFactory;
 import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
 
 class OsiPostfachMessageMapperTest {
@@ -163,7 +164,7 @@ class OsiPostfachMessageMapperTest {
 				void shouldMapPostfachAddressToPostfachId() {
 					var message = toOsiMessage(PostfachNachrichtTestFactory.create());
 
-					assertThat(message.getPostfachId()).isEqualTo(PostfachAddressTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
+					assertThat(message.getPostfachId()).isEqualTo(StringBasedIdentifierTestFactory.STRING_BASED_IDENTIFIER_POSTFACH_ID_VALUE);
 				}
 			}
 
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteServiceITCase.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteServiceITCase.java
index ee9c037..2ddd91c 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteServiceITCase.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/osi/OsiPostfachRemoteServiceITCase.java
@@ -28,7 +28,6 @@ import static org.junit.jupiter.api.Assertions.*;
 import jakarta.validation.ConstraintViolationException;
 
 import org.junit.jupiter.api.Nested;
-import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.NullAndEmptySource;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -40,6 +39,7 @@ import de.ozgcloud.common.test.ITCase;
 import de.ozgcloud.nachrichten.email.EmailGrpcService;
 import de.ozgcloud.nachrichten.postfach.PostfachAddressTestFactory;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
+import de.ozgcloud.nachrichten.postfach.StringBasedIdentifierTestFactory;
 
 @ITCase
 @SpringBootTest(properties = {
@@ -72,10 +72,14 @@ class OsiPostfachRemoteServiceITCase {
 			assertThrows(ConstraintViolationException.class, () -> service.sendMessage(nachricht));
 		}
 
-		@Test
-		void shouldThrowConstraintViolationExceptionOnMissingIdentifier() {
+		@ParameterizedTest
+		@NullAndEmptySource
+		void shouldThrowConstraintViolationExceptionOnMissingIdentifier(String postfachId) {
+			var postfachAddress = PostfachAddressTestFactory.createBuilder()
+					.identifier(StringBasedIdentifierTestFactory.createBuilder().postfachId(postfachId).build())
+					.build();
 			var nachricht = PostfachNachrichtTestFactory.createBuilder()
-					.postfachAddress(PostfachAddressTestFactory.createBuilder().identifier(null).build())
+					.postfachAddress(postfachAddress)
 					.build();
 
 			assertThrows(ConstraintViolationException.class, () -> service.sendMessage(nachricht));
-- 
GitLab