From 887279f75be51aeccc1ab81764363c42ae7f1db6 Mon Sep 17 00:00:00 2001
From: Jan Zickermann <jan.zickermann@dataport.de>
Date: Mon, 9 Sep 2024 12:29:37 +0200
Subject: [PATCH] OZG-6240 KOP-2627 Implement required getMessage behaviour

---
 .../de/ozgcloud/xta/client/XtaClient.java     | 15 ++++++--
 .../model/XtaMessageAndTransportReport.java   | 13 +++++++
 .../ozgcloud/xta/client/XtaClientITCase.java  | 22 +++++++++++-
 .../de/ozgcloud/xta/client/XtaClientTest.java | 35 ++++++++++++++++---
 4 files changed, 77 insertions(+), 8 deletions(-)
 create mode 100644 src/main/java/de/ozgcloud/xta/client/model/XtaMessageAndTransportReport.java

diff --git a/src/main/java/de/ozgcloud/xta/client/XtaClient.java b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
index 03ca7b8..ea84475 100644
--- a/src/main/java/de/ozgcloud/xta/client/XtaClient.java
+++ b/src/main/java/de/ozgcloud/xta/client/XtaClient.java
@@ -5,8 +5,8 @@ import jakarta.validation.constraints.NotBlank;
 import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.WrappedXtaService;
 import de.ozgcloud.xta.client.model.XtaIdentifier;
-import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
+import de.ozgcloud.xta.client.model.XtaMessageAndTransportReport;
 import genv3.de.xoev.transport.xta.x211.InvalidMessageIDException;
 import genv3.de.xoev.transport.xta.x211.PermissionDeniedException;
 import genv3.de.xoev.transport.xta.x211.XTAWSTechnicalProblemException;
@@ -53,9 +53,18 @@ public class XtaClient {
 		return service.getStatusList(clientIdentifier, config.getMaxListItems());
 	}
 
-	public XtaMessage getMessage(@NotBlank String clientIdentifier, @NotBlank String messageId)
+	public XtaMessageAndTransportReport getMessage(@NotBlank String clientIdentifier, @NotBlank String messageId)
 			throws XTAWSTechnicalProblemException, PermissionDeniedException, InvalidMessageIDException {
-		return service.getMessage(messageId, deriveIdentifier(clientIdentifier));
+		var identifier = deriveIdentifier(clientIdentifier);
+
+		var message = service.getMessage(messageId, identifier);
+		service.close(messageId, identifier);
+
+		var transportReport = service.getTransportReport(messageId, identifier);
+		return XtaMessageAndTransportReport.builder()
+				.message(message)
+				.transportReport(transportReport)
+				.build();
 	}
 
 	public void close(@NotBlank String clientIdentifier, @NotBlank String messageId)
diff --git a/src/main/java/de/ozgcloud/xta/client/model/XtaMessageAndTransportReport.java b/src/main/java/de/ozgcloud/xta/client/model/XtaMessageAndTransportReport.java
new file mode 100644
index 0000000..6fed361
--- /dev/null
+++ b/src/main/java/de/ozgcloud/xta/client/model/XtaMessageAndTransportReport.java
@@ -0,0 +1,13 @@
+package de.ozgcloud.xta.client.model;
+
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+
+import lombok.Builder;
+
+@Builder
+public record XtaMessageAndTransportReport(
+		@NotNull @Valid XtaMessage message,
+		@NotNull @Valid XtaTransportReport transportReport
+) {
+}
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java b/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
index da95fab..acbad8c 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientITCase.java
@@ -92,7 +92,27 @@ class XtaClientITCase {
 		void shouldReturnMessage() {
 			var result = client.getMessage(CLIENT_IDENTIFIER1.value(), messageId);
 
-			assertThat(result.metaData().messageId()).isEqualTo(messageId);
+			assertThat(result.message().metaData().messageId()).isEqualTo(messageId);
+		}
+
+		@DisplayName("should return transport report")
+		@Test
+		@SneakyThrows
+		void shouldReturnTransportReport() {
+			var result = client.getMessage(CLIENT_IDENTIFIER1.value(), messageId);
+
+			assertThat(result.transportReport().metaData().messageId()).isEqualTo(messageId);
+		}
+
+
+		@DisplayName("should throw invalid message id exception on second call due to closed message")
+		@Test
+		@SneakyThrows
+		void shouldThrowInvalidMessageIdExceptionOnSecondCallDueToClosedMessage() {
+			client.getMessage(CLIENT_IDENTIFIER1.value(), messageId);
+
+			assertThatThrownBy(() -> client.getMessage(CLIENT_IDENTIFIER1.value(), messageId))
+					.isInstanceOf(InvalidMessageIDException.class);
 		}
 
 		@DisplayName("should throw invalid message id exception for modified message id")
diff --git a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
index 45e6a1f..6105b1e 100644
--- a/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
+++ b/src/test/java/de/ozgcloud/xta/client/XtaClientTest.java
@@ -21,6 +21,7 @@ import de.ozgcloud.xta.client.config.XtaClientConfig;
 import de.ozgcloud.xta.client.core.WrappedXtaService;
 import de.ozgcloud.xta.client.model.XtaMessage;
 import de.ozgcloud.xta.client.model.XtaMessageMetaDataListing;
+import de.ozgcloud.xta.client.model.XtaTransportReport;
 import lombok.SneakyThrows;
 
 @ExtendWith(MockitoExtension.class)
@@ -128,16 +129,42 @@ class XtaClientTest {
 		@Mock
 		XtaMessage xtaMessage;
 
-		@DisplayName("should return")
-		@Test
+		@Mock
+		XtaTransportReport xtaTransportReport;
+
+		@BeforeEach
 		@SneakyThrows
-		void shouldReturn() {
+		void mock() {
 			doReturn(SELF_IDENTIFIER).when(client).deriveIdentifier(SELF_IDENTIFIER_VALUE);
 			when(service.getMessage(MESSAGE_ID, SELF_IDENTIFIER)).thenReturn(xtaMessage);
+			when(service.getTransportReport(MESSAGE_ID, SELF_IDENTIFIER)).thenReturn(xtaTransportReport);
+		}
+
+		@DisplayName("should call close")
+		@Test
+		@SneakyThrows
+		void shouldCallClose() {
+			client.getMessage(SELF_IDENTIFIER_VALUE, MESSAGE_ID);
 
+			verify(service).close(MESSAGE_ID, SELF_IDENTIFIER);
+		}
+
+		@DisplayName("should return with message")
+		@Test
+		@SneakyThrows
+		void shouldReturn() {
+			var result = client.getMessage(SELF_IDENTIFIER_VALUE, MESSAGE_ID);
+
+			assertThat(result.message()).isEqualTo(xtaMessage);
+		}
+
+		@DisplayName("should return with transport report")
+		@Test
+		@SneakyThrows
+		void shouldReturnWithTransportReport() {
 			var result = client.getMessage(SELF_IDENTIFIER_VALUE, MESSAGE_ID);
 
-			assertThat(result).isEqualTo(xtaMessage);
+			assertThat(result.transportReport()).isEqualTo(xtaTransportReport);
 		}
 	}
 
-- 
GitLab