From c0b31d530e7e0d761c769202726e1663d884eac2 Mon Sep 17 00:00:00 2001 From: Alessio Cialini <63233981+alessio-cialini@users.noreply.github.com> Date: Wed, 29 May 2024 15:22:00 +0200 Subject: [PATCH] [VAS-976] feat: add notice institutions api (#401) Co-authored-by: Jacopo Carlini Co-authored-by: svariant --- openapi/openapi.json | 2 +- .../backoffice/client/InstitutionsClient.java | 2 +- .../controller/NoticeController.java | 12 ++- .../service/InstitutionsService.java | 1 + .../InstitutionsControllerTest.java | 91 +++++++++++++++++++ .../service/InstitutionsServiceTest.java | 6 +- 6 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 src/test/java/it/pagopa/selfcare/pagopa/backoffice/controller/InstitutionsControllerTest.java diff --git a/openapi/openapi.json b/openapi/openapi.json index 66f7a1f8c..79ddd6c8d 100644 --- a/openapi/openapi.json +++ b/openapi/openapi.json @@ -14159,4 +14159,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/main/java/it/pagopa/selfcare/pagopa/backoffice/client/InstitutionsClient.java b/src/main/java/it/pagopa/selfcare/pagopa/backoffice/client/InstitutionsClient.java index f47d0c9c2..b1ec4d002 100644 --- a/src/main/java/it/pagopa/selfcare/pagopa/backoffice/client/InstitutionsClient.java +++ b/src/main/java/it/pagopa/selfcare/pagopa/backoffice/client/InstitutionsClient.java @@ -13,7 +13,7 @@ public interface InstitutionsClient { @PostMapping(value = "/institutions/data", consumes = { MediaType.MULTIPART_FORM_DATA_VALUE}) - void updateInstitutions( + public void updateInstitutions( @RequestPart("institutions-data") String institutionsDataContent, @RequestPart(value = "file") MultipartFile logo); diff --git a/src/main/java/it/pagopa/selfcare/pagopa/backoffice/controller/NoticeController.java b/src/main/java/it/pagopa/selfcare/pagopa/backoffice/controller/NoticeController.java index 8d0f22b3e..f3c6091c7 100644 --- a/src/main/java/it/pagopa/selfcare/pagopa/backoffice/controller/NoticeController.java +++ b/src/main/java/it/pagopa/selfcare/pagopa/backoffice/controller/NoticeController.java @@ -1,5 +1,6 @@ package it.pagopa.selfcare.pagopa.backoffice.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; @@ -18,6 +19,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.validation.Valid; +import javax.validation.Validator; import javax.validation.constraints.NotNull; /** @@ -32,8 +34,14 @@ public class NoticeController { private final InstitutionsService institutionsService; - public NoticeController(InstitutionsService institutionsService) { + private final ObjectMapper objectMapper; + + private final Validator validator; + + public NoticeController(InstitutionsService institutionsService, ObjectMapper objectMapper, Validator validator) { this.institutionsService = institutionsService; + this.objectMapper = objectMapper; + this.validator = validator; } /** @@ -73,7 +81,7 @@ public void updateInstitutions( schema = @Schema(implementation = InstitutionUploadData.class)) @Valid @NotNull @RequestPart("institutions-data") String institutionsDataContent, @Parameter(description = "logo file to upload (not to send on update unless it is changed)") - @RequestPart(value = "file", required = false) MultipartFile logo + @Valid @NotNull @RequestParam(value = "file", required = false) MultipartFile logo ) { institutionsService.uploadInstitutionsData(institutionsDataContent, logo); } diff --git a/src/main/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsService.java b/src/main/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsService.java index 2b8bb3a63..a6cbb0afd 100644 --- a/src/main/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsService.java +++ b/src/main/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsService.java @@ -16,6 +16,7 @@ public class InstitutionsService { private final InstitutionsClient institutionClient; + public InstitutionsService(InstitutionsClient institutionClient) { this.institutionClient = institutionClient; } diff --git a/src/test/java/it/pagopa/selfcare/pagopa/backoffice/controller/InstitutionsControllerTest.java b/src/test/java/it/pagopa/selfcare/pagopa/backoffice/controller/InstitutionsControllerTest.java new file mode 100644 index 000000000..7ee20ad34 --- /dev/null +++ b/src/test/java/it/pagopa/selfcare/pagopa/backoffice/controller/InstitutionsControllerTest.java @@ -0,0 +1,91 @@ +package it.pagopa.selfcare.pagopa.backoffice.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import it.pagopa.selfcare.pagopa.backoffice.model.notices.InstitutionUploadData; +import it.pagopa.selfcare.pagopa.backoffice.service.InstitutionsService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockPart; +import org.springframework.test.web.servlet.MockMvc; + +import java.io.IOException; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest +@AutoConfigureMockMvc +class InstitutionsControllerTest { + + @Autowired + private MockMvc mvc; + + @MockBean + private InstitutionsService institutionsService; + + private ObjectMapper objectMapper = new ObjectMapper(); + + @BeforeEach + void setUp() { + Mockito.reset(institutionsService); + } + + @Test + void updateInstitutionsShouldReturnOk() throws Exception { + InstitutionUploadData uploadData = + InstitutionUploadData.builder() + .cbill("cbill") + .info("info") + .webChannel(true) + .taxCode("123132") + .posteAccountNumber("1313") + .fullName("121212") + .organization("test") + .physicalChannel("1212") + .build(); + String url = "/notice/institutions/data"; + mvc.perform(multipart(url) + .file("file","".getBytes()) + .part(new MockPart("institutions-data", + objectMapper.writeValueAsString(uploadData).getBytes())) + .contentType(MediaType.MULTIPART_FORM_DATA_VALUE)) + .andExpect(status().isOk()); + verify(institutionsService).uploadInstitutionsData(any(), any()); + } + + @Test + void updateInstitutionsShouldReturnKoOnIoException() throws Exception { + InstitutionUploadData uploadData = + InstitutionUploadData.builder() + .cbill("cbill") + .info("info") + .webChannel(true) + .taxCode("123132") + .posteAccountNumber("1313") + .fullName("121212") + .organization("test") + .physicalChannel("1212") + .build(); + doAnswer(invocationOnMock -> { + throw new IOException(); + }).when(institutionsService).uploadInstitutionsData(any(), any()); + String url = "/notice/institutions/data"; + mvc.perform(multipart(url) + .file("file", "".getBytes()) + .part(new MockPart("institutions-data", + objectMapper.writeValueAsString(uploadData).getBytes())) + .contentType(MediaType.MULTIPART_FORM_DATA_VALUE)) + .andExpect(status().is5xxServerError()); + verify(institutionsService).uploadInstitutionsData(any(), any()); + } + +} diff --git a/src/test/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsServiceTest.java b/src/test/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsServiceTest.java index 9d0c6fef9..a33eb7bab 100644 --- a/src/test/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsServiceTest.java +++ b/src/test/java/it/pagopa/selfcare/pagopa/backoffice/service/InstitutionsServiceTest.java @@ -12,6 +12,10 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.web.multipart.MultipartFile; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @@ -93,4 +97,4 @@ void shouldThrowExceptionOnInstitutionDataRecoveryKOUnexpected() { assertEquals(AppError.INSTITUTION_RETRIEVE_ERROR.title, appException.getTitle()); } -} \ No newline at end of file +}