Skip to content
Snippets Groups Projects
Commit dec8d3eb authored by OZG-Cloud Team's avatar OZG-Cloud Team
Browse files

Merge pull request 'OZG-6748 Fix Temp-FileNotFoundException im...

Merge pull request 'OZG-6748 Fix Temp-FileNotFoundException im VorgangRemoteService' (#185) from OZG-6748-Duplizierte-Vorgaenge-Fuer-einen-Mantelantrag-fix into master

Reviewed-on: https://git.ozg-sh.de/ozgcloud-app/eingang-manager/pulls/185


Reviewed-by: default avatarOZG-Cloud Team <noreply@ozg-sh.de>
parents b83fd127 08aa7c5d
No related branches found
No related tags found
No related merge requests found
...@@ -382,15 +382,6 @@ class FormDataEndpointITCase { ...@@ -382,15 +382,6 @@ class FormDataEndpointITCase {
assertThat(file.getContent().size()).isZero(); assertThat(file.getContent().size()).isZero();
} }
@Test
void checkForAttachmentFileContentStream() {
sendRequest();
var fileStream = formDataCaptor.getValue().getAttachments().get(0).getFiles().get(0).getContentStream();
assertThat(fileStream).isNotNull();
}
@Test @Test
void checkAttachmentGroup2Count() { void checkAttachmentGroup2Count() {
sendRequest(); sendRequest();
...@@ -437,14 +428,6 @@ class FormDataEndpointITCase { ...@@ -437,14 +428,6 @@ class FormDataEndpointITCase {
assertThat(file.getContent().size()).isZero(); assertThat(file.getContent().size()).isZero();
} }
@Test
void checkForRepresentationFileContentStream() {
sendRequest();
var fileStream = formDataCaptor.getValue().getRepresentations().get(0).getContentStream();
assertThat(fileStream).isNotNull();
}
} }
@DisplayName("service konto") @DisplayName("service konto")
......
...@@ -159,7 +159,7 @@ public class VorgangRemoteService { ...@@ -159,7 +159,7 @@ public class VorgangRemoteService {
} }
String uploadIncomingFile(IncomingFile incomingFile) { String uploadIncomingFile(IncomingFile incomingFile) {
var fileContentStream = incomingFile.getContentStreamForFinalRead(); var fileContentStream = incomingFile.getContentStream();
var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, fileContentStream, var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, fileContentStream,
this::buildCallStreamObserver) this::buildCallStreamObserver)
......
...@@ -23,25 +23,64 @@ ...@@ -23,25 +23,64 @@
*/ */
package de.ozgcloud.eingang.router; package de.ozgcloud.eingang.router;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormData;
import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.common.formdata.FormHeader;
import de.ozgcloud.eingang.common.formdata.IncomingFile;
import de.ozgcloud.eingang.common.formdata.IncomingFileGroup;
import de.ozgcloud.eingang.common.formdata.ServiceKonto; import de.ozgcloud.eingang.common.formdata.ServiceKonto;
import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle; import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j2;
@AllArgsConstructor @AllArgsConstructor
@Service @Service
@Log4j2
public class VorgangService { public class VorgangService {
private final VorgangRemoteService remoteService; private final VorgangRemoteService remoteService;
public String createVorgang(FormData formData) { public String createVorgang(FormData formData) {
return createVorgangForOrganisationsEinheitIds(getOrganisationsEinheitIds(formData), preserveConsistency(formData)); var vorgangId = createVorgangForOrganisationsEinheitIds(getOrganisationsEinheitIds(formData), preserveConsistency(formData));
cleanupFormDataFiles(formData);
return vorgangId;
}
void cleanupFormDataFiles(FormData formData) {
getFormDataFiles(formData)
.map(IncomingFile::getFile)
.map(File::toPath)
.forEach(this::deleteIncomingFile);
}
void deleteIncomingFile(Path path) {
try {
Files.deleteIfExists(path);
} catch (IOException e) {
logErrorOnDeleteFailure(e);
}
}
void logErrorOnDeleteFailure(Exception e) {
LOG.error("Failed to delete temp-file of incoming file!", e);
}
Stream<IncomingFile> getFormDataFiles(FormData formData) {
return Stream.concat(
formData.getRepresentations().stream(),
formData.getAttachments().stream()
.map(IncomingFileGroup::getFiles)
.flatMap(List::stream)
);
} }
String createVorgangForOrganisationsEinheitIds(List<String> organisationsEinheitIds, FormData preparedFormData) { String createVorgangForOrganisationsEinheitIds(List<String> organisationsEinheitIds, FormData preparedFormData) {
......
...@@ -431,6 +431,55 @@ class VorgangRemoteServiceTest { ...@@ -431,6 +431,55 @@ class VorgangRemoteServiceTest {
} }
} }
@DisplayName("update incoming file")
@Nested
class TestUpdateIncomingFile {
@Mock
private IncomingFile incomingFile;
@Mock
private InputStream inputStream;
@Mock
private GrpcUploadBinaryFileResponse response;
@Mock
private GrpcUploadBinaryFileRequest request;
@BeforeEach
void mock() {
doReturn(response).when(vorgangCreator).waitUntilFutureToComplete(any(), any());
when(incomingFile.getContentStream()).thenReturn(inputStream);
doReturn(request).when(vorgangCreator).buildMetaDataRequest(any());
}
@DisplayName("should call get content stream")
@Test
void shouldCallGetContentStream() {
vorgangCreator.uploadIncomingFile(incomingFile);
verify(incomingFile).getContentStream();
}
@DisplayName("should call build request with incoming file")
@Test
void shouldCallBuildRequestWithIncomingFile() {
vorgangCreator.uploadIncomingFile(incomingFile);
verify(vorgangCreator).buildMetaDataRequest(incomingFile);
}
@DisplayName("should call wait until future complete")
@Test
void shouldCallWaitUntilFutureComplete() {
vorgangCreator.uploadIncomingFile(incomingFile);
verify(vorgangCreator).waitUntilFutureToComplete(any(), eq(inputStream));
}
}
@Nested @Nested
class TestWaitUntilFutureToComplete { class TestWaitUntilFutureToComplete {
......
...@@ -29,8 +29,12 @@ import static org.assertj.core.api.Assertions.*; ...@@ -29,8 +29,12 @@ import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Stream;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.DisplayName;
...@@ -44,6 +48,8 @@ import de.ozgcloud.eingang.common.formdata.FormData; ...@@ -44,6 +48,8 @@ import de.ozgcloud.eingang.common.formdata.FormData;
import de.ozgcloud.eingang.common.formdata.FormDataTestFactory; import de.ozgcloud.eingang.common.formdata.FormDataTestFactory;
import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.common.formdata.FormHeader;
import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory; import de.ozgcloud.eingang.common.formdata.FormHeaderTestFactory;
import de.ozgcloud.eingang.common.formdata.IncomingFile;
import de.ozgcloud.eingang.common.formdata.IncomingFileTestFactory;
import de.ozgcloud.eingang.common.formdata.ServiceKonto; import de.ozgcloud.eingang.common.formdata.ServiceKonto;
import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory; import de.ozgcloud.eingang.common.formdata.ServiceKontoTestFactory;
import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory; import de.ozgcloud.eingang.common.formdata.ZustaendigeStelleTestFactory;
...@@ -56,19 +62,20 @@ class VorgangServiceTest { ...@@ -56,19 +62,20 @@ class VorgangServiceTest {
@Mock @Mock
private VorgangRemoteService remoteService; private VorgangRemoteService remoteService;
private final FormData formData = FormDataTestFactory.create();
@DisplayName("Create vorgang") @DisplayName("Create vorgang")
@Nested @Nested
class TestCreateVorgang { class TestCreateVorgang {
private final FormData formData = FormDataTestFactory.create();
private final FormData preservedFormData = FormDataTestFactory.create(); private final FormData preservedFormData = FormDataTestFactory.create();
private final List<String> organisationseinheitIds = List.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID); private final List<String> organisationseinheitIds = List.of(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID);
@BeforeEach @BeforeEach
void mockEingangMapper() { void mockEingangMapper() {
doReturn(preservedFormData).when(service).preserveConsistency(formData); doReturn(preservedFormData).when(service).preserveConsistency(any());
doReturn(organisationseinheitIds).when(service).getOrganisationsEinheitIds(any()); doReturn(organisationseinheitIds).when(service).getOrganisationsEinheitIds(any());
doReturn(VORGANG_ID).when(service).createVorgangForOrganisationsEinheitIds(organisationseinheitIds, preservedFormData); doReturn(VORGANG_ID).when(service).createVorgangForOrganisationsEinheitIds(any(), any());
doNothing().when(service).cleanupFormDataFiles(any());
} }
@Test @Test
...@@ -102,11 +109,95 @@ class VorgangServiceTest { ...@@ -102,11 +109,95 @@ class VorgangServiceTest {
assertThat(vorgangId).isEqualTo(VORGANG_ID); assertThat(vorgangId).isEqualTo(VORGANG_ID);
} }
@DisplayName("should call cleanup form data files")
@Test
void shouldCallCleanupFormDataFiles() {
callCreateVorgang();
verify(service).cleanupFormDataFiles(formData);
}
private String callCreateVorgang() { private String callCreateVorgang() {
return service.createVorgang(formData); return service.createVorgang(formData);
} }
} }
@DisplayName("cleanup form data files")
@Nested
class TestCleanupFormDataFiles {
private final IncomingFile incomingFile = IncomingFileTestFactory.create();
@BeforeEach
void mock() {
doReturn(Stream.of(incomingFile)).when(service).getFormDataFiles(formData);
}
@DisplayName("should call delete incoming file")
@Test
void shouldCallDeleteIncomingFile() {
service.cleanupFormDataFiles(formData);
verify(service).deleteIncomingFile(incomingFile.getFile().toPath());
}
}
@DisplayName("get form data files")
@Nested
class TestGetFormDataFiles {
private final FormData formData = FormDataTestFactory.create();
@DisplayName("should return attachments and representations")
@Test
void shouldReturnAttachmentsAndRepresentations() {
var files = service.getFormDataFiles(formData).toList();
assertThat(files).hasSize(3);
}
}
@DisplayName("delete incoming file")
@Nested
class TestDeleteIncomingFile {
@Mock
private Path path;
@DisplayName("should call deleteIfExists")
@Test
void shouldCallDeleteIfExists() {
try (var staticMock = mockStatic(Files.class)) {
service.deleteIncomingFile(path);
staticMock.verify(() -> Files.deleteIfExists(path));
}
}
@DisplayName("should return")
@Test
void shouldReturn() {
try (var staticMock = mockStatic(Files.class)) {
staticMock.when(() -> Files.deleteIfExists(path)).thenReturn(true);
service.deleteIncomingFile(path);
}
}
@DisplayName("should log on error")
@Test
void shouldLogOnError() {
var exception = new IOException();
try (var staticMock = mockStatic(Files.class)) {
staticMock.when(() -> Files.deleteIfExists(path)).thenThrow(exception);
service.deleteIncomingFile(path);
verify(service).logErrorOnDeleteFailure(exception);
}
}
}
@DisplayName("create vorgang for organisationsEinheitIds") @DisplayName("create vorgang for organisationsEinheitIds")
@Nested @Nested
class TestCreateVorgangForOrganisationsEinheitIds { class TestCreateVorgangForOrganisationsEinheitIds {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment