diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java index 2e8f8d7ca9e5f6fccc295fae05c472d29ba3a392..1170b27d77f0e96d07a6c91447a5e971dbf4de3f 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapper.java @@ -29,6 +29,7 @@ import org.mapstruct.Mapping; import com.google.protobuf.ByteString; import de.ozgcloud.eingang.forwarding.GrpcAttachmentFile; +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile; import de.ozgcloud.vorgang.files.FileIdMapper; @Mapper(uses = FileIdMapper.class) @@ -52,4 +53,16 @@ public interface IncomingFileMapper { @Mapping(target = "allFields", ignore = true) @Mapping(target = "fileName", source = "file.name") GrpcAttachmentFile toAttachmentFile(String groupName, IncomingFile file); + + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "contentTypeBytes", ignore = true) + @Mapping(target = "fileNameBytes", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "vendorIdBytes", ignore = true) + @Mapping(target = "allFields", ignore = true) + @Mapping(target = "fileName", source = "name") + GrpcRepresentationFile toRepresentationFile(IncomingFile file); } \ No newline at end of file diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java index 7f74468d3f1a1672c31df0293e0327cf4f3e2382..f9d26cb6d507f5c768b2719e9052cd557b1b6733 100644 --- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java +++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteService.java @@ -29,6 +29,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.function.BiFunction; import java.util.function.Function; import org.apache.commons.io.IOUtils; @@ -42,6 +43,7 @@ import de.ozgcloud.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.forwarder.RouteForwardingServiceGrpc; import de.ozgcloud.eingang.forwarding.GrpcAttachment; import de.ozgcloud.eingang.forwarding.GrpcFileContent; +import de.ozgcloud.eingang.forwarding.GrpcRepresentation; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingResponse; import de.ozgcloud.vorgang.callcontext.VorgangManagerClientCallContextAttachingInterceptor; @@ -90,6 +92,7 @@ class ForwardingRemoteService { var eingang = vorgangService.getById(request.getVorgangId()).getEingangs().getFirst(); requestStreamObserver.onNext(buildRouteForwardingRequest(request, eingang)); sendAttachments(eingang.getAttachments(), requestStreamObserver); + sendRepresentations(eingang.getRepresentations(), requestStreamObserver); } GrpcRouteForwardingRequest buildRouteForwardingRequest(ForwardingRequest request, Eingang eingang) { @@ -106,40 +109,80 @@ class ForwardingRemoteService { private void sendAttachmentFile(StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, String groupName, IncomingFile file) { var fileContentStream = fileService.getUploadedFileStream(file.getId()); - var fileSender = createFileSender(requestStreamObserver, groupName, file, fileContentStream).send(); + var fileSender = createAttachmentFileSender(requestStreamObserver, groupName, file, fileContentStream).send(); waitForFinishedFileUpload(fileSender, fileContentStream); } - FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createFileSender( + FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createAttachmentFileSender( StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, String groupName, IncomingFile file, InputStream fileContentStream) { - return GrpcFileUploadUtils - .createSender(this::buildAttachmentChunk, fileContentStream, requestCallStreamObserverProvider(requestStreamObserver), false) + return createSenderWithoutMetadata(this::buildAttachmentChunk, requestStreamObserver, fileContentStream) .withMetaData(buildGrpcAttachmentFile(groupName, file)); } + GrpcRouteForwardingRequest buildAttachmentChunk(byte[] chunk, int length) { + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(GrpcAttachment.newBuilder() + .setContent(buildGrpcFileContent(chunk, length)) + .build()) + .build(); + } + + GrpcRouteForwardingRequest buildGrpcAttachmentFile(String name, IncomingFile file) { + return GrpcRouteForwardingRequest.newBuilder() + .setAttachment(GrpcAttachment.newBuilder() + .setFile(incomingFileMapper.toAttachmentFile(name, file)) + .build()) + .build(); + } + + void sendRepresentations(List<IncomingFile> representations, StreamObserver<GrpcRouteForwardingRequest> requestObserver) { + representations.forEach(representation -> { + var fileContentStream = fileService.getUploadedFileStream(representation.getId()); + var fileSender = createRepresentationFileSender(requestObserver, representation, fileContentStream).send(); + waitForFinishedFileUpload(fileSender, fileContentStream); + }); + } + + FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createRepresentationFileSender( + StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, IncomingFile file, InputStream fileContentStream) { + return createSenderWithoutMetadata(this::buildRepresentationChunk, requestStreamObserver, fileContentStream) + .withMetaData(buildGrpcRepresentationFile(file)); + } + + FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createSenderWithoutMetadata( + BiFunction<byte[], Integer, GrpcRouteForwardingRequest> chunkBuilder, + StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver, InputStream fileContentStream) { + return GrpcFileUploadUtils + .createSender(chunkBuilder, fileContentStream, requestCallStreamObserverProvider(requestStreamObserver), false); + } + private Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>> requestCallStreamObserverProvider( StreamObserver<GrpcRouteForwardingRequest> requestStreamObserver) { return response -> (CallStreamObserver<GrpcRouteForwardingRequest>) requestStreamObserver; } - GrpcRouteForwardingRequest buildAttachmentChunk(byte[] chunk, int length) { + GrpcRouteForwardingRequest buildRepresentationChunk(byte[] chunk, int length) { + return GrpcRouteForwardingRequest.newBuilder() + .setRepresentation(GrpcRepresentation.newBuilder() + .setContent(buildGrpcFileContent(chunk, length)) + .build()) + .build(); + } + + GrpcFileContent buildGrpcFileContent(byte[] chunk, int length) { var fileContentBuilder = GrpcFileContent.newBuilder(); if (length <= 0) { fileContentBuilder.setIsEndOfFile(true); } else { fileContentBuilder.setContent(ByteString.copyFrom(chunk)); } - return GrpcRouteForwardingRequest.newBuilder() - .setAttachment(GrpcAttachment.newBuilder() - .setContent(fileContentBuilder) - .build()) - .build(); + return fileContentBuilder.build(); } - GrpcRouteForwardingRequest buildGrpcAttachmentFile(String name, IncomingFile file) { + GrpcRouteForwardingRequest buildGrpcRepresentationFile(IncomingFile file) { return GrpcRouteForwardingRequest.newBuilder() - .setAttachment(GrpcAttachment.newBuilder() - .setFile(incomingFileMapper.toAttachmentFile(name, file)) + .setRepresentation(GrpcRepresentation.newBuilder() + .setFile(incomingFileMapper.toRepresentationFile(file)) .build()) .build(); } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java index b12ea789aec30333f8db2dbec36319945a429be7..458d34b190863132535d415c903e16c999591684 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/EingangTestFactory.java @@ -50,6 +50,7 @@ public class EingangTestFactory { public static final Map<String, Object> FORM_DATA = Map.of(SINGLE_FIELD_NAME, SINGLE_FIELD, SUBFORM_NAME, SUBFORM); public static final IncomingFileGroup ATTACHMENT = IncomingFileGroupTestFactory.create(); + public static final IncomingFile REPRESENTATION = IncomingFileTestFactory.create(); public static Eingang create() { return createBuilder().build(); @@ -62,7 +63,7 @@ public class EingangTestFactory { .antragsteller(AntragstellerTestFactory.create()) .formData(FORM_DATA) .attachment(ATTACHMENT) - .representation(IncomingFileTestFactory.create()) + .representation(REPRESENTATION) .zustaendigeStelle(ZustaendigeStelleTestFactory.create()); } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java index d6f41ddfe971f01da392390612cdf264ff5680b8..771c11f67fc9cc2e3e3116bf7e208acc05a4bc49 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/IncomingFileMapperTest.java @@ -33,6 +33,7 @@ import org.mockito.Spy; import de.ozgcloud.vorgang.files.FileIdMapper; import de.ozgcloud.vorgang.vorgang.redirect.GrpcAttachmentFileTestFactory; +import de.ozgcloud.vorgang.vorgang.redirect.GrpcRepresentationFileTestFactory; class IncomingFileMapperTest { @@ -62,4 +63,15 @@ class IncomingFileMapperTest { assertThat(result).isEqualTo(GrpcAttachmentFileTestFactory.create()); } } + + @Nested + class TestToRepresentationFile { + + @Test + void shouldMapToGrpcRepresentationFile() { + var result = mapper.toRepresentationFile(IncomingFileTestFactory.create()); + + assertThat(result).isEqualTo(GrpcRepresentationFileTestFactory.create()); + } + } } \ No newline at end of file diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java index 653549de0e8b8814b8c3c53a50ea928625bb8303..8a1de85f24f03d2d4fcf456cbe496f75827ce918 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRemoteServiceTest.java @@ -234,6 +234,7 @@ class ForwardingRemoteServiceTest { when(vorgangService.getById(any())).thenReturn(vorgang); doReturn(routeForwardingRequest).when(service).buildRouteForwardingRequest(any(), any()); doNothing().when(service).sendAttachments(any(), any()); + doNothing().when(service).sendRepresentations(any(), any()); } @Test @@ -263,6 +264,13 @@ class ForwardingRemoteServiceTest { verify(service).sendAttachments(List.of(EingangTestFactory.ATTACHMENT), requestObserver); } + @Test + void shouldCallSendRepresentations() { + sendEingang(); + + verify(service).sendRepresentations(List.of(EingangTestFactory.REPRESENTATION), requestObserver); + } + private void sendEingang() { service.sendEingang(request, requestObserver); } @@ -310,8 +318,9 @@ class ForwardingRemoteServiceTest { @BeforeEach void init() { when(fileService.getUploadedFileStream(any())).thenReturn(inputStream); - doReturn(fileSender).when(service).createFileSender(any(), any(), any(), any()); + doReturn(fileSender).when(service).createAttachmentFileSender(any(), any(), any(), any()); when(fileSender.send()).thenReturn(fileSender); + doNothing().when(service).waitForFinishedFileUpload(any(), any()); } @Test @@ -322,10 +331,10 @@ class ForwardingRemoteServiceTest { } @Test - void shouldCallCreateFileSender() { + void shouldCallCreateAttachmentFileSender() { sendAttachments(); - verify(service).createFileSender(requestObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, + verify(service).createAttachmentFileSender(requestObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, inputStream); } @@ -352,107 +361,312 @@ class ForwardingRemoteServiceTest { } @Nested - class TestCreateFileSender { + class TestCreateAttachmentFileSender { - private MockedStatic<GrpcFileUploadUtils> grpcFileUploadUtilsMock; @Mock - private CallStreamObserver<GrpcRouteForwardingRequest> requestCallStreamObserver; + private StreamObserver<GrpcRouteForwardingResponse> responseObserver; + @Mock + private InputStream inputStream; @Mock private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; @Mock private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSenderWithMetadata; - @Mock - private StreamObserver<GrpcRouteForwardingResponse> responseObserver; - @Mock - private InputStream inputStream; @Captor private ArgumentCaptor<BiFunction<byte[], Integer, GrpcRouteForwardingRequest>> chunkBuilderCaptor; - @Captor - private ArgumentCaptor<Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>>> reqObserverBuilderCaptor; private final byte[] chunk = RandomUtils.insecure().randomBytes(5); private final GrpcRouteForwardingRequest metadataRequest = GrpcRouteForwardingRequestTestFactory.create(); @BeforeEach void init() { - grpcFileUploadUtilsMock = mockStatic(GrpcFileUploadUtils.class); - grpcFileUploadUtilsMock.when(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), anyBoolean())).thenReturn(fileSender); + doReturn(fileSender).when(service).createSenderWithoutMetadata(any(), any(), any()); doReturn(metadataRequest).when(service).buildGrpcAttachmentFile(any(), any()); when(fileSender.withMetaData(any())).thenReturn(fileSenderWithMetadata); } - @AfterEach - void tearDown() { - grpcFileUploadUtilsMock.close(); - } - @Test - void shouldCreateFileSenderWithChunkBuilder() { - createFileSender(); + void shouldCallCreateSenderWithoutMetadata() { + createAttachmentFileSender(); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(chunkBuilderCaptor.capture(), any(), any(), anyBoolean())); + verify(service).createSenderWithoutMetadata(chunkBuilderCaptor.capture(), eq(requestObserver), eq(inputStream)); chunkBuilderCaptor.getValue().apply(chunk, chunk.length); verify(service).buildAttachmentChunk(chunk, chunk.length); } @Test - void shouldCreateFileSenderWithInputStream() { - createFileSender(); + void shouldCallBuildGrpcAttachmentFile() { + createAttachmentFileSender(); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), eq(inputStream), any(), anyBoolean())); + verify(service).buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE); } @Test - void shouldCreateFileSenderWithRequestObserverBuilder() { - createFileSender(); + void shouldSetMetaData() { + createAttachmentFileSender(); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), any(), reqObserverBuilderCaptor.capture(), anyBoolean())); - assertThat(reqObserverBuilderCaptor.getValue().apply(responseObserver)).isSameAs(requestCallStreamObserver); + verify(fileSender).withMetaData(metadataRequest); + } + + @Test + void shouldReturnBuiltFileSender() { + var returnedFileSender = createAttachmentFileSender(); + + assertThat(returnedFileSender).isSameAs(fileSenderWithMetadata); + } + + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createAttachmentFileSender() { + return service.createAttachmentFileSender(requestObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, + inputStream); + } + } + + @Nested + class TestBuildAttachmentChunk { + + private final byte[] chunk = RandomUtils.insecure().randomBytes(5); + + @BeforeEach + void mock() { + doReturn(GrpcAttachmentTestFactory.CONTENT).when(service).buildGrpcFileContent(any(), anyInt()); } @Test - void shouldCreateFileSenderWithNotCompleteOnFileSent() { - createFileSender(); + void shouldCallBuildGrpcFileContent() { + service.buildAttachmentChunk(chunk, chunk.length); - grpcFileUploadUtilsMock.verify(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), eq(false))); + verify(service).buildGrpcFileContent(chunk, chunk.length); } @Test - void shouldCallBuildGrpcAttachmentFile() { - createFileSender(); + void shouldReturnGrpcRouteForwardingRequest() { + var result = service.buildAttachmentChunk(chunk, chunk.length); - verify(service).buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE); + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentContent()); + } + } + + @Nested + class TestBuildGrpcAttachmentFile { + + private IncomingFile file = IncomingFileTestFactory.create(); + + @BeforeEach + void mock() { + when(incomingFileMapper.toAttachmentFile(any(), any())).thenReturn(GrpcAttachmentFileTestFactory.create()); + } + + @Test + void shouldCallIncomingFileMapper() { + service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + + verify(incomingFileMapper).toAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + } + + @Test + void shoudlReturnAttachmentMetadataRequest() { + var result = service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentMetadata()); + } + } + + @Nested + class TestSendRepresentations { + + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private InputStream inputStream; + + private final IncomingFile representation = IncomingFileTestFactory.create(); + + @BeforeEach + void init() { + when(fileService.getUploadedFileStream(any())).thenReturn(inputStream); + doReturn(fileSender).when(service).createRepresentationFileSender(any(), any(), any()); + when(fileSender.send()).thenReturn(fileSender); + doNothing().when(service).waitForFinishedFileUpload(any(), any()); + } + + @Test + void shouldGetUploadedFileContent() { + sendRepresentations(); + + verify(fileService).getUploadedFileStream(IncomingFileTestFactory.ID); + } + + @Test + void shouldCallCreateRepresentationFileSender() { + sendRepresentations(); + + verify(service).createRepresentationFileSender(requestObserver, representation, inputStream); + } + + @Test + void shouldSend() { + sendRepresentations(); + + verify(fileSender).send(); + } + + @Test + void shouldCallWaitForFinishedFileUploadAfterSend() { + var inOrder = inOrder(fileSender, service); + + sendRepresentations(); + + inOrder.verify(fileSender).send(); + inOrder.verify(service).waitForFinishedFileUpload(fileSender, inputStream); + } + + private void sendRepresentations() { + service.sendRepresentations(List.of(representation), requestObserver); + } + } + + @Nested + class TestCreateRepresentationFileSender { + + @Mock + private StreamObserver<GrpcRouteForwardingResponse> responseObserver; + @Mock + private InputStream inputStream; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSenderWithMetadata; + @Captor + private ArgumentCaptor<BiFunction<byte[], Integer, GrpcRouteForwardingRequest>> chunkBuilderCaptor; + + private final byte[] chunk = RandomUtils.insecure().randomBytes(5); + private final GrpcRouteForwardingRequest metadataRequest = GrpcRouteForwardingRequestTestFactory.create(); + private final IncomingFile incomingFile = IncomingFileTestFactory.create(); + + @BeforeEach + void init() { + doReturn(fileSender).when(service).createSenderWithoutMetadata(any(), any(), any()); + doReturn(metadataRequest).when(service).buildGrpcRepresentationFile(any()); + when(fileSender.withMetaData(any())).thenReturn(fileSenderWithMetadata); + } + + @Test + void shouldCallCreateSenderWithoutMetadata() { + createRepresentationFileSender(); + + verify(service).createSenderWithoutMetadata(chunkBuilderCaptor.capture(), eq(requestObserver), eq(inputStream)); + chunkBuilderCaptor.getValue().apply(chunk, chunk.length); + verify(service).buildRepresentationChunk(chunk, chunk.length); + } + + @Test + void shouldCallBuildGrpcRepresentationFile() { + createRepresentationFileSender(); + + verify(service).buildGrpcRepresentationFile(incomingFile); } @Test void shouldSetMetaData() { - createFileSender(); + createRepresentationFileSender(); verify(fileSender).withMetaData(metadataRequest); } @Test void shouldReturnBuiltFileSender() { - var returnedFileSender = createFileSender(); + var returnedFileSender = createRepresentationFileSender(); assertThat(returnedFileSender).isSameAs(fileSenderWithMetadata); } - private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createFileSender() { - return service.createFileSender(requestCallStreamObserver, IncomingFileGroupTestFactory.NAME, IncomingFileGroupTestFactory.FILE, - inputStream); + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createRepresentationFileSender() { + return service.createRepresentationFileSender(requestObserver, incomingFile, inputStream); } } @Nested - class TestBuildAttachmentChunk { + class TestCreateSenderWithoutMetadata { + + private MockedStatic<GrpcFileUploadUtils> grpcFileUploadUtilsMock; + @Mock + private BiFunction<byte[], Integer, GrpcRouteForwardingRequest> chunkBuilder; + @Mock + private CallStreamObserver<GrpcRouteForwardingRequest> requestCallStreamObserver; + @Mock + private InputStream inputStream; + @Mock + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> fileSender; + @Mock + private StreamObserver<GrpcRouteForwardingResponse> responseObserver; + @Captor + private ArgumentCaptor<Function<StreamObserver<GrpcRouteForwardingResponse>, CallStreamObserver<GrpcRouteForwardingRequest>>> reqObserverBuilderCaptor; + + @BeforeEach + void init() { + grpcFileUploadUtilsMock = mockStatic(GrpcFileUploadUtils.class); + grpcFileUploadUtilsMock.when(() -> GrpcFileUploadUtils.createSender(any(), any(), any(), anyBoolean())).thenReturn(fileSender); + } + + @AfterEach + void tearDown() { + grpcFileUploadUtilsMock.close(); + } + + @Test + void shouldCreateFileSender() { + createSenderWithoutMetadata(); + + grpcFileUploadUtilsMock + .verify(() -> GrpcFileUploadUtils.createSender(eq(chunkBuilder), eq(inputStream), reqObserverBuilderCaptor.capture(), eq(false))); + assertThat(reqObserverBuilderCaptor.getValue().apply(responseObserver)).isSameAs(requestCallStreamObserver); + } + + @Test + void shouldReturnCreatedFileSender() { + var returnedFileSender = createSenderWithoutMetadata(); + + assertThat(returnedFileSender).isSameAs(fileSender); + } + + private FileSender<GrpcRouteForwardingRequest, GrpcRouteForwardingResponse> createSenderWithoutMetadata() { + return service.createSenderWithoutMetadata(chunkBuilder, requestCallStreamObserver, inputStream); + } + } + + @Nested + class TestBuildRepresentationChunk { + + private final byte[] chunk = RandomUtils.insecure().randomBytes(5); + + @BeforeEach + void mock() { + doReturn(GrpcRepresentationTestFactory.CONTENT).when(service).buildGrpcFileContent(any(), anyInt()); + } + + @Test + void shouldCallBuildGrpcFileContent() { + service.buildRepresentationChunk(chunk, chunk.length); + + verify(service).buildGrpcFileContent(chunk, chunk.length); + } + + @Test + void shouldReturnGrpcRouteForwardingRequest() { + var result = service.buildRepresentationChunk(chunk, chunk.length); + + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithRepresentationContent()); + } + } + + @Nested + class TestBuildGrpcFileContent { @Nested class TestOnEndOfFile { @Test void shouldBuildEndOfFileChunk() { - var fileContent = service.buildAttachmentChunk(new byte[0], -1).getAttachment().getContent(); + var fileContent = service.buildGrpcFileContent(new byte[0], -1); assertThat(fileContent).isEqualTo(GrpcFileContentTestFactory.createEndOfFile()); } @@ -463,8 +677,7 @@ class ForwardingRemoteServiceTest { @Test void shouldBuildEndOfFileChunk() { - var fileContent = service.buildAttachmentChunk(GrpcFileContentTestFactory.CONTENT, GrpcFileContentTestFactory.CONTENT.length) - .getAttachment().getContent(); + var fileContent = service.buildGrpcFileContent(GrpcFileContentTestFactory.CONTENT, GrpcFileContentTestFactory.CONTENT.length); assertThat(fileContent).isEqualTo(GrpcFileContentTestFactory.create()); } @@ -472,27 +685,27 @@ class ForwardingRemoteServiceTest { } @Nested - class TestBuildGrpcAttachmentFile { + class TestBuildGrpcRepresentationFile { private IncomingFile file = IncomingFileTestFactory.create(); @BeforeEach void mock() { - when(incomingFileMapper.toAttachmentFile(any(), any())).thenReturn(GrpcAttachmentFileTestFactory.create()); + when(incomingFileMapper.toRepresentationFile(any())).thenReturn(GrpcRepresentationFileTestFactory.create()); } @Test void shouldCallIncomingFileMapper() { - service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + service.buildGrpcRepresentationFile(file); - verify(incomingFileMapper).toAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + verify(incomingFileMapper).toRepresentationFile(file); } @Test - void shoudlReturnAttachmentMetadataRequest() { - var result = service.buildGrpcAttachmentFile(IncomingFileGroupTestFactory.NAME, file); + void shoudlReturnRepresentationMetadataRequest() { + var result = service.buildGrpcRepresentationFile(file); - assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithAttachmentMetadata()); + assertThat(result).isEqualTo(GrpcRouteForwardingRequestTestFactory.createWithRepresentationMetadata()); } } diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationFileTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationFileTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..d832cbc58b40bb3a68f0ac65d28d557c563934d2 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationFileTestFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile; +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile.Builder; +import de.ozgcloud.vorgang.vorgang.IncomingFileTestFactory; + +public class GrpcRepresentationFileTestFactory { + + public static GrpcRepresentationFile create() { + return createBuilder().build(); + } + + public static Builder createBuilder() { + return GrpcRepresentationFile.newBuilder() + .setFileName(IncomingFileTestFactory.NAME) + .setContentType(IncomingFileTestFactory.CONTENT_TYPE_STR) + .setVendorId(IncomingFileTestFactory.VENDOR_ID) + .setSize(IncomingFileTestFactory.SIZE); + } + +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..4dce5a27e1c366229b9ad697e79717ba73c09a81 --- /dev/null +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRepresentationTestFactory.java @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.vorgang.vorgang.redirect; + +import de.ozgcloud.eingang.forwarding.GrpcFileContent; +import de.ozgcloud.eingang.forwarding.GrpcRepresentation; +import de.ozgcloud.eingang.forwarding.GrpcRepresentationFile; + +public class GrpcRepresentationTestFactory { + + public static final GrpcRepresentationFile FILE = GrpcRepresentationFileTestFactory.create(); + public static final GrpcFileContent CONTENT = GrpcFileContentTestFactory.create(); + + public static GrpcRepresentation createWithFile() { + return GrpcRepresentation.newBuilder() + .setFile(FILE) + .build(); + } + + public static GrpcRepresentation createWithContent() { + return GrpcRepresentation.newBuilder() + .setContent(CONTENT) + .build(); + } +} diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java index c5ef1c9d55399fea9847e8e3116362b29545ed27..7d463347d23cf97551855d460b655ea3da710524 100644 --- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java +++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingRequestTestFactory.java @@ -24,12 +24,15 @@ package de.ozgcloud.vorgang.vorgang.redirect; import de.ozgcloud.eingang.forwarding.GrpcAttachment; +import de.ozgcloud.eingang.forwarding.GrpcRepresentation; import de.ozgcloud.eingang.forwarding.GrpcRouteForwardingRequest; class GrpcRouteForwardingRequestTestFactory { public static final GrpcAttachment ATTACHMENT_METADATA = GrpcAttachmentTestFactory.createWithFile(); - public static final GrpcAttachment ATTACHMENT_COTNENT = GrpcAttachmentTestFactory.createWithContent(); + public static final GrpcAttachment ATTACHMENT_CONTENT = GrpcAttachmentTestFactory.createWithContent(); + public static final GrpcRepresentation REPRESENTATION_METADATA = GrpcRepresentationTestFactory.createWithFile(); + public static final GrpcRepresentation REPRESENTATION_CONTENT = GrpcRepresentationTestFactory.createWithContent(); public static GrpcRouteForwardingRequest create() { return createBuilder().build(); @@ -48,7 +51,19 @@ class GrpcRouteForwardingRequestTestFactory { public static GrpcRouteForwardingRequest createWithAttachmentContent() { return GrpcRouteForwardingRequest.newBuilder() - .setAttachment(ATTACHMENT_METADATA) + .setAttachment(ATTACHMENT_CONTENT) + .build(); + } + + public static GrpcRouteForwardingRequest createWithRepresentationMetadata() { + return GrpcRouteForwardingRequest.newBuilder() + .setRepresentation(REPRESENTATION_METADATA) + .build(); + } + + public static GrpcRouteForwardingRequest createWithRepresentationContent() { + return GrpcRouteForwardingRequest.newBuilder() + .setRepresentation(REPRESENTATION_CONTENT) .build(); } }