From c42360d53aa361e5bf4e18c07d13495e14613020 Mon Sep 17 00:00:00 2001
From: OZG-Cloud Team <noreply@ozg-sh.de>
Date: Mon, 8 Jul 2024 10:11:34 +0200
Subject: [PATCH] OZG-5156 fim: Allow fim messages

---
 .../de/ozgcloud/eingang/xta/XtaService.java   | 19 +++++++
 .../de/ozgcloud/eingang/xta/XtaITCase.java    | 24 +++++++-
 .../ozgcloud/eingang/xta/XtaServiceTest.java  | 55 ++++++++++++++++++-
 3 files changed, 94 insertions(+), 4 deletions(-)

diff --git a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
index c4e51213..19e712d4 100644
--- a/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
+++ b/xta-adapter/src/main/java/de/ozgcloud/eingang/xta/XtaService.java
@@ -1,5 +1,7 @@
 package de.ozgcloud.eingang.xta;
 
+import static java.util.Collections.*;
+
 import java.util.List;
 import java.util.Spliterators;
 import java.util.stream.Stream;
@@ -23,6 +25,8 @@ class XtaService {
 
 	static final String XDOMEA_0201_MESSAGE_TYPE = "Geschaeftsgang.Geschaeftsgang.0201";
 
+	static final String FIM_MESSAGE_TYPE_PREFIX = "fim.";
+
 	@Autowired
 	private XtaRemoteService remoteService;
 	@Autowired
@@ -48,6 +52,10 @@ class XtaService {
 			return true;
 		}
 
+		if (StringUtils.startsWith(metaData.getMessageType(), FIM_MESSAGE_TYPE_PREFIX)) {
+			return true;
+		}
+
 		LOG.warn("Ignoring XTA-Message of type '{}'.", metaData.getMessageType());
 		return false;
 	}
@@ -63,9 +71,20 @@ class XtaService {
 		if (StringUtils.equals(metaData.getMessageType(), XDOMEA_0201_MESSAGE_TYPE)) {
 			return xdomeaMessageDataMapper.mapIncomingFilesToRepresentationsAttachmentsPair(incomingFiles);
 		}
+		if (StringUtils.startsWith(metaData.getMessageType(), FIM_MESSAGE_TYPE_PREFIX)) {
+			return mapIncomingFilesToRepresentations(incomingFiles);
+		}
+
 		throw new TechnicalException("Unexpected XTA message type: %s".formatted(metaData.getMessageType()));
 	}
 
+	RepresentationsAttachmentsPair mapIncomingFilesToRepresentations(List<IncomingFile> incomingFiles) {
+		return RepresentationsAttachmentsPair.builder()
+				.representations(incomingFiles)
+				.attachments(emptyList())
+				.build();
+	}
+
 	public void acknowledgeReceive(@NonNull XtaMessageId messageId) {
 		remoteService.close(messageId);
 	}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
index 6a5705a3..43d08f9a 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaITCase.java
@@ -13,6 +13,7 @@ import java.util.Optional;
 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.ArgumentCaptor;
@@ -148,6 +149,28 @@ class XtaITCase {
 			assertThat(vorgangNummer).hasSize(9);
 		}
 
+		@DisplayName("should use xta vorgangsnummer for FIM")
+		@Test
+		void shouldUseVorgangsnummerForFIM() {
+			mockNachrichtenBroker("versammlungsanzeige.xml");
+
+			runner.runGetXtaMessages();
+
+			var vorgangNummer = captureEingang().getHeader().getVorgangNummer();
+			assertThat(vorgangNummer).hasSize(9);
+		}
+
+		@DisplayName("should have one attachment for FIM")
+		@Test
+		void shouldHaveOneRepresentationForFim() {
+			mockNachrichtenBroker("versammlungsanzeige.xml");
+
+			runner.runGetXtaMessages();
+
+			var eingang = captureEingang();
+			assertThat(eingang.getNumberOfRepresentations()).isEqualTo(1);
+		}
+
 		private GrpcEingang captureEingang() {
 			verify(vorgangRemoteService, times(1))
 					.createVorgang(
@@ -158,7 +181,6 @@ class XtaITCase {
 
 			assertThat(formDataArgumentCaptor.getValue()).isNotNull();
 			assertThat(eingangArgumentCaptor.getValue()).isNotNull();
-			assertThat(organisationseinheitenIdArgumentCaptor.getValue()).isPresent();
 
 			return eingangArgumentCaptor.getValue();
 		}
diff --git a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java
index d695eded..d0e4d3c5 100644
--- a/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java
+++ b/xta-adapter/src/test/java/de/ozgcloud/eingang/xta/XtaServiceTest.java
@@ -1,5 +1,6 @@
 package de.ozgcloud.eingang.xta;
 
+import static de.ozgcloud.eingang.xta.XtaService.*;
 import static org.assertj.core.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
@@ -102,10 +103,19 @@ class XtaServiceTest {
 	class TestIsSupportedMessageType {
 
 		@Test
-		void shouldAcceptDFoerdermittel() {
-			var metaDataDFoerder = XtaMessageMetaDataTestFactory.create();
+		void shouldAcceptGeschaeftsgang() {
+			var geschaeftsgangMetaData = XtaMessageMetaDataTestFactory.create();
 
-			assertThat(service.isSupportedMessageType(metaDataDFoerder)).isTrue();
+			assertThat(service.isSupportedMessageType(geschaeftsgangMetaData)).isTrue();
+		}
+
+		@Test
+		void shouldAcceptFIM() {
+			var fimMetaData = XtaMessageMetaDataTestFactory.createBuilder()
+					.messageType(FIM_MESSAGE_TYPE_PREFIX + "34355")
+					.build();
+
+			assertThat(service.isSupportedMessageType(fimMetaData)).isTrue();
 		}
 
 		@Test
@@ -205,6 +215,17 @@ class XtaServiceTest {
 			assertThat(result).isEqualTo(classification);
 		}
 
+		@DisplayName("should use correct mapping for FIM message")
+		@Test
+		void shouldUseCorrectMappingForFimMessage() {
+			when(messageMetaData.getMessageType()).thenReturn(FIM_MESSAGE_TYPE_PREFIX + "836487");
+			doReturn(classification).when(service).mapIncomingFilesToRepresentations(incomingFiles);
+
+			var result = service.getRepresentationsAttachmentsPair(messageMetaData, incomingFiles);
+
+			assertThat(result).isEqualTo(classification);
+		}
+
 		@DisplayName("should throw exception for unexpected message type")
 		@Test
 		void shouldThrowExceptionForUnexpectedMessageType() {
@@ -215,6 +236,34 @@ class XtaServiceTest {
 		}
 	}
 
+	@DisplayName("map incoming files to representations")
+	@Nested
+	class TestMapIncomingFilesToRepresentations {
+
+		private List<IncomingFile> incomingFiles;
+
+		@BeforeEach
+		void mock() {
+			incomingFiles = List.of(IncomingFileTestFactory.create(), IncomingFileTestFactory.create());
+
+		}
+		@DisplayName("should return representations with incoming files")
+		@Test
+		void shouldReturnRepresentationsWithIncomingFiles() {
+			var result = service.mapIncomingFilesToRepresentations(incomingFiles);
+
+			assertThat(result.representations()).isEqualTo(incomingFiles);
+		}
+
+		@DisplayName("should return attachments with empty list")
+		@Test
+		void shouldReturnAttachmentsWithEmptyList() {
+			var result = service.mapIncomingFilesToRepresentations(incomingFiles);
+
+			assertThat(result.attachments()).isEmpty();
+		}
+	}
+
 	@Nested
 	class TestAcknowledgeReceive {
 
-- 
GitLab