diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFile.java b/alfa-service/src/main/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFile.java index b51f2653ad632ddb9dd2bbe503550b73cf09239e..4e87099e63b8e3c896b37f8ddf3728b3f2a1dbda 100644 --- a/alfa-service/src/main/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFile.java +++ b/alfa-service/src/main/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFile.java @@ -6,15 +6,20 @@ import java.util.Iterator; import de.ozgcloud.archive.grpc.export.GrpcExportVorgangResponse; import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; +import lombok.Getter; -@RequiredArgsConstructor class StreamedExportedVorgangFile implements ExportedVorgangFile { + @Getter + private final String fileName; private final Iterator<GrpcExportVorgangResponse> responseIterator; - @Override - public String getFileName() { + public StreamedExportedVorgangFile(Iterator<GrpcExportVorgangResponse> responseIterator) { + this.fileName = getFileNameFrom(responseIterator); + this.responseIterator = responseIterator; + } + + static String getFileNameFrom(Iterator<GrpcExportVorgangResponse> responseIterator) { if (!responseIterator.hasNext()) { throw new TechnicalException("Response is empty"); } diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFileTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFileTest.java index 8ff133a927a8c5359d0824a9621611d2ec01519c..293aa49bce8008b40bd9f52e38ad0335bdf5e735 100644 --- a/alfa-service/src/test/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFileTest.java +++ b/alfa-service/src/test/java/de/ozgcloud/alfa/export/StreamedExportedVorgangFileTest.java @@ -7,11 +7,12 @@ import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; +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.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.MockedStatic; import com.google.protobuf.ByteString; import com.thedeanda.lorem.LoremIpsum; @@ -23,11 +24,40 @@ class StreamedExportedVorgangFileTest { @Mock private Iterator<GrpcExportVorgangResponse> responseIterator; - @InjectMocks - private StreamedExportedVorgangFile exportedVorgangFile; @Nested - class TestGetFileName { + class TestContructor { + + private MockedStatic<StreamedExportedVorgangFile> mockedStatic; + + @BeforeEach + void init() { + mockedStatic = mockStatic(StreamedExportedVorgangFile.class); + mockedStatic.when(() -> StreamedExportedVorgangFile.getFileNameFrom(responseIterator)).thenReturn(GrpcFileTestFactory.FILE_NAME); + } + + @AfterEach + void cleanup() { + mockedStatic.close(); + } + + @Test + void shouldGetFileNameFromResponseIterator() { + new StreamedExportedVorgangFile(responseIterator); + + mockedStatic.verify(() -> StreamedExportedVorgangFile.getFileNameFrom(responseIterator)); + } + + @Test + void shouldSetFileName() { + var exportedVorgangFile = new StreamedExportedVorgangFile(responseIterator); + + assertThat(exportedVorgangFile.getFileName()).isEqualTo(GrpcFileTestFactory.FILE_NAME); + } + } + + @Nested + class TestGetFileNameFrom { @Nested class OnEmptyResponse { @@ -39,7 +69,7 @@ class StreamedExportedVorgangFileTest { @Test void shouldThrowException() { - assertThatExceptionOfType(TechnicalException.class).isThrownBy(exportedVorgangFile::getFileName); + assertThatExceptionOfType(TechnicalException.class).isThrownBy(TestGetFileNameFrom.this::callTestedMethod); } } @@ -54,25 +84,29 @@ class StreamedExportedVorgangFileTest { @Test void shouldCallHasNext() { - exportedVorgangFile.getFileName(); + callTestedMethod(); verify(responseIterator).hasNext(); } @Test void shouldCallNextOnce() { - exportedVorgangFile.getFileName(); + callTestedMethod(); verify(responseIterator, times(1)).next(); } @Test void shouldReturnFileName() { - var fileName = exportedVorgangFile.getFileName(); + var fileName = callTestedMethod(); assertThat(fileName).isEqualTo(GrpcFileTestFactory.FILE_NAME); } } + + private String callTestedMethod() { + return StreamedExportedVorgangFile.getFileNameFrom(responseIterator); + } } @Nested @@ -84,8 +118,12 @@ class StreamedExportedVorgangFileTest { @Mock private OutputStream outputStream; + private MockedStatic<StreamedExportedVorgangFile> mockedStatic; + @BeforeEach void init() { + mockedStatic = mockStatic(StreamedExportedVorgangFile.class); + mockedStatic.when(() -> StreamedExportedVorgangFile.getFileNameFrom(responseIterator)).thenReturn(GrpcFileTestFactory.FILE_NAME); when(responseIterator.hasNext()) .thenReturn(true) .thenReturn(true) @@ -97,16 +135,19 @@ class StreamedExportedVorgangFileTest { ).build()); } + @AfterEach + void cleanup() { + mockedStatic.close(); + } + @Test void shouldWriteFileContentInOrder() throws IOException { var orderVerifier = inOrder(outputStream); - exportedVorgangFile.writeToOutputStream(outputStream); + new StreamedExportedVorgangFile(responseIterator).writeToOutputStream(outputStream); orderVerifier.verify(outputStream).write(FILE_CONTENT_1.toByteArray()); orderVerifier.verify(outputStream).write(FILE_CONTENT_2.toByteArray()); } - - } }