diff --git a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java index e8ed91f46f1452c83f306e41db00c432b6813e1f..9f9eb98599cefa037b2ce5623706d6164aecb9ce 100644 --- a/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java +++ b/server/src/main/java/de/ozgcloud/antragsraum/attachments/FileRestClient.java @@ -38,6 +38,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestClient; +import org.springframework.web.client.RestClientException; import de.ozgcloud.antragsraum.WebConfiguration; import de.ozgcloud.antragsraum.common.RestClientUtils; @@ -70,15 +71,20 @@ class FileRestClient { request.setNachrichtId(fileIdentificationData.nachrichtId()); request.setSamlToken(AuthenticationHelper.getSamlToken()); - return restClient - .post() - .uri(FIND_FILE_METADATA_API) - .header(X_GRPC_ADDRESS, RestClientUtils.sanitizeAddress(address)) - .contentType(MediaType.APPLICATION_JSON) - .body(request) - .accept(MediaType.APPLICATION_JSON) - .retrieve() - .toEntity(AntragraumGrpcGetAttachmentMetadataResponse.class).getBody(); + try { + return restClient + .post() + .uri(FIND_FILE_METADATA_API) + .header(X_GRPC_ADDRESS, RestClientUtils.sanitizeAddress(address)) + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .accept(MediaType.APPLICATION_JSON) + .retrieve() + .toEntity(AntragraumGrpcGetAttachmentMetadataResponse.class).getBody(); + } catch (RestClientException e) { + LOG.error("Error loading file metadata. {}", e.getMessage(), e); + throw e; + } } void uploadFile(final OzgUploadFile uploadFile, final String address, final CompletableFuture<String> fileIdFuture) { @@ -114,16 +120,21 @@ class FileRestClient { request.setNachrichtId(fileIdentificationData.nachrichtId()); request.setSamlToken(AuthenticationHelper.getSamlToken()); - var fileContent = Optional.ofNullable(restClient - .post() - .uri(GET_FILE_CONTENT_API, fileIdentificationData.fileId()) - .header(X_GRPC_ADDRESS, RestClientUtils.sanitizeAddress(address)) - .contentType(MediaType.APPLICATION_JSON) - .body(request) - .accept(MediaType.APPLICATION_OCTET_STREAM) - .retrieve().toEntity(Resource.class).getBody()); - - fileContent.ifPresent(file -> processFile(out, file)); + try { + var fileContent = Optional.ofNullable(restClient + .post() + .uri(GET_FILE_CONTENT_API, fileIdentificationData.fileId()) + .header(X_GRPC_ADDRESS, RestClientUtils.sanitizeAddress(address)) + .contentType(MediaType.APPLICATION_JSON) + .body(request) + .accept(MediaType.APPLICATION_OCTET_STREAM) + .retrieve().toEntity(Resource.class).getBody()); + + fileContent.ifPresent(file -> processFile(out, file)); + } catch (RestClientException e) { + LOG.error("Error downloading file. {}", e.getMessage(), e); + throw e; + } } private static void processFile(final OutputStream out, Resource fileContent) { diff --git a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java index a6f5843e01aa3b3700973de84bb574e57ca4ab31..dc60cc51bac544490fae72ff1bdd86fdfdf46573 100644 --- a/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java +++ b/server/src/test/java/de/ozgcloud/antragsraum/attachments/FileRestClientTest.java @@ -39,10 +39,12 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.client.RestClientTest; import org.springframework.boot.test.web.client.MockServerRestClientCustomizer; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.web.client.RestClient; +import org.springframework.web.client.RestClientException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -78,25 +80,33 @@ class FileRestClientTest { @Nested class TestGetFileMetadata { - private static final String FILE_METADATA_URI = ADDRESS + FIND_FILE_METADATA_API; - @BeforeEach - void setup() throws JsonProcessingException { - server.expect(requestTo(FILE_METADATA_URI)).andRespond( - withSuccess(objectMapper.writeValueAsString(AntragraumGrpcGetAttachmentMetadataResponseTestFactory.create()), - MediaType.APPLICATION_JSON)); - } + private static final String FILE_METADATA_URI = ADDRESS + FIND_FILE_METADATA_API; @Test - void shouldLoadFileMetadata() { + void shouldLoadFileMetadata() throws JsonProcessingException { try (var authenticationHelper = mockStatic(AuthenticationHelper.class)) { authenticationHelper.when(AuthenticationHelper::getSamlToken).thenReturn(UserTestFactory.SAML_TOKEN); + server.expect(requestTo(FILE_METADATA_URI)).andRespond( + withSuccess(objectMapper.writeValueAsString(AntragraumGrpcGetAttachmentMetadataResponseTestFactory.create()), + MediaType.APPLICATION_JSON)); var fileMetadata = fileRestClient.getFileMetadata(FILE_IDENTIFICATION_DATA, ADDRESS + FIND_FILE_METADATA_API); assertThat(fileMetadata).isNotNull(); } } + + @Test + void shouldThrowRestClientException() { + try (var authenticationHelper = mockStatic(AuthenticationHelper.class)) { + authenticationHelper.when(AuthenticationHelper::getSamlToken).thenReturn(UserTestFactory.SAML_TOKEN); + server.expect(requestTo(FILE_METADATA_URI)).andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR)); + + assertThatExceptionOfType(RestClientException.class).isThrownBy( + () -> fileRestClient.getFileMetadata(FILE_IDENTIFICATION_DATA, ADDRESS + GET_FILE_CONTENT_API)); + } + } } @Nested @@ -127,18 +137,15 @@ class FileRestClientTest { @Nested class TestDownloadFileContent { - private static final String FILE_CONTENT_URI = ADDRESS + GET_FILE_CONTENT_API; - @BeforeEach - void setup() throws IOException { - server.expect(requestTo(FILE_CONTENT_URI)) - .andRespond(withSuccess(OzgUploadFileTestFactory.MULTIPART_FILE.getBytes(), MediaType.APPLICATION_OCTET_STREAM)); - } + private static final String FILE_CONTENT_URI = ADDRESS + GET_FILE_CONTENT_API; @Test void shouldDownloadFileContent() throws IOException { try (var authenticationHelper = mockStatic(AuthenticationHelper.class)) { authenticationHelper.when(AuthenticationHelper::getSamlToken).thenReturn(UserTestFactory.SAML_TOKEN); + server.expect(requestTo(FILE_CONTENT_URI)) + .andRespond(withSuccess(OzgUploadFileTestFactory.MULTIPART_FILE.getBytes(), MediaType.APPLICATION_OCTET_STREAM)); var out = new ByteArrayOutputStream(); fileRestClient.downloadFileContent(FILE_IDENTIFICATION_DATA, ADDRESS + GET_FILE_CONTENT_API, out); @@ -149,9 +156,11 @@ class FileRestClientTest { } @Test - void shouldDownloadFileContentIoException() { + void shouldThrowTechnicalException() throws IOException { try (var authenticationHelper = mockStatic(AuthenticationHelper.class)) { authenticationHelper.when(AuthenticationHelper::getSamlToken).thenReturn(UserTestFactory.SAML_TOKEN); + server.expect(requestTo(FILE_CONTENT_URI)) + .andRespond(withSuccess(OzgUploadFileTestFactory.MULTIPART_FILE.getBytes(), MediaType.APPLICATION_OCTET_STREAM)); var out = mock(ByteArrayOutputStream.class); doThrow(IOException.class).when(out).write(any(byte[].class), anyInt(), anyInt()); @@ -160,5 +169,17 @@ class FileRestClientTest { () -> fileRestClient.downloadFileContent(FILE_IDENTIFICATION_DATA, ADDRESS + GET_FILE_CONTENT_API, out)); } } + + @Test + void shouldThrowRestClientException() { + try (var authenticationHelper = mockStatic(AuthenticationHelper.class)) { + authenticationHelper.when(AuthenticationHelper::getSamlToken).thenReturn(UserTestFactory.SAML_TOKEN); + server.expect(requestTo(FILE_CONTENT_URI)).andRespond(withStatus(HttpStatus.INTERNAL_SERVER_ERROR)); + + assertThatExceptionOfType(RestClientException.class).isThrownBy( + () -> fileRestClient.downloadFileContent(FILE_IDENTIFICATION_DATA, ADDRESS + GET_FILE_CONTENT_API, + mock(ByteArrayOutputStream.class))); + } + } } } \ No newline at end of file