From b7cb0669d90badea9c971df85e3c0d2c54704532 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Fri, 18 Oct 2024 09:51:11 +0200
Subject: [PATCH] OZG-6944 fix writing file content

---
 .../antragraum/AntragraumService.java         |  9 +-
 .../antragraum/AntragraumServiceTest.java     | 86 ++++++++++++++++---
 2 files changed, 82 insertions(+), 13 deletions(-)

diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
index dc3f7ab..5e8f204 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
@@ -25,6 +25,8 @@ package de.ozgcloud.nachrichten.antragraum;
 
 import static java.util.Objects.*;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
 import java.io.PipedOutputStream;
 import java.time.ZonedDateTime;
 import java.util.Comparator;
@@ -45,6 +47,7 @@ import de.ozgcloud.apilib.common.errorhandling.NotFoundException;
 import de.ozgcloud.apilib.file.OzgCloudFile;
 import de.ozgcloud.apilib.file.OzgCloudFileId;
 import de.ozgcloud.apilib.file.OzgCloudFileService;
+import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.nachrichten.NachrichtenManagerConfiguration;
 import de.ozgcloud.nachrichten.NachrichtenManagerProperties;
 import de.ozgcloud.nachrichten.common.vorgang.Vorgang;
@@ -195,7 +198,11 @@ public class AntragraumService {
 
 	public void getAttachmentContent(AttachmentFileRequest request, PipedOutputStream pipedOutputStream) {
 		verifyAccessToFile(request);
-		ozgCloudFileService.writeFileDataToStream(OzgCloudFileId.from(request.fileId()), pipedOutputStream);
+		try (var dataOutput = new DataOutputStream(pipedOutputStream)) {
+			ozgCloudFileService.writeFileDataToStream(OzgCloudFileId.from(request.fileId()), dataOutput);
+		} catch (IOException e) {
+			throw new TechnicalException("Error on getting attachment file content.", e);
+		}
 	}
 
 	public OzgCloudFile getAttachmentMetadata(AttachmentFileRequest request) {
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
index ee39e3d..13663ca 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
@@ -5,6 +5,8 @@ import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.io.DataOutputStream;
+import java.io.IOException;
 import java.io.PipedOutputStream;
 import java.time.ZonedDateTime;
 import java.util.List;
@@ -13,12 +15,14 @@ import java.util.Optional;
 import java.util.UUID;
 import java.util.stream.Stream;
 
+import org.junit.jupiter.api.AfterEach;
 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.Mock;
+import org.mockito.MockedConstruction;
 import org.mockito.Spy;
 import org.opensaml.saml.saml2.core.Response;
 
@@ -27,6 +31,7 @@ import de.ozgcloud.apilib.file.OzgCloudFile;
 import de.ozgcloud.apilib.file.OzgCloudFileId;
 import de.ozgcloud.apilib.file.OzgCloudFileService;
 import de.ozgcloud.apilib.file.OzgCloudFileTestFactory;
+import de.ozgcloud.common.errorhandling.TechnicalException;
 import de.ozgcloud.nachrichten.NachrichtenManagerProperties;
 import de.ozgcloud.nachrichten.common.vorgang.GrpcPostfachAddressTestFactory;
 import de.ozgcloud.nachrichten.common.vorgang.GrpcServiceKontoTestFactory;
@@ -39,6 +44,7 @@ import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtMapper;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
 import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
+import lombok.SneakyThrows;
 
 class AntragraumServiceTest {
 
@@ -621,25 +627,81 @@ class AntragraumServiceTest {
 
 		private final AttachmentFileRequest request = AttachmentFileRequestTestFactory.create();
 
-		@BeforeEach
-		void mock() {
-			doNothing().when(service).verifyAccessToFile(request);
-		}
+		@Nested
+		class OnNoException {
 
-		@Test
-		void shouldCallVerifyAccessToFile() {
-			getAttachmentContent();
+			private MockedConstruction<DataOutputStream> dataOutputStreamMockedConstruction;
+			private DataOutputStream dataOutputStream;
+			private PipedOutputStream underlyingStream;
 
-			verify(service).verifyAccessToFile(request);
+			@BeforeEach
+			void mock() {
+				doNothing().when(service).verifyAccessToFile(request);
+				dataOutputStreamMockedConstruction = mockConstruction(DataOutputStream.class, (dataOutputStream, context) -> {
+					underlyingStream = (PipedOutputStream) context.arguments().get(0);
+					this.dataOutputStream = dataOutputStream;
+				});
+			}
+
+			@AfterEach
+			void cleanUp() {
+				dataOutputStreamMockedConstruction.close();
+			}
+
+			@Test
+			void shouldCallVerifyAccessToFile() {
+				getAttachmentContent();
+
+				verify(service).verifyAccessToFile(request);
+			}
+
+			@Test
+			void shouldCreateDataOutputStream() {
+				getAttachmentContent();
+
+				assertThat(dataOutputStreamMockedConstruction.constructed()).hasSize(1);
+			}
+
+			@Test
+			void shouldCreateDataOutputStreamWithPipedOutputStream() {
+				getAttachmentContent();
+
+				assertThat(underlyingStream).isEqualTo(pipedOutputStream);
+			}
+
+			@Test
+			void shouldCallOzgCloudFileServiceToWriteData() {
+				getAttachmentContent();
+
+				verify(ozgCloudFileService).writeFileDataToStream(OzgCloudFileId.from(AttachmentFileRequestTestFactory.FILE_ID), dataOutputStream);
+			}
+
+			@Test
+			@SneakyThrows
+			void shouldCloseDataOutputStream() {
+				getAttachmentContent();
+
+				verify(dataOutputStream).close();
+			}
 		}
 
-		@Test
-		void shouldCallOzgCloudFileServiceToWriteData() {
-			getAttachmentContent();
+		@Nested
+		class OnIOException {
+
+			@Test
+			@SneakyThrows
+			void shouldThrowTechnicalException() {
+				doNothing().when(service).verifyAccessToFile(request);
+
+				try (var dataOutputStreamMockedConstruction = mockConstruction(DataOutputStream.class,
+						(outputStream, context) -> doThrow(IOException.class).when(outputStream).close())) {
 
-			verify(ozgCloudFileService).writeFileDataToStream(OzgCloudFileId.from(AttachmentFileRequestTestFactory.FILE_ID), pipedOutputStream);
+					assertThrows(TechnicalException.class, () -> getAttachmentContent());
+				}
+			}
 		}
 
+		@SneakyThrows
 		private void getAttachmentContent() {
 			service.getAttachmentContent(request, pipedOutputStream);
 		}
-- 
GitLab