From 19a0206d007ae4218c493ac9deaddcdee500ca84 Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Wed, 26 Mar 2025 15:14:03 +0100
Subject: [PATCH] OZG-6831 servicekonto: Catch runtime-exception in
 getPostfachAddressType

---
 .../semantik/common/ServiceKontoFactory.java  | 20 ++---
 .../common/ServiceKontoFactoryTest.java       | 78 +++++++++++++++----
 2 files changed, 73 insertions(+), 25 deletions(-)

diff --git a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactory.java b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactory.java
index f41a76e44..6d6eba4ac 100644
--- a/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactory.java
+++ b/semantik-adapter/src/main/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactory.java
@@ -23,15 +23,6 @@
  */
 package de.ozgcloud.eingang.semantik.common;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-
-import org.apache.commons.collections.MapUtils;
-import org.springframework.stereotype.Component;
-
 import de.ozgcloud.eingang.common.formdata.FormData;
 import de.ozgcloud.eingang.common.formdata.PostfachAddressIdentifier;
 import de.ozgcloud.eingang.common.formdata.ServiceKonto;
@@ -39,6 +30,10 @@ import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
 import de.ozgcloud.eingang.common.formdata.ServiceKonto.TrustLevel;
 import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
 import lombok.extern.log4j.Log4j2;
+import org.apache.commons.collections.MapUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
 
 @Component
 @Log4j2
@@ -102,7 +97,12 @@ public class ServiceKontoFactory {
 	}
 
 	int getPostfachAddressType(Map<String, Object> restResponseName) {
-		return getMailboxType(restResponseName);
+		try {
+			return getMailboxType(restResponseName);
+		} catch (RuntimeException e) {
+			LOG.error("Error while getting mailbox type from rest response name", e);
+			return POSTFACH_ADDRESS_DEFAULT;
+		}
 	}
 
 	private Integer getMailboxType(Map<String, Object> restResponseName) {
diff --git a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactoryTest.java b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactoryTest.java
index 5f9fba08b..a1a30252a 100644
--- a/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactoryTest.java
+++ b/semantik-adapter/src/test/java/de/ozgcloud/eingang/semantik/common/ServiceKontoFactoryTest.java
@@ -23,28 +23,26 @@
  */
 package de.ozgcloud.eingang.semantik.common;
 
-import static org.assertj.core.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.*;
-import static org.mockito.Mockito.*;
-
-import java.util.List;
-import java.util.Map;
-
+import de.ozgcloud.eingang.common.formdata.*;
+import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
+import de.ozgcloud.eingang.common.formdata.ServiceKonto.TrustLevel;
 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.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
 import org.mockito.InjectMocks;
 import org.mockito.Spy;
 
-import de.ozgcloud.eingang.common.formdata.FormData;
-import de.ozgcloud.eingang.common.formdata.FormDataUtils;
-import de.ozgcloud.eingang.common.formdata.PostfachAddressTestFactory;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto.TrustLevel;
-import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory;
-import de.ozgcloud.eingang.common.formdata.StringBasedIdentifier;
-import de.ozgcloud.eingang.common.formdata.ServiceKonto.PostfachAddress;
+import java.util.List;
+import java.util.Map;
+
+import static de.ozgcloud.eingang.semantik.common.ServiceKontoFactory.POSTFACH_ADDRESS_DEFAULT;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.*;
 
 class ServiceKontoFactoryTest {
 
@@ -123,11 +121,61 @@ class ServiceKontoFactoryTest {
 					assertThat(addresses.get(0).getType()).isEqualTo(PostfachAddressTestFactory.POSTFACH_ADDRESS_TYPE);
 				}
 
+				@DisplayName("should return with postfach address type")
+				@ParameterizedTest
+				@ValueSource(ints = {1, 2, 3})
+				void shouldReturnWithPostfachAddressType(int postfachAddressType) {
+					var formDataWithPostfachAddressType = FormDataUtils.from(FORM_DATA)
+							.put(ServiceKontoFactory.REST_RESPONSE_NAME, List.of(Map.of(
+									ServiceKontoFactory.REST_RESPONSE_NAME_MEMBER_SCOPE,
+									List.of(Map.of(ServiceKontoFactory.REST_RESPONSE_NAME_MEMBER_SCOPE_MAILBOX_TYPE,
+											postfachAddressType))))
+							)
+							.build();
+
+					var addresses = buildServiceKonto(formDataWithPostfachAddressType);
+
+					var types = addresses.getPostfachAddresses()
+							.stream()
+							.map(PostfachAddress::getType)
+							.toList();
+					assertThat(types).containsExactly(postfachAddressType);
+				}
+
 				private List<PostfachAddress> getPostfachAddresses() {
 					return buildServiceKonto(FORM_DATA).getPostfachAddresses();
 				}
 			}
 
+			@DisplayName("with bad rest_response_name")
+			@Nested
+			class TestWithBadRestResponseName {
+
+				private final FormData formDataWithBadRestResponseName = FormDataUtils.from(FORM_DATA)
+						.put(ServiceKontoFactory.REST_RESPONSE_NAME, List.of(Map.of())).build();
+
+				@Test
+				void shouldCallBuildAddresses() {
+					getPostfachAddresses();
+
+					verify(factory).buildOsiPostfachV1Address(any(), anyInt());
+				}
+
+				@DisplayName("should return postfach address with default type")
+				@Test
+				void shouldReturnPostfachAddressWithDefaultType() {
+					var addresses = getPostfachAddresses();
+
+					assertThat(addresses)
+							.extracting("type")
+							.containsExactly(POSTFACH_ADDRESS_DEFAULT);
+				}
+
+				private List<PostfachAddress> getPostfachAddresses() {
+					return buildServiceKonto(formDataWithBadRestResponseName).getPostfachAddresses();
+				}
+			}
+
 			@DisplayName("without rest_response_name")
 			@Nested
 			class TestWithoutRestResponseName {
-- 
GitLab