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