diff --git a/bayernid-proxy-impl/src/main/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserver.java b/bayernid-proxy-impl/src/main/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserver.java index e223ae4e59c7483418cc295d8c018902f4fa0fd1..06b5cdecec7914adba59c47b7b71714d490e470e 100644 --- a/bayernid-proxy-impl/src/main/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserver.java +++ b/bayernid-proxy-impl/src/main/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserver.java @@ -34,6 +34,7 @@ import java.util.concurrent.atomic.AtomicReference; import com.google.protobuf.ByteString; +import de.ozgcloud.common.binaryfile.TempFileUtils; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.Attachment; import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessage.BayernIdMessageBuilder; @@ -46,8 +47,6 @@ import lombok.extern.log4j.Log4j2; @RequiredArgsConstructor public class UploadStreamObserver implements StreamObserver<GrpcSendBayernIdMessageRequest> { - static final String ATTACHMENT_FILE_SUFFIX = ".ozg-cloud.tmp"; - private final StreamObserver<GrpcSendBayernIdMessageResponse> responseObserver; private final BayernIdProxyService proxyService; private final BayernIdMessageMapper messageMapper; @@ -81,29 +80,24 @@ public class UploadStreamObserver implements StreamObserver<GrpcSendBayernIdMess } Attachment buildAttachment(GrpcAttachmentMetadata attachmentMetadata) { - var attachmentFile = createTemporallyFile(attachmentMetadata.getFileName()); + InputStream temporallyFile; + try { + temporallyFile = createTemporallyFile(); + } catch (IOException e) { + throw new TechnicalException("Can not create temporary file for attachment " + attachmentMetadata.getFileName(), e); + } return Attachment.builder() .name(attachmentMetadata.getFileName()) .type(attachmentMetadata.getFileType()) - .content(attachmentFile) + .content(temporallyFile) .build(); } - InputStream createTemporallyFile(String fileName) { - try { - closeTemporallyWriter(); - var tempFilePath = createFile(fileName); - attachmentWriter = newOutputStream(tempFilePath); - return newInputStream(tempFilePath); - } catch (IOException e) { - throw new TechnicalException("Can not create temporary file for attachment " + fileName, e); - } - } - - Path createFile(String fileName) throws IOException { - var tmpFile = Files.createTempFile(fileName, ATTACHMENT_FILE_SUFFIX); - tmpFile.toFile().deleteOnExit(); - return tmpFile; + InputStream createTemporallyFile() throws IOException { + closeTemporallyWriter(); + var tempFilePath = TempFileUtils.createTmpFile(); + attachmentWriter = newOutputStream(tempFilePath); + return newInputStream(tempFilePath); } OutputStream newOutputStream(Path filePath) throws IOException { diff --git a/bayernid-proxy-impl/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserverTest.java b/bayernid-proxy-impl/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserverTest.java index d6efd88993fe8d530db3edaeefa7f26ca8c28f3f..d1887588852a13ed23a5bfe73af359b1ed1af085 100644 --- a/bayernid-proxy-impl/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserverTest.java +++ b/bayernid-proxy-impl/src/test/java/de/ozgcloud/nachrichten/postfach/bayernid/proxy/UploadStreamObserverTest.java @@ -33,18 +33,19 @@ import java.io.OutputStream; import java.nio.file.Path; import java.util.concurrent.atomic.AtomicReference; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; import org.mockito.Spy; -import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.test.util.ReflectionTestUtils; import com.google.protobuf.ByteString; +import de.ozgcloud.common.binaryfile.TempFileUtils; import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.Attachment; import de.ozgcloud.nachrichten.postfach.bayernid.proxy.message.BayernIdMessage.BayernIdMessageBuilder; @@ -193,54 +194,82 @@ class UploadStreamObserverTest { @Mock private InputStream tmpFileInputStream; - @BeforeEach - void setup() { - doReturn(tmpFileInputStream).when(uploadStreamObserver).createTemporallyFile(any()); - } + @Nested + class TestBuildSuccessfully { + @SneakyThrows + @BeforeEach + void setup() { + doReturn(tmpFileInputStream).when(uploadStreamObserver).createTemporallyFile(); + } - @Test - void shouldCallCreateTemporallyFile() { - uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); + @SneakyThrows + @Test + void shouldCallCreateTemporallyFile() { + uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); - verify(uploadStreamObserver).createTemporallyFile(GrpcAttachmentMetadataTestFactory.FILE_NAME); - } + verify(uploadStreamObserver).createTemporallyFile(); + } - @Test - void shouldSetTemporallyFile() { - var result = uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); + @Test + void shouldSetTemporallyFile() { + var result = uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); - assertThat(result.getContent()).isEqualTo(tmpFileInputStream); - } + assertThat(result.getContent()).isEqualTo(tmpFileInputStream); + } - @Test - void shouldSetAttachmentName() { - var result = uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); + @Test + void shouldSetAttachmentName() { + var result = uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); - assertThat(result.getName()).isEqualTo(GrpcAttachmentMetadataTestFactory.FILE_NAME); + assertThat(result.getName()).isEqualTo(GrpcAttachmentMetadataTestFactory.FILE_NAME); + } + + @Test + void shouldSetAttachmentType() { + var result = uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); + + assertThat(result.getType()).isEqualTo(GrpcAttachmentMetadataTestFactory.FILE_TYPE); + } } + @SneakyThrows @Test - void shouldSetAttachmentType() { - var result = uploadStreamObserver.buildAttachment(grpcAttachmentMetadata); + void shouldThrowTechnicalException() { + doThrow(IOException.class).when(uploadStreamObserver).createTemporallyFile(); - assertThat(result.getType()).isEqualTo(GrpcAttachmentMetadataTestFactory.FILE_TYPE); + assertThrows(TechnicalException.class, () -> uploadStreamObserver.buildAttachment(grpcAttachmentMetadata)); } } @Nested class TestCreateTemporallyFile { + private static final Path TEMP_FILE_PATH = Path.of("tempFile"); + @Mock private OutputStream attachmentWriter; @Mock private InputStream tmpFileInputStream; - private Path tempFilePath = Path.of("tempFile"); + private MockedStatic<TempFileUtils> mockTempFileUtils; + @SneakyThrows + @BeforeEach + void init() { + mockTempFileUtils = mockStatic(TempFileUtils.class); + mockTempFileUtils.when(TempFileUtils::createTmpFile).thenReturn(TEMP_FILE_PATH); + doReturn(tmpFileInputStream).when(uploadStreamObserver).newInputStream(any()); + } + + @AfterEach + void close() { + mockTempFileUtils.close(); + } + + @SneakyThrows @Test void shouldCallCloseTemporallyFile() { - - uploadStreamObserver.createTemporallyFile("test.txt"); + uploadStreamObserver.createTemporallyFile(); verify(uploadStreamObserver).closeTemporallyWriter(); } @@ -248,19 +277,19 @@ class UploadStreamObserverTest { @SneakyThrows @Test void shouldCallCreateFile() { - uploadStreamObserver.createTemporallyFile(GrpcAttachmentMetadataTestFactory.FILE_NAME); + mockTempFileUtils.when(TempFileUtils::createTmpFile).thenReturn(TEMP_FILE_PATH); + + uploadStreamObserver.createTemporallyFile(); - verify(uploadStreamObserver).createFile(GrpcAttachmentMetadataTestFactory.FILE_NAME); + mockTempFileUtils.verify(() -> TempFileUtils.createTmpFile()); } @SneakyThrows @Test void shouldCallNewOutputStream() { - doReturn(tempFilePath).when(uploadStreamObserver).createFile(any()); + uploadStreamObserver.createTemporallyFile(); - uploadStreamObserver.createTemporallyFile(GrpcAttachmentMetadataTestFactory.FILE_NAME); - - verify(uploadStreamObserver).newOutputStream(tempFilePath); + verify(uploadStreamObserver).newOutputStream(TEMP_FILE_PATH); } @SneakyThrows @@ -268,7 +297,7 @@ class UploadStreamObserverTest { void shouldInitializeOutputWriter() { doReturn(attachmentWriter).when(uploadStreamObserver).newOutputStream(any()); - uploadStreamObserver.createTemporallyFile(GrpcAttachmentMetadataTestFactory.FILE_NAME); + uploadStreamObserver.createTemporallyFile(); assertThat(getAttachmentWriter()).isEqualTo(attachmentWriter); } @@ -276,31 +305,19 @@ class UploadStreamObserverTest { @SneakyThrows @Test void shouldCallNewInputStream() { - doReturn(tempFilePath).when(uploadStreamObserver).createFile(any()); - - uploadStreamObserver.createTemporallyFile(GrpcAttachmentMetadataTestFactory.FILE_NAME); + uploadStreamObserver.createTemporallyFile(); - verify(uploadStreamObserver).newInputStream(tempFilePath); + verify(uploadStreamObserver).newInputStream(TEMP_FILE_PATH); } @SneakyThrows @Test void shouldReturnInputStream() { - doReturn(tmpFileInputStream).when(uploadStreamObserver).newInputStream(any()); - - var result = uploadStreamObserver.createTemporallyFile(GrpcAttachmentMetadataTestFactory.FILE_NAME); + var result = uploadStreamObserver.createTemporallyFile(); assertThat(result).isEqualTo(tmpFileInputStream); } - @SneakyThrows - @Test - void shouldThrowException() { - doThrow(new IOException()).when(uploadStreamObserver).createFile(any()); - - assertThrows(TechnicalException.class, () -> uploadStreamObserver.createTemporallyFile(GrpcAttachmentMetadataTestFactory.FILE_NAME)); - } - private OutputStream getAttachmentWriter() { return (OutputStream) ReflectionTestUtils.getField(uploadStreamObserver, "attachmentWriter"); }