From 80c38ac52157c01cdd3280f01604e0f20a58b241 Mon Sep 17 00:00:00 2001
From: Krzysztof Witukiewicz <krzysztof.witukiewicz@mgm-tp.com>
Date: Thu, 23 Jan 2025 11:01:54 +0100
Subject: [PATCH] OZG-7262 OZG-7584 Attachments should not be null

---
 .../archive/export/ExportGrpcService.java     |   2 -
 .../ozgcloud/archive/kommentar/Kommentar.java |   2 +
 .../archive/kommentar/KommentarMapper.java    |   2 +
 .../kommentar/KommentarMapperTest.java        | 153 ++++++++++--------
 4 files changed, 88 insertions(+), 71 deletions(-)

diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportGrpcService.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportGrpcService.java
index 6589322..5cae921 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportGrpcService.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/export/ExportGrpcService.java
@@ -44,8 +44,6 @@ import net.devh.boot.grpc.server.service.GrpcService;
 @RequiredArgsConstructor
 class ExportGrpcService extends ExportServiceImplBase {
 
-	static final int CHUNK_SIZE = 256 * 1024;
-
 	private final ExportService exportService;
 	private final TaskExecutor taskExecutor;
 
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/Kommentar.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/Kommentar.java
index 4039231..ade35f0 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/Kommentar.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/Kommentar.java
@@ -29,6 +29,7 @@ import java.util.List;
 import de.ozgcloud.common.binaryfile.FileId;
 import lombok.Builder;
 import lombok.Getter;
+import lombok.Singular;
 
 @Builder
 @Getter
@@ -37,5 +38,6 @@ public class Kommentar {
 	private String text;
 	private ZonedDateTime createdAt;
 	private String createdBy;
+	@Singular
 	private List<FileId> attachments;
 }
diff --git a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarMapper.java b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarMapper.java
index 64ebb6a..58c046a 100644
--- a/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarMapper.java
+++ b/archive-manager-server/src/main/java/de/ozgcloud/archive/kommentar/KommentarMapper.java
@@ -27,6 +27,7 @@ import java.util.Map;
 import java.util.Objects;
 
 import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 import org.mapstruct.NullValueCheckStrategy;
 import org.mapstruct.ReportingPolicy;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -55,6 +56,7 @@ abstract class KommentarMapper {
 		return grpcObjectMapper.mapFromGrpc(item);
 	}
 
+	@Mapping(target = "attachment", ignore = true)
 	abstract Kommentar mapItemMapToKommentar(Map<String, Object> map);
 
 	String mapObjectToString(Object object) {
diff --git a/archive-manager-server/src/test/java/de/ozgcloud/archive/kommentar/KommentarMapperTest.java b/archive-manager-server/src/test/java/de/ozgcloud/archive/kommentar/KommentarMapperTest.java
index d871e38..368c51b 100644
--- a/archive-manager-server/src/test/java/de/ozgcloud/archive/kommentar/KommentarMapperTest.java
+++ b/archive-manager-server/src/test/java/de/ozgcloud/archive/kommentar/KommentarMapperTest.java
@@ -145,101 +145,116 @@ class KommentarMapperTest {
 	@Nested
 	class TestMapItemMapToKommentar {
 
-		@BeforeEach
-		void init() {
-			doReturn(KommentarTestFactory.ID).when(mapper).mapObjectToString(KommentarTestFactory.ID);
-			doReturn(KommentarTestFactory.TEXT).when(mapper).mapObjectToString(KommentarTestFactory.TEXT);
-			doReturn(KommentarTestFactory.CREATED_BY).when(mapper).mapObjectToString(KommentarTestFactory.CREATED_BY);
-			doReturn(KommentarTestFactory.CREATED_AT_STR).when(mapper).mapObjectToString(KommentarTestFactory.CREATED_AT_STR);
+		@Nested
+		class OnAllFieldsSet {
 
-			when(timeMapper.parseString(KommentarTestFactory.CREATED_AT_STR)).thenReturn(KommentarTestFactory.CREATED_AT);
-			when(attachmentMapper.mapAttachments(argThat(this::isCollectionOfAttachmentIds))).thenReturn(KommentarTestFactory.ATTACHMENTS);
-		}
+			@BeforeEach
+			void init() {
+				doReturn(KommentarTestFactory.ID).when(mapper).mapObjectToString(KommentarTestFactory.ID);
+				doReturn(KommentarTestFactory.TEXT).when(mapper).mapObjectToString(KommentarTestFactory.TEXT);
+				doReturn(KommentarTestFactory.CREATED_BY).when(mapper).mapObjectToString(KommentarTestFactory.CREATED_BY);
+				doReturn(KommentarTestFactory.CREATED_AT_STR).when(mapper).mapObjectToString(KommentarTestFactory.CREATED_AT_STR);
 
-		@Test
-		void shouldMapIdToString() {
-			callMapper();
+				when(timeMapper.parseString(KommentarTestFactory.CREATED_AT_STR)).thenReturn(KommentarTestFactory.CREATED_AT);
+				when(attachmentMapper.mapAttachments(argThat(this::isCollectionOfAttachmentIds))).thenReturn(KommentarTestFactory.ATTACHMENTS);
+			}
 
-			verify(mapper).mapObjectToString(KommentarTestFactory.ID);
-		}
+			@Test
+			void shouldMapIdToString() {
+				callMapper();
 
-		@Test
-		void shouldMapId() {
-			var kommentar = callMapper();
+				verify(mapper).mapObjectToString(KommentarTestFactory.ID);
+			}
 
-			assertThat(kommentar.getId()).isEqualTo(KommentarTestFactory.ID);
-		}
+			@Test
+			void shouldMapId() {
+				var kommentar = callMapper();
 
-		@Test
-		void shouldMapTextToString() {
-			callMapper();
+				assertThat(kommentar.getId()).isEqualTo(KommentarTestFactory.ID);
+			}
 
-			verify(mapper).mapObjectToString(KommentarTestFactory.TEXT);
-		}
+			@Test
+			void shouldMapTextToString() {
+				callMapper();
 
-		@Test
-		void shouldMapText() {
-			var kommentar = callMapper();
+				verify(mapper).mapObjectToString(KommentarTestFactory.TEXT);
+			}
 
-			assertThat(kommentar.getText()).isEqualTo(KommentarTestFactory.TEXT);
-		}
+			@Test
+			void shouldMapText() {
+				var kommentar = callMapper();
 
-		@Test
-		void shouldMapCreatedByToString() {
-			callMapper();
+				assertThat(kommentar.getText()).isEqualTo(KommentarTestFactory.TEXT);
+			}
 
-			verify(mapper).mapObjectToString(KommentarTestFactory.CREATED_BY);
-		}
+			@Test
+			void shouldMapCreatedByToString() {
+				callMapper();
 
-		@Test
-		void shouldMapCreatedBy() {
-			var kommentar = callMapper();
+				verify(mapper).mapObjectToString(KommentarTestFactory.CREATED_BY);
+			}
 
-			assertThat(kommentar.getCreatedBy()).isEqualTo(KommentarTestFactory.CREATED_BY);
-		}
+			@Test
+			void shouldMapCreatedBy() {
+				var kommentar = callMapper();
 
-		@Test
-		void shouldMapCreatedAtToString() {
-			callMapper();
+				assertThat(kommentar.getCreatedBy()).isEqualTo(KommentarTestFactory.CREATED_BY);
+			}
 
-			verify(mapper).mapObjectToString(KommentarTestFactory.CREATED_AT_STR);
-		}
+			@Test
+			void shouldMapCreatedAtToString() {
+				callMapper();
 
-		@Test
-		void shouldCallTimeMapper() {
-			callMapper();
+				verify(mapper).mapObjectToString(KommentarTestFactory.CREATED_AT_STR);
+			}
 
-			verify(timeMapper).parseString(KommentarTestFactory.CREATED_AT_STR);
-		}
+			@Test
+			void shouldCallTimeMapper() {
+				callMapper();
 
-		@Test
-		void shouldMapCreatedAt() {
-			var kommentar = callMapper();
+				verify(timeMapper).parseString(KommentarTestFactory.CREATED_AT_STR);
+			}
 
-			assertThat(kommentar.getCreatedAt()).isEqualTo(KommentarTestFactory.CREATED_AT);
-		}
+			@Test
+			void shouldMapCreatedAt() {
+				var kommentar = callMapper();
 
-		@Test
-		void shouldCallAttachmentMapper() {
-			callMapper();
+				assertThat(kommentar.getCreatedAt()).isEqualTo(KommentarTestFactory.CREATED_AT);
+			}
 
-			verify(attachmentMapper).mapAttachments(argThat(this::isCollectionOfAttachmentIds));
-		}
+			@Test
+			void shouldCallAttachmentMapper() {
+				callMapper();
 
-		@Test
-		void shouldMapAttachments() {
-			var kommentar = callMapper();
+				verify(attachmentMapper).mapAttachments(argThat(this::isCollectionOfAttachmentIds));
+			}
 
-			assertThat(kommentar.getAttachments()).containsExactlyElementsOf(KommentarTestFactory.ATTACHMENTS);
-		}
+			@Test
+			void shouldMapAttachments() {
+				var kommentar = callMapper();
 
-		@SuppressWarnings("unchecked")
-		private boolean isCollectionOfAttachmentIds(Object obj) {
-			return obj instanceof Collection && ((Collection<String>) obj).containsAll(GrpcKommentarTestFactory.ATTACHMENTS);
+				assertThat(kommentar.getAttachments()).containsExactlyElementsOf(KommentarTestFactory.ATTACHMENTS);
+			}
+
+			@SuppressWarnings("unchecked")
+			private boolean isCollectionOfAttachmentIds(Object obj) {
+				return obj instanceof Collection && ((Collection<String>) obj).containsAll(GrpcKommentarTestFactory.ATTACHMENTS);
+			}
+
+			private Kommentar callMapper() {
+				return mapper.mapItemMapToKommentar(GrpcKommentarTestFactory.createItemAsMap());
+			}
 		}
 
-		private Kommentar callMapper() {
-			return mapper.mapItemMapToKommentar(GrpcKommentarTestFactory.createItemAsMap());
+		@Nested
+		class OnAttachmentsMissing {
+
+			@Test
+			void shouldSetToEmptyCollection() {
+				var kommentar = mapper.mapItemMapToKommentar(Map.of());
+
+				assertThat(kommentar.getAttachments()).isEmpty();
+			}
 		}
 	}
 
-- 
GitLab