From 3b3badd0c2c5aa56e4565b5f8836e559eb321d7a Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Thu, 20 Feb 2025 16:01:51 +0100
Subject: [PATCH] OZG-4097 error-handling: Provide messageCode for unknown
 postfachId

---
 .../osiv2/exception/Osi2ExceptionHandler.java     | 13 ++++++++-----
 .../osiv2/OsiPostfachRemoteServiceITCase.java     | 13 +++++++++++++
 .../osiv2/exception/Osi2ExceptionHandlerTest.java | 15 ++++++---------
 3 files changed, 27 insertions(+), 14 deletions(-)

diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandler.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandler.java
index b90e797..395f427 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandler.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandler.java
@@ -1,9 +1,8 @@
 package de.ozgcloud.nachrichten.postfach.osiv2.exception;
 
-import java.io.IOException;
-
 import jakarta.annotation.Nullable;
 
+import org.springframework.http.HttpStatusCode;
 import org.springframework.web.client.ResourceAccessException;
 import org.springframework.web.client.RestClientResponseException;
 
@@ -24,11 +23,15 @@ public class Osi2ExceptionHandler {
 	}
 
 	PostfachMessageCode deriveMessageCodeFromRestClientResponseException(RestClientResponseException restClientResponseException) {
-		var cause = restClientResponseException.getCause();
-		if (cause instanceof IOException) {
-			return PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE;
+		if (hasStatusNotFound(restClientResponseException)) {
+			return PostfachMessageCode.SEND_FAILED_UNKNOWN_POSTFACH_ID_MESSAGE_CODE;
 		}
 		return PostfachMessageCode.PROCESS_FAILED_MESSAGE_CODE;
 	}
 
+	private boolean hasStatusNotFound(RestClientResponseException restClientResponseException) {
+		return restClientResponseException.getStatusCode().isSameCodeAs(HttpStatusCode.valueOf(404));
+	}
+
+
 }
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
index 1460c96..550d15b 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/OsiPostfachRemoteServiceITCase.java
@@ -144,6 +144,19 @@ class OsiPostfachRemoteServiceITCase {
 				.hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SERVER_CONNECTION_FAILED_MESSAGE_CODE);
 	}
 
+	@DisplayName("should throw postfach exception with unknown postfach id error code")
+	@Test
+	void shouldThrowPostfachExceptionWithUnknownPostfachIdErrorCode() {
+		postfachFacadeMockServer.stubFor(post(urlPathTemplate("/MessageExchange/v1/Send/{mailboxId}"))
+				.willReturn(notFound())
+		);
+		var postfachNachricht = PostfachNachrichtTestFactory.create();
+
+		assertThatThrownBy(() -> osiPostfachRemoteService.sendMessage(postfachNachricht))
+				.isInstanceOf(Osi2PostfachException.class)
+				.hasFieldOrPropertyWithValue("messageCode", PostfachMessageCode.SEND_FAILED_UNKNOWN_POSTFACH_ID_MESSAGE_CODE);
+	}
+
 	@DisplayName("should delete attachments on upload exception")
 	@Test
 	void shouldDeleteAttachmentsOnUploadException() {
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandlerTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandlerTest.java
index 14671a0..df51704 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandlerTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/exception/Osi2ExceptionHandlerTest.java
@@ -4,14 +4,13 @@ import static de.ozgcloud.nachrichten.postfach.PostfachMessageCode.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
-import java.io.IOException;
-
 import org.junit.jupiter.api.DisplayName;
 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 org.springframework.http.HttpStatusCode;
 import org.springframework.web.client.RestClientResponseException;
 
 class Osi2ExceptionHandlerTest {
@@ -49,26 +48,24 @@ class Osi2ExceptionHandlerTest {
 	@DisplayName("derive message code from rest client response exception")
 	@Nested
 	class TestDeriveOsi2MessageCodeFromRestClientResponseException {
-		@Mock
-		IOException ioException;
 
 		@Mock
 		private RestClientResponseException restClientResponseException;
 
-		@DisplayName("should return server connection failed message code")
+		@DisplayName("should return unknown postfach id error code for 404")
 		@Test
-		void shouldReturnServerConnectionFailedMessageCode() {
-			when(restClientResponseException.getCause()).thenReturn(ioException);
+		void shouldReturnUnknownPostfachIdErrorCodeFor404() {
+			when(restClientResponseException.getStatusCode()).thenReturn(HttpStatusCode.valueOf(404));
 
 			var result = handler.deriveMessageCodeFromRestClientResponseException(restClientResponseException);
 
-			assertThat(result).isEqualTo(SERVER_CONNECTION_FAILED_MESSAGE_CODE);
+			assertThat(result).isEqualTo(SEND_FAILED_UNKNOWN_POSTFACH_ID_MESSAGE_CODE);
 		}
 
 		@DisplayName("should return process failed message code by default")
 		@Test
 		void shouldReturnProcessFailedMessageCodeByDefault() {
-			when(restClientResponseException.getCause()).thenReturn(null);
+			when(restClientResponseException.getStatusCode()).thenReturn(HttpStatusCode.valueOf(500));
 
 			var result = handler.deriveMessageCodeFromRestClientResponseException(restClientResponseException);
 
-- 
GitLab