From bb98f9e3bedb003b6a8df13860a1bbd59832da8e Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 10 Oct 2024 09:47:21 +0200
Subject: [PATCH] OZG-6858 handle NotFoundException from api lib

---
 .../errorhandling/ExceptionHandler.java       | 10 ++++
 .../errorhandling/ExceptionHandlerTest.java   | 53 +++++++++++++++++++
 2 files changed, 63 insertions(+)

diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java
index 11318a0cf..27b693e67 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandler.java
@@ -102,6 +102,16 @@ public class ExceptionHandler {
 		return Status.INTERNAL.withDescription(message).withCause(e.getCause());
 	}
 
+	@GrpcExceptionHandler
+	public StatusException handleNotFoundException(de.ozgcloud.apilib.common.errorhandling.NotFoundException e) {
+		LOG.error(ERROR_MESSAGE, e);
+		var exceptionId = createExceptionId();
+		var messageWithExceptionId = ExceptionUtil.formatMessageWithExceptionId(e.getMessage(), exceptionId);
+		var status = Status.NOT_FOUND.withDescription(messageWithExceptionId).withCause(e.getCause());
+
+		return createStatusException(status, buildMetadata(exceptionId));
+	}
+
 	private Metadata buildMetadata(String exceptionId) {
 		var metadata = new Metadata();
 		addExceptionId(metadata, exceptionId);
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java
index 5988d1bde..5387ed1ef 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/common/errorhandling/ExceptionHandlerTest.java
@@ -29,12 +29,14 @@ import static org.mockito.Mockito.*;
 import java.util.Map;
 
 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.InjectMocks;
 import org.mockito.Spy;
 import org.springframework.security.access.AccessDeniedException;
 
+import de.ozgcloud.apilib.common.datatypes.GenericId;
 import de.ozgcloud.common.errorhandling.FunctionalErrorCode;
 import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.vorgang.vorgang.Vorgang;
@@ -308,4 +310,55 @@ class ExceptionHandlerTest {
 			return handler.handleSearchServiceUnavailableException(exception);
 		}
 	}
+
+	@DisplayName("Handle not found exception (from api lib)")
+	@Nested
+	class TestHandleNotFoundExceptionFromApiLib {
+
+		private final String exceptionId = "42";
+		private final GenericId id = GenericId.from(VorgangTestFactory.ID);
+		private final String entityName = Vorgang.class.toString();
+
+		@BeforeEach
+		void mockExceptionId() {
+			doReturn(exceptionId).when(handler).createExceptionId();
+		}
+
+		@Test
+		void shouldHaveStatusCode() {
+			var status = handleException().getStatus();
+
+			assertThat(status.getCode()).isEqualTo(Code.NOT_FOUND);
+		}
+
+		@Test
+		void shouldHaveMessage() {
+			var statusException = handleException();
+
+			assertThat(statusException.getMessage()).contains(id.toString());
+			assertThat(statusException.getMessage()).contains(entityName);
+			assertThat(statusException.getMessage()).contains(exceptionId);
+		}
+
+		@Test
+		void shouldHaveStatusDescription() {
+			var status = handleException().getStatus();
+
+			assertThat(status.getDescription()).contains(id.toString());
+			assertThat(status.getDescription()).contains(entityName);
+			assertThat(status.getDescription()).contains(exceptionId);
+		}
+
+		@Test
+		void shouldHaveExceptionId() {
+			var metaData = handleException().getTrailers();
+
+			assertThat(metaData.get(createExceptionIdKey())).isEqualTo(exceptionId);
+		}
+
+		private StatusException handleException() {
+			return handler.handleNotFoundException(
+					new de.ozgcloud.apilib.common.errorhandling.NotFoundException(id, entityName));
+		}
+	}
 }
\ No newline at end of file
-- 
GitLab