From ba20cee5dda06938fa23ae073460fafcc4c8a898 Mon Sep 17 00:00:00 2001 From: flaminiaScarciofolo <113031535+flaminiaScarciofolo@users.noreply.github.com> Date: Thu, 13 Jun 2024 09:30:05 +0200 Subject: [PATCH] [SELC-4733] Feat: Refactor test for connector rest module (#455) --- .../connector/rest/BaseConnectorTest.java | 21 + .../connector/rest/CoreConnectorImplTest.java | 391 ++++++++-------- .../PagoPABackOfficeConnectorImplTest.java | 91 +++- .../rest/ProductConnectorImplTest.java | 179 +++++-- .../connector/rest/UserConnectorImplTest.java | 442 ++++++++++++------ .../rest/UserGroupConnectorImplTest.java | 372 +++++++-------- .../rest/UserRegistryConnectorImplTest.java | 218 +++------ .../rest/client/UserGroupRestClientTest.java | 9 +- .../client/UserRegistryRestClientTest.java | 3 +- .../rest/decoder/FeignErrorDecoderTest.java | 6 +- ...ackOfficeAuthorizationInterceptorTest.java | 3 +- .../test/resources/stubs/AddUserRoleDto.json | 13 + .../src/test/resources/stubs/BrokerInfo.json | 6 + .../test/resources/stubs/BrokerResponse.json | 6 + .../stubs/ConnectorDelegationRequest.json | 9 + .../ConnectorDelegationRequest_idNull.json | 9 + .../test/resources/stubs/CreateUserDto.json | 19 + .../resources/stubs/DelegationRequest.json | 8 + .../resources/stubs/DelegationResponse.json | 17 + .../stubs/DelegationResponse_idNull.json | 17 + .../src/test/resources/stubs/Institution.json | 67 +++ .../resources/stubs/InstitutionResponse.json | 57 +++ .../src/test/resources/stubs/Product.json | 35 ++ .../src/test/resources/stubs/ProductList.json | 72 +++ .../src/test/resources/stubs/ProductTree.json | 132 ++++++ .../rest/src/test/resources/stubs/User.json | 30 ++ .../stubs/UserCertificationNone.json | 24 + .../stubs/UserCertificationNotNone.json | 24 + .../resources/stubs/UserDataResponse.json | 32 ++ .../resources/stubs/UserDetailResponse.json | 30 ++ .../test/resources/stubs/UserInfoFilter.json | 7 + .../resources/stubs/UserInfoResponse.json | 12 + .../stubs/UserInstitutionResponse.json | 20 + .../stubs/UserInstitutionResponse2.json | 20 + .../test/resources/stubs/UserToCreate.json | 7 + .../test/resources/stubs/createUserGroup.json | 7 + .../stubs/createUserGroupRequest.json | 8 + .../delegationUsingFromExpectedResponse.json | 1 + ...delegationUsingFromExpectedResponseV2.json | 1 + ...onId_notEmptyProductId_notEmptyUserId.json | 46 ++ .../stubs/groupResponse_toGroupInfo.json | 46 ++ ...groupResponse_toGroupInfo_nullMembers.json | 27 ++ .../userGroupInfoGetUserGroupByIdSingle.json | 37 ++ .../stubs/userGroupInfoGetUserGroups.json | 21 + .../stubs/userGroupInfoNullModifiedBy.json | 39 ++ .../resources/stubs/userGroupResponse.json | 13 + .../userGroupResponseNullModifiedBy.json | 13 + .../stubs/userGroupResponseSingle.json | 13 + 48 files changed, 1922 insertions(+), 758 deletions(-) create mode 100644 connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/BaseConnectorTest.java create mode 100644 connector/rest/src/test/resources/stubs/AddUserRoleDto.json create mode 100644 connector/rest/src/test/resources/stubs/BrokerInfo.json create mode 100644 connector/rest/src/test/resources/stubs/BrokerResponse.json create mode 100644 connector/rest/src/test/resources/stubs/ConnectorDelegationRequest.json create mode 100644 connector/rest/src/test/resources/stubs/ConnectorDelegationRequest_idNull.json create mode 100644 connector/rest/src/test/resources/stubs/CreateUserDto.json create mode 100644 connector/rest/src/test/resources/stubs/DelegationRequest.json create mode 100644 connector/rest/src/test/resources/stubs/DelegationResponse.json create mode 100644 connector/rest/src/test/resources/stubs/DelegationResponse_idNull.json create mode 100644 connector/rest/src/test/resources/stubs/Institution.json create mode 100644 connector/rest/src/test/resources/stubs/InstitutionResponse.json create mode 100644 connector/rest/src/test/resources/stubs/Product.json create mode 100644 connector/rest/src/test/resources/stubs/ProductList.json create mode 100644 connector/rest/src/test/resources/stubs/ProductTree.json create mode 100644 connector/rest/src/test/resources/stubs/User.json create mode 100644 connector/rest/src/test/resources/stubs/UserCertificationNone.json create mode 100644 connector/rest/src/test/resources/stubs/UserCertificationNotNone.json create mode 100644 connector/rest/src/test/resources/stubs/UserDataResponse.json create mode 100644 connector/rest/src/test/resources/stubs/UserDetailResponse.json create mode 100644 connector/rest/src/test/resources/stubs/UserInfoFilter.json create mode 100644 connector/rest/src/test/resources/stubs/UserInfoResponse.json create mode 100644 connector/rest/src/test/resources/stubs/UserInstitutionResponse.json create mode 100644 connector/rest/src/test/resources/stubs/UserInstitutionResponse2.json create mode 100644 connector/rest/src/test/resources/stubs/UserToCreate.json create mode 100644 connector/rest/src/test/resources/stubs/createUserGroup.json create mode 100644 connector/rest/src/test/resources/stubs/createUserGroupRequest.json create mode 100644 connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponse.json create mode 100644 connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponseV2.json create mode 100644 connector/rest/src/test/resources/stubs/getUserGroups_notEmptyInstitutionId_notEmptyProductId_notEmptyUserId.json create mode 100644 connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo.json create mode 100644 connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo_nullMembers.json create mode 100644 connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroupByIdSingle.json create mode 100644 connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroups.json create mode 100644 connector/rest/src/test/resources/stubs/userGroupInfoNullModifiedBy.json create mode 100644 connector/rest/src/test/resources/stubs/userGroupResponse.json create mode 100644 connector/rest/src/test/resources/stubs/userGroupResponseNullModifiedBy.json create mode 100644 connector/rest/src/test/resources/stubs/userGroupResponseSingle.json diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/BaseConnectorTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/BaseConnectorTest.java new file mode 100644 index 000000000..20dc2b766 --- /dev/null +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/BaseConnectorTest.java @@ -0,0 +1,21 @@ +package it.pagopa.selfcare.dashboard.connector.rest; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; + +public class BaseConnectorTest { + + protected ObjectMapper objectMapper; + + public BaseConnectorTest() { + } + + public void setUp() { + MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); + mappingJackson2HttpMessageConverter.setObjectMapper((new ObjectMapper()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).registerModule(new JavaTimeModule())); + this.objectMapper = new ObjectMapper(); + this.objectMapper.registerModule(new JavaTimeModule()); + } +} diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/CoreConnectorImplTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/CoreConnectorImplTest.java index 1b59fe521..9cb38aaaa 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/CoreConnectorImplTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/CoreConnectorImplTest.java @@ -1,19 +1,14 @@ package it.pagopa.selfcare.dashboard.connector.rest; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.PropertyAccessor; -import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import it.pagopa.selfcare.commons.base.security.SelfCareAuthority; -import it.pagopa.selfcare.core.generated.openapi.v1.dto.PageInfo; import it.pagopa.selfcare.core.generated.openapi.v1.dto.*; import it.pagopa.selfcare.dashboard.connector.model.backoffice.BrokerInfo; -import it.pagopa.selfcare.dashboard.connector.model.delegation.DelegationRequest; -import it.pagopa.selfcare.dashboard.connector.model.delegation.*; +import it.pagopa.selfcare.dashboard.connector.model.delegation.Delegation; +import it.pagopa.selfcare.dashboard.connector.model.delegation.DelegationId; +import it.pagopa.selfcare.dashboard.connector.model.delegation.DelegationWithPagination; +import it.pagopa.selfcare.dashboard.connector.model.delegation.GetDelegationParameters; import it.pagopa.selfcare.dashboard.connector.model.institution.*; import it.pagopa.selfcare.dashboard.connector.model.product.PartyProduct; import it.pagopa.selfcare.dashboard.connector.model.user.UserInfo; @@ -25,70 +20,65 @@ import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.BrokerMapper; import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.DelegationRestClientMapperImpl; import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.InstitutionMapperImpl; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.function.Executable; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; -import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.mockito.*; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import javax.validation.ValidationException; -import java.util.*; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.function.Function; import static it.pagopa.selfcare.commons.base.security.SelfCareAuthority.ADMIN; import static it.pagopa.selfcare.commons.base.security.SelfCareAuthority.LIMITED; -import static it.pagopa.selfcare.commons.utils.TestUtils.checkNotNullFields; import static it.pagopa.selfcare.commons.utils.TestUtils.mockInstance; import static it.pagopa.selfcare.dashboard.connector.rest.CoreConnectorImpl.REQUIRED_GEOGRAPHIC_TAXONOMIES_MESSAGE; import static it.pagopa.selfcare.dashboard.connector.rest.CoreConnectorImpl.REQUIRED_INSTITUTION_ID_MESSAGE; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, - classes = { - CoreConnectorImpl.class, InstitutionMapperImpl.class, DelegationRestClientMapperImpl.class - } -) -class CoreConnectorImplTest { +@ExtendWith(MockitoExtension.class) +class CoreConnectorImplTest extends BaseConnectorTest{ - private final ObjectMapper mapper; + @Spy + private final InstitutionMapperImpl institutionMapperSpy = new InstitutionMapperImpl(); - @Autowired + @Spy + private final DelegationRestClientMapperImpl delegationRestClientMapperSpy = new DelegationRestClientMapperImpl(); + + @InjectMocks private CoreConnectorImpl msCoreConnector; - @MockBean + @Mock private CoreDelegationApiRestClient coreDelegationApiRestClient; - @MockBean + @Mock private CoreInstitutionApiRestClient coreInstitutionApiRestClient; - @MockBean + @Mock private CoreOnboardingApiRestClient coreOnboardingApiRestClient; - @MockBean + @Mock private CoreManagementApiRestClient coreManagementApiRestClient; - @MockBean + @Mock private BrokerMapper brokerMapper; - public CoreConnectorImplTest() { - mapper = new ObjectMapper(); - mapper.registerModule(new JavaTimeModule()); - mapper.registerModule(new Jdk8Module()); - mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); - mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); - mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - mapper.setTimeZone(TimeZone.getDefault()); + @BeforeEach + public void setup() { + super.setUp(); } private static final Function PARTY_2_SELC_ROLE = partyRole -> switch (partyRole) { @@ -99,10 +89,8 @@ public CoreConnectorImplTest() { @Test void getInstitution_nullInstitutionId() { - // given - String institutionId = null; // when - Executable executable = () -> msCoreConnector.getInstitution(institutionId); + Executable executable = () -> msCoreConnector.getInstitution(null); // then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("An Institution id is required", e.getMessage()); @@ -127,74 +115,133 @@ void getInstitution_nullResponse() { @Test - void getInstitution() { + void getInstitution() throws IOException { // given String institutionId = "institutionId"; - InstitutionResponse institutionMock = mockInstance(new InstitutionResponse()); - AttributesResponse attribute = mockInstance(new AttributesResponse()); - institutionMock.setGeographicTaxonomies(List.of(mockInstance(new GeoTaxonomies()))); - institutionMock.setAttributes(List.of(attribute)); - institutionMock.setOnboarding(Collections.emptyList()); - when(coreInstitutionApiRestClient._retrieveInstitutionByIdUsingGET(any())) + ClassPathResource resource = new ClassPathResource("stubs/InstitutionResponse.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + InstitutionResponse institutionMock = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + when(coreInstitutionApiRestClient._retrieveInstitutionByIdUsingGET(institutionId)) .thenReturn(ResponseEntity.of(Optional.of(institutionMock))); // when Institution institution = msCoreConnector.getInstitution(institutionId); // then - assertSame(institutionMock.getDescription(), institution.getDescription()); - checkNotNullFields(institution, "supportContact", "billing", "paymentServiceProvider", "dataProtectionOfficer", "city", "country", "county", "additionalInformations"); + + assertEquals(institution, institutionMapperSpy.toInstitution(institutionMock)); verify(coreInstitutionApiRestClient, times(1)) ._retrieveInstitutionByIdUsingGET(institutionId); - verifyNoMoreInteractions(coreInstitutionApiRestClient); - } @Test - void updateInstitutionDescription() { + void updateInstitutionDescription() throws IOException { // given - String institutionId = "setId"; - UpdateInstitutionResource resource = mockInstance(new UpdateInstitutionResource()); - InstitutionPut resourcePut = mockInstance(new InstitutionPut()); - InstitutionResponse institutionMock = mockInstance(new InstitutionResponse()); - when(coreInstitutionApiRestClient._updateInstitutionUsingPUT(anyString(), any())) + String institutionId = "institutionId"; + UpdateInstitutionResource updateResource = new UpdateInstitutionResource(); + updateResource.setDescription("description"); + updateResource.setDigitalAddress("digitalAddress"); + + InstitutionPut resourcePut = new InstitutionPut(); + resourcePut.setDescription("description"); + resourcePut.setDigitalAddress("digitalAddress"); + resourcePut.setGeographicTaxonomyCodes(null); + + ClassPathResource resource = new ClassPathResource("stubs/InstitutionResponse.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + InstitutionResponse institutionMock = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + when(coreInstitutionApiRestClient._updateInstitutionUsingPUT(institutionId, resourcePut)) .thenReturn(ResponseEntity.of(Optional.of(institutionMock))); // when - Institution institution = msCoreConnector.updateInstitutionDescription(institutionId, resource); + Institution institution = msCoreConnector.updateInstitutionDescription(institutionId, updateResource); // then - assertEquals(institution.getId(), institutionId); - assertEquals(institution.getDescription(), resource.getDescription()); - assertEquals(institution.getDigitalAddress(), resource.getDigitalAddress()); + + assertEquals(institution, institutionMapperSpy.toInstitution(institutionMock)); verify(coreInstitutionApiRestClient, times(1)) ._updateInstitutionUsingPUT(institutionId, resourcePut); - verifyNoMoreInteractions(coreInstitutionApiRestClient); } @Test - void createDelegation() { + void createDelegation() throws IOException { // given - DelegationRequest delegation = new DelegationRequest(); - delegation.setId("id"); - DelegationResponse delegationId = new DelegationResponse(); - delegationId.setId("id"); - when(coreDelegationApiRestClient._createDelegationUsingPOST(any())) - .thenReturn(ResponseEntity.of(Optional.of(delegationId))); - DelegationId response = msCoreConnector.createDelegation(delegation); + ClassPathResource resource = new ClassPathResource("stubs/DelegationRequest.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + DelegationRequest delegationMock = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + ClassPathResource responseResource = new ClassPathResource("stubs/DelegationResponse.json"); + byte[] responseResourceStream = Files.readAllBytes(responseResource.getFile().toPath()); + DelegationResponse delegationResponse = objectMapper.readValue(responseResourceStream, new TypeReference<>() {}); + + when(coreDelegationApiRestClient._createDelegationUsingPOST(delegationMock)) + .thenReturn(ResponseEntity.of(Optional.of(delegationResponse))); + + ClassPathResource requestResource = new ClassPathResource("stubs/ConnectorDelegationRequest.json"); + byte[] requestResourceStream = Files.readAllBytes(requestResource.getFile().toPath()); + it.pagopa.selfcare.dashboard.connector.model.delegation.DelegationRequest delegationRequest = objectMapper.readValue(requestResourceStream, new TypeReference<>() {}); + + DelegationId response = msCoreConnector.createDelegation(delegationRequest); assertNotNull(response); - assertEquals(response.getId(), delegationId.getId()); + assertEquals(response.getId(), delegationRequest.getId()); } @Test - void findInstitutionsByProductIdAndType() { + void createDelegation_idNull() throws IOException { + // given + ClassPathResource resource = new ClassPathResource("stubs/DelegationRequest.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + DelegationRequest delegationMock = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + ClassPathResource responseResource = new ClassPathResource("stubs/DelegationResponse_idNull.json"); + byte[] responseResourceStream = Files.readAllBytes(responseResource.getFile().toPath()); + DelegationResponse delegationResponse = objectMapper.readValue(responseResourceStream, new TypeReference<>() {}); + + when(coreDelegationApiRestClient._createDelegationUsingPOST(delegationMock)) + .thenReturn(ResponseEntity.of(Optional.of(delegationResponse))); + + ClassPathResource requestResource = new ClassPathResource("stubs/ConnectorDelegationRequest_idNull.json"); + byte[] requestResourceStream = Files.readAllBytes(requestResource.getFile().toPath()); + it.pagopa.selfcare.dashboard.connector.model.delegation.DelegationRequest delegationRequest = objectMapper.readValue(requestResourceStream, new TypeReference<>() {}); + + DelegationId response = msCoreConnector.createDelegation(delegationRequest); + assertNotNull(response); + assertNull(response.getId()); + } + + @Test + void createDelegation_empty() throws IOException { + // given + ClassPathResource resource = new ClassPathResource("stubs/DelegationRequest.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + DelegationRequest delegationMock = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + when(coreDelegationApiRestClient._createDelegationUsingPOST(delegationMock)) + .thenReturn(ResponseEntity.of(Optional.empty())); + + ClassPathResource requestResource = new ClassPathResource("stubs/ConnectorDelegationRequest.json"); + byte[] requestResourceStream = Files.readAllBytes(requestResource.getFile().toPath()); + it.pagopa.selfcare.dashboard.connector.model.delegation.DelegationRequest delegationRequest = objectMapper.readValue(requestResourceStream, new TypeReference<>() {}); + + DelegationId response = msCoreConnector.createDelegation(delegationRequest); + assertEquals(new DelegationId(), response); + } + + @Test + void findInstitutionsByProductIdAndType() throws IOException { // given final String productId = "prod"; final String type = "PT"; - BrokerInfo brokerInfo = new BrokerInfo(); - brokerInfo.setCode("taxCode"); - brokerInfo.setDescription("description"); - BrokerResponse brokerResponse = new BrokerResponse(); - brokerResponse.setDescription("description"); - brokerResponse.setTaxCode("taxCode"); - when(brokerMapper.fromInstitutions(anyList())).thenReturn(List.of(brokerInfo)); - when(coreInstitutionApiRestClient._getInstitutionBrokersUsingGET(any(), any())) + ClassPathResource resource = new ClassPathResource("stubs/BrokerInfo.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + BrokerInfo brokerInfo = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + ClassPathResource responseResource = new ClassPathResource("stubs/BrokerResponse.json"); + byte[] responseResourceStream = Files.readAllBytes(responseResource.getFile().toPath()); + BrokerResponse brokerResponse = objectMapper.readValue(responseResourceStream, new TypeReference<>() {}); + + when(brokerMapper.fromInstitutions(List.of(brokerResponse))).thenReturn(List.of(brokerInfo)); + when(coreInstitutionApiRestClient._getInstitutionBrokersUsingGET(productId, type)) .thenReturn(ResponseEntity.of(Optional.of(List.of(brokerResponse)))); // when List response = msCoreConnector.findInstitutionsByProductAndType(productId, type); @@ -202,57 +249,64 @@ void findInstitutionsByProductIdAndType() { assertNotNull(response); assertEquals(1, response.size()); assertNotNull(response.get(0)); - assertEquals(response.get(0).getCode(), brokerInfo.getCode()); - assertEquals(response.get(0).getDescription(), brokerResponse.getDescription()); + assertEquals(response.get(0), brokerInfo); } @Test - void getDelegationUsingFrom_shouldGetData() { - // given - DelegationResponse delegationResponse = dummyDelegationResponse(); - List delegationResponseList = new ArrayList<>(); - delegationResponseList.add(delegationResponse); + void getDelegationUsingFrom_shouldGetData() throws IOException { + GetDelegationParameters parameters = GetDelegationParameters.builder() + .productId("setProductId") + .taxCode("taxCode") + .search("name") + .order("ASC") + .page(0) + .size(1000) + .build(); + + // Read the expected response from a JSON file + ClassPathResource resource = new ClassPathResource("stubs/delegationUsingFromExpectedResponse.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + DelegationResponse expectedResponse = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + List < DelegationResponse > delegationResponseList = new ArrayList<>(); + delegationResponseList.add(expectedResponse); + ResponseEntity> delegationResponseEntity = new ResponseEntity<>(delegationResponseList, null, HttpStatus.OK); - GetDelegationParameters parameters = dummyDelegationParameters(); - when(coreDelegationApiRestClient._getDelegationsUsingGET(any(), any(), any(), any(), any(), any(), any(), any())) + when(coreDelegationApiRestClient._getDelegationsUsingGET(null, null, "setProductId", "name", "taxCode", "ASC", 0, 1000)) .thenReturn(delegationResponseEntity); - // when - List delegationList = msCoreConnector.getDelegations(dummyDelegationParameters()); + List delegationList = msCoreConnector.getDelegations(parameters); + // then assertNotNull(delegationList); assertEquals(1, delegationList.size()); - assertEquals(delegationResponseList.get(0).getId(), delegationList.get(0).getId()); - assertEquals(delegationResponseList.get(0).getInstitutionId(), delegationList.get(0).getInstitutionId()); - assertEquals(delegationResponseList.get(0).getBrokerId(), delegationList.get(0).getBrokerId()); - assertEquals(delegationResponseList.get(0).getProductId(), delegationList.get(0).getProductId()); - assertEquals(delegationResponseList.get(0).getType().toString(), delegationList.get(0).getType().toString()); - assertEquals(delegationResponseList.get(0).getInstitutionName(), delegationList.get(0).getInstitutionName()); - assertEquals(delegationResponseList.get(0).getBrokerName(), delegationList.get(0).getBrokerName()); + assertEquals(delegationRestClientMapperSpy.toDelegations(expectedResponse), delegationList.get(0)); verify(coreDelegationApiRestClient, times(1)) ._getDelegationsUsingGET(parameters.getFrom(), parameters.getTo(), parameters.getProductId(), parameters.getSearch(), parameters.getTaxCode(), parameters.getOrder(), parameters.getPage(), parameters.getSize()); verifyNoMoreInteractions(coreDelegationApiRestClient); } - @Test - void getDelegationUsingFrom_shouldGetEmptyData() { + void getDelegationUsingFrom_shouldGetEmptyData() throws IOException { // given - ResponseEntity> delegationResponseEntity = mock(ResponseEntity.class); - GetDelegationParameters parameters = dummyDelegationParameters(); - - when(delegationResponseEntity.getBody()).thenReturn(null); - - when(coreDelegationApiRestClient._getDelegationsUsingGET(any(), any(), any(), any(), any(), any(), any(), any())) - .thenReturn(delegationResponseEntity); + GetDelegationParameters parameters = GetDelegationParameters.builder() + .productId("setProductId") + .taxCode("taxCode") + .search("name") + .order("ASC") + .page(0) + .size(1000) + .build(); + when(coreDelegationApiRestClient._getDelegationsUsingGET(null, null, "setProductId", "name", "taxCode", "ASC", 0, 1000)) + .thenReturn(ResponseEntity.of(Optional.empty())); // when - List delegationList = msCoreConnector.getDelegations(dummyDelegationParameters()); + List delegationList = msCoreConnector.getDelegations(parameters); // then assertNotNull(delegationList); assertEquals(0, delegationList.size()); @@ -263,60 +317,53 @@ void getDelegationUsingFrom_shouldGetEmptyData() { } @Test - void getDelegationsV2_shouldGetData() { + void getDelegationsV2_shouldGetData() throws IOException { // given - DelegationResponse delegationResponse = dummyDelegationResponse(); + GetDelegationParameters parameters = GetDelegationParameters.builder() + .productId("setProductId") + .taxCode("taxCode") + .search("name") + .order("ASC") + .page(0) + .size(1000) + .build(); + // Read the expected response from a JSON file + ClassPathResource resource = new ClassPathResource("stubs/delegationUsingFromExpectedResponseV2.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + DelegationResponse expectedResponse = new ObjectMapper().readValue(resourceStream, new TypeReference<>() {}); List delegationResponseList = new ArrayList<>(); - delegationResponseList.add(delegationResponse); + delegationResponseList.add(expectedResponse); PageInfo pageInfo = new PageInfo(1L, 0L, 1L, 1L); DelegationWithPaginationResponse delegationWithPaginationResponse = new DelegationWithPaginationResponse(delegationResponseList, pageInfo); ResponseEntity delegationResponseEntity = new ResponseEntity<>(delegationWithPaginationResponse, null, HttpStatus.OK); - GetDelegationParameters parameters = dummyDelegationParameters(); - when(coreDelegationApiRestClient._getDelegationsUsingGET1(any(), any(), any(), any(), any(), any(), any(), any())) + when(coreDelegationApiRestClient._getDelegationsUsingGET1(null, null, "setProductId", "name", "taxCode", "ASC", 0, 1000)) .thenReturn(delegationResponseEntity); - // when - DelegationWithPagination response = msCoreConnector.getDelegationsV2(dummyDelegationParameters()); + DelegationWithPagination response = msCoreConnector.getDelegationsV2(parameters); + // then assertNotNull(response); assertEquals(1, response.getDelegations().size()); - - assertEquals(delegationResponseList.get(0).getId(), response.getDelegations().get(0).getId()); - assertEquals(delegationResponseList.get(0).getInstitutionId(), response.getDelegations().get(0).getInstitutionId()); - assertEquals(delegationResponseList.get(0).getBrokerId(), response.getDelegations().get(0).getBrokerId()); - assertEquals(delegationResponseList.get(0).getProductId(), response.getDelegations().get(0).getProductId()); - assertEquals(delegationResponseList.get(0).getType().toString(), response.getDelegations().get(0).getType().toString()); - assertEquals(delegationResponseList.get(0).getInstitutionName(), response.getDelegations().get(0).getInstitutionName()); - assertEquals(delegationResponseList.get(0).getBrokerName(), response.getDelegations().get(0).getBrokerName()); - + assertEquals(delegationRestClientMapperSpy.toDelegationsWithInfo(expectedResponse), response.getDelegations().get(0)); verify(coreDelegationApiRestClient, times(1)) ._getDelegationsUsingGET1(parameters.getFrom(), parameters.getTo(), parameters.getProductId(), parameters.getSearch(), parameters.getTaxCode(), parameters.getOrder(), parameters.getPage(), parameters.getSize()); verifyNoMoreInteractions(coreDelegationApiRestClient); } - - private DelegationResponse dummyDelegationResponse() { - DelegationResponse delegationResponse = new DelegationResponse(); - delegationResponse.setInstitutionId("from"); - delegationResponse.setBrokerId("to"); - delegationResponse.setId("setId"); - delegationResponse.setProductId("setProductId"); - delegationResponse.setType(DelegationResponse.TypeEnum.PT); - delegationResponse.setInstitutionName("setInstitutionFromName"); - delegationResponse.setBrokerName("brokerName"); - return delegationResponse; - } - @Test void updateGeographicTaxonomy() { // given String institutionId = "institutionId"; GeographicTaxonomyList geographicTaxonomiesMock = new GeographicTaxonomyList(); - geographicTaxonomiesMock.setGeographicTaxonomyList(List.of(mockInstance(new GeographicTaxonomy()))); - System.out.println(geographicTaxonomiesMock); - when(coreInstitutionApiRestClient._updateInstitutionUsingPUT(anyString(), any())).thenReturn(ResponseEntity.ok().build()); + GeographicTaxonomy geographicTaxonomy = new GeographicTaxonomy(); + geographicTaxonomy.setCode("code"); + geographicTaxonomy.setDesc("desc"); + geographicTaxonomiesMock.setGeographicTaxonomyList(List.of(geographicTaxonomy)); + InstitutionPut resourcePut = new InstitutionPut(); + resourcePut.setGeographicTaxonomyCodes(new ArrayList<>(List.of(geographicTaxonomy.getCode()))); + when(coreInstitutionApiRestClient._updateInstitutionUsingPUT(institutionId, resourcePut)).thenReturn(ResponseEntity.ok().build()); // when msCoreConnector.updateInstitutionGeographicTaxonomy(institutionId, geographicTaxonomiesMock); // then @@ -331,10 +378,9 @@ void updateGeographicTaxonomy() { @Test void updateGeographicTaxonomy_hasNullInstitutionId() { // given - String institutionId = null; GeographicTaxonomyList geographicTaxonomiesMock = new GeographicTaxonomyList(); // when - Executable executable = () -> msCoreConnector.updateInstitutionGeographicTaxonomy(institutionId, geographicTaxonomiesMock); + Executable executable = () -> msCoreConnector.updateInstitutionGeographicTaxonomy(null, geographicTaxonomiesMock); // then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_INSTITUTION_ID_MESSAGE, e.getMessage()); @@ -345,9 +391,8 @@ void updateGeographicTaxonomy_hasNullInstitutionId() { void updateGeographicTaxonomy_hasNullGeographicTaxonomies() { // given String institutionId = "institutionId"; - GeographicTaxonomyList geographicTaxonomiesMock = null; // when - Executable executable = () -> msCoreConnector.updateInstitutionGeographicTaxonomy(institutionId, geographicTaxonomiesMock); + Executable executable = () -> msCoreConnector.updateInstitutionGeographicTaxonomy(institutionId, null); // then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GEOGRAPHIC_TAXONOMIES_MESSAGE, e.getMessage()); @@ -412,9 +457,10 @@ void getInstitutionProducts_emptyProductsInfo() { void getInstitutionProducts() { // given String institutionId = "institutionId"; + String states = "ACTIVE,PENDING"; OnboardedProducts products = new OnboardedProducts(); - products.setProducts(List.of(mockInstance(new InstitutionProduct()))); - when(coreInstitutionApiRestClient._retrieveInstitutionProductsUsingGET(any(), any())) + products.setProducts(List.of(new InstitutionProduct())); + when(coreInstitutionApiRestClient._retrieveInstitutionProductsUsingGET(institutionId, states)) .thenReturn(ResponseEntity.ok(products)); // when List institutionProducts = msCoreConnector.getInstitutionProducts(institutionId); @@ -441,19 +487,13 @@ void party2SelcRoleMapping(it.pagopa.selfcare.commons.base.security.PartyRole pa @Test void userInfoFilter_emptyOptionals() { - //given - List productRoles = null; - String userId = null; - SelfCareAuthority role = null; - String productId = null; - List allowedStates = null; //when UserInfo.UserInfoFilter filter = new UserInfo.UserInfoFilter(); - filter.setUserId(userId); - filter.setProductRoles(productRoles); - filter.setProductId(productId); - filter.setRole(role); - filter.setAllowedStates(allowedStates); + filter.setUserId(null); + filter.setProductRoles(null); + filter.setProductId(null); + filter.setRole(null); + filter.setAllowedStates(null); //then assertNull(filter.getProductId()); assertNull(filter.getProductRoles()); @@ -464,10 +504,8 @@ void userInfoFilter_emptyOptionals() { @Test void getGeographicTaxonomyList_nullInstitutionId() { - // given - String institutionId = null; // when - Executable executable = () -> msCoreConnector.getGeographicTaxonomyList(institutionId); + Executable executable = () -> msCoreConnector.getGeographicTaxonomyList(null); // then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("An Institution id is required", e.getMessage()); @@ -480,7 +518,7 @@ void getGeographicTaxonomyList_noGeographicTaxonomies() { // given String institutionId = "institutionId"; InstitutionResponse institutionMock = mockInstance(new InstitutionResponse()); - when(coreInstitutionApiRestClient._retrieveInstitutionByIdUsingGET(any())) + when(coreInstitutionApiRestClient._retrieveInstitutionByIdUsingGET(institutionId)) .thenReturn(ResponseEntity.ok(institutionMock)); // when Executable executable = () -> msCoreConnector.getGeographicTaxonomyList(institutionId); @@ -497,11 +535,11 @@ void getGeographicTaxonomyList_noGeographicTaxonomies() { void getGeographicTaxonomyList() { // given String institutionId = "institutionId"; - InstitutionResponse institutionMock = mockInstance(new InstitutionResponse()); - AttributesResponse attribute = mockInstance(new AttributesResponse()); - institutionMock.setGeographicTaxonomies(List.of(mockInstance(new GeoTaxonomies()))); + InstitutionResponse institutionMock = new InstitutionResponse(); + AttributesResponse attribute = new AttributesResponse(); + institutionMock.setGeographicTaxonomies(List.of(new GeoTaxonomies())); institutionMock.setAttributes(List.of(attribute)); - when(coreInstitutionApiRestClient._retrieveInstitutionByIdUsingGET(any())) + when(coreInstitutionApiRestClient._retrieveInstitutionByIdUsingGET(institutionId)) .thenReturn(ResponseEntity.ok(institutionMock)); // when List geographicTaxonomies = msCoreConnector.getGeographicTaxonomyList(institutionId); @@ -512,17 +550,4 @@ void getGeographicTaxonomyList() { ._retrieveInstitutionByIdUsingGET(institutionId); verifyNoMoreInteractions(coreInstitutionApiRestClient); } - - private GetDelegationParameters dummyDelegationParameters() { - return GetDelegationParameters.builder() - .to("to") - .productId("setProductId") - .taxCode("taxCode") - .search("name") - .order(Order.ASC.name()) - .page(0) - .size(1000) - .build(); - } - } \ No newline at end of file diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/PagoPABackOfficeConnectorImplTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/PagoPABackOfficeConnectorImplTest.java index a5963e9eb..c1a8ee431 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/PagoPABackOfficeConnectorImplTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/PagoPABackOfficeConnectorImplTest.java @@ -1,5 +1,6 @@ package it.pagopa.selfcare.dashboard.connector.rest; +import com.fasterxml.jackson.core.type.TypeReference; import it.pagopa.selfcare.backoffice.generated.openapi.v1.dto.Broker; import it.pagopa.selfcare.backoffice.generated.openapi.v1.dto.BrokerPsp; import it.pagopa.selfcare.backoffice.generated.openapi.v1.dto.Brokers; @@ -8,24 +9,25 @@ import it.pagopa.selfcare.dashboard.connector.rest.client.MsBackOfficeChannelApiClient; import it.pagopa.selfcare.dashboard.connector.rest.client.MsBackOfficeStationApiClient; import it.pagopa.selfcare.dashboard.connector.rest.model.mapper.BrokerMapper; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ClassPathResource; import org.springframework.http.ResponseEntity; +import java.io.IOException; +import java.nio.file.Files; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyInt; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -class PagoPABackOfficeConnectorImplTest { +class PagoPABackOfficeConnectorImplTest extends BaseConnectorTest { @InjectMocks private PagoPABackOfficeConnectorImpl pagoPABackOfficeConnector; @@ -39,50 +41,99 @@ class PagoPABackOfficeConnectorImplTest { @Mock private BrokerMapper brokerMapper; + @BeforeEach + public void setup() { + super.setUp(); + } + @Test - void getBrokersEC() { + void getBrokersEC() throws IOException { // given - BrokerInfo brokerInfo = new BrokerInfo(); - brokerInfo.setCode("code"); - brokerInfo.setDescription("description"); + ClassPathResource resource = new ClassPathResource("stubs/BrokerInfo.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + BrokerInfo brokerInfo = objectMapper.readValue(resourceStream, new TypeReference<>() {}); Brokers brokersResource = new Brokers(); + + Broker broker = new Broker(); + broker.setBrokerCode("code"); + broker.setDescription("description"); + brokersResource.setBrokers(List.of(new Broker().brokerCode("code").description("description"))); ResponseEntity response = ResponseEntity.ok(brokersResource); // when - when(brokerMapper.fromBrokerResource(any())).thenReturn(brokerInfo); - when(backOfficeStationApiClient._getBrokers(anyInt(), any(), anyInt(), any(), any(), any(), any())) + when(brokerMapper.fromBrokerResource(broker)).thenReturn(brokerInfo); + when(backOfficeStationApiClient._getBrokers(1, null, 1000, null, null, null, "ASC")) .thenReturn(response); + + List brokers = pagoPABackOfficeConnector.getBrokersEC(1, 1000); // then assertNotNull(brokers); assertEquals(1, brokers.size()); - assertEquals(brokers.get(0).getDescription(), brokerInfo.getDescription()); - assertEquals(brokers.get(0).getCode(), brokerInfo.getCode()); + assertEquals(brokers.get(0), brokerInfo); verifyNoMoreInteractions(backOfficeStationApiClient); } @Test - void getBrokersPSP() { + void getBrokersPSP() throws IOException { // given - BrokerInfo brokerInfo = new BrokerInfo(); - brokerInfo.setCode("code"); - brokerInfo.setDescription("description"); + ClassPathResource resource = new ClassPathResource("stubs/BrokerInfo.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + BrokerInfo brokerInfo = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + BrokerPsp innerResource = new BrokerPsp().brokerPspCode("code").description("description"); BrokersPsp brokersResource = new BrokersPsp(); brokersResource.setBrokersPsp(List.of(innerResource)); ResponseEntity response = ResponseEntity.ok(brokersResource); - when(brokerMapper.fromBrokerPSPResource(any())).thenReturn(brokerInfo); - when(backOfficeChannelApiClient._getBrokersPsp(anyInt(), any(), anyInt(), any(), any(), any(), any())) + + BrokerPsp brokerPsp = new BrokerPsp().brokerPspCode("code").description("description"); + + when(brokerMapper.fromBrokerPSPResource(brokerPsp)).thenReturn(brokerInfo); + when(backOfficeChannelApiClient._getBrokersPsp(1, null, 1000, null, null, null, "ASC")) .thenReturn(response); // when List brokers = pagoPABackOfficeConnector.getBrokersPSP(1, 1000); // then assertNotNull(brokers); assertEquals(1, brokers.size()); - assertEquals(brokers.get(0).getDescription(), innerResource.getDescription()); + assertEquals(brokers.get(0), brokerInfo); verifyNoMoreInteractions(backOfficeChannelApiClient); } + @Test + void testGetBrokersEC_NullResponse() { + // given + ResponseEntity response = ResponseEntity.ok(null); + when(backOfficeStationApiClient._getBrokers(1, null, 1000, null, null, null, "ASC")) + .thenReturn(response); + + // when + List brokers = pagoPABackOfficeConnector.getBrokersEC(1, 1000); + + // then + assertNotNull(brokers); + assertTrue(brokers.isEmpty()); + verifyNoMoreInteractions(backOfficeStationApiClient, brokerMapper); + } + + @Test + void testGetBrokersPSP_EmptyResponse() { + // given + BrokersPsp brokersResource = new BrokersPsp(); + ResponseEntity response = ResponseEntity.ok(brokersResource); + when(backOfficeChannelApiClient._getBrokersPsp(1, null, 1000, null, null, null, "ASC")) + .thenReturn(response); + + // when + List brokers = pagoPABackOfficeConnector.getBrokersPSP(1, 1000); + + // then + assertNotNull(brokers); + assertTrue(brokers.isEmpty()); + verifyNoMoreInteractions(backOfficeChannelApiClient, brokerMapper); + } + } \ No newline at end of file diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/ProductConnectorImplTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/ProductConnectorImplTest.java index c594b2e08..7c97f0fcc 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/ProductConnectorImplTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/ProductConnectorImplTest.java @@ -1,84 +1,167 @@ package it.pagopa.selfcare.dashboard.connector.rest; +import com.fasterxml.jackson.core.type.TypeReference; import it.pagopa.selfcare.dashboard.connector.model.product.ProductTree; import it.pagopa.selfcare.dashboard.connector.model.product.mapper.ProductMapper; +import it.pagopa.selfcare.onboarding.common.PartyRole; import it.pagopa.selfcare.product.entity.Product; -import it.pagopa.selfcare.product.entity.ProductStatus; +import it.pagopa.selfcare.product.entity.ProductRoleInfo; import it.pagopa.selfcare.product.service.ProductService; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ClassPathResource; +import java.io.IOException; +import java.nio.file.Files; import java.util.List; +import java.util.Map; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.mockito.Mockito.*; -@ContextConfiguration(classes = {ProductConnectorImpl.class}) -@ExtendWith(SpringExtension.class) -class ProductConnectorImplTest { - @Autowired +@ExtendWith(MockitoExtension.class) +class ProductConnectorImplTest extends BaseConnectorTest { + + @InjectMocks private ProductConnectorImpl productConnectorImpl; - @MockBean + @Spy private ProductMapper productMapper; + @Mock + private ProductService productServiceMock; + @BeforeEach + public void setUp() { + super.setUp(); + } + + @Test + void GetProductById() throws IOException { + + String productId = "123"; + + ClassPathResource resource = new ClassPathResource("stubs/Product.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + Product product = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + when(productServiceMock.getProduct(productId)).thenReturn(product); + + Product result = productConnectorImpl.getProduct(productId); + Assertions.assertEquals(product, result); + Mockito.verify(productServiceMock, times(1)).getProduct(productId); + } + + @Test + void getProductByIdWithoutProductId() { + + Assertions.assertThrows(IllegalArgumentException.class, () -> productConnectorImpl.getProduct(null)); + verify(productServiceMock, never()).getProduct(null); + } + + @Test + void GetProductByIdWithEmptyProduct() { + + String productId = "123"; + when(productServiceMock.getProduct(productId)).thenReturn(null); + Product result = productConnectorImpl.getProduct(productId); + assertNull(result); + Mockito.verify(productServiceMock, times(1)).getProduct(productId); + } + - @MockBean - private ProductService productService; + @Test + void getProductsWithProductEmpty() { + + when(productServiceMock.getProducts(false, true)).thenReturn(null); + List result = productConnectorImpl.getProducts(); + assertNull(result); + verify(productServiceMock, times(1)).getProducts(false, true); + } @Test - void testGetProductById() { - Product product = dummyProduct(); - when(productService.getProduct(any())).thenReturn(product); - assertSame(product, productConnectorImpl.getProduct("42")); - verify(productService).getProduct(any()); + void GetProducts() throws IOException { + + ClassPathResource resource = new ClassPathResource("stubs/ProductList.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + List product = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + when(productServiceMock.getProducts(false, true)).thenReturn(product); + + List result = productConnectorImpl.getProducts(); + Assertions.assertEquals(product, result); + Mockito.verify(productServiceMock, times(1)).getProducts(false, true); } @Test - void testGetProducts() { - Product product = dummyProduct(); - when(productService.getProducts(anyBoolean(),anyBoolean())).thenReturn(List.of(product)); - assertSame(product, productConnectorImpl.getProducts().get(0)); - verify(productService).getProducts(anyBoolean(),anyBoolean()); + void getProductRoleMappingsWithoutProductId() { + + Assertions.assertThrows(IllegalArgumentException.class, () -> productConnectorImpl.getProductRoleMappings(null)); + verify(productServiceMock, never()).getProduct(null); } @Test - void testGetProductRoleMappings() { - Product product = dummyProduct(); - when(productService.getProduct(any())).thenReturn(product); - assertSame(product.getRoleMappings(), productConnectorImpl.getProductRoleMappings("42")); - verify(productService).getProduct(any()); + void getProductRoleMappingsWithEmptyProduct() { + + String productId = "123"; + when(productServiceMock.getProduct(productId)).thenReturn(null); + Map result = productConnectorImpl.getProductRoleMappings(productId); + assertNull(result); + Mockito.verify(productServiceMock, times(1)).getProduct(productId); } @Test - void testGetProductRoleMappings_noProduct() { - when(productService.getProduct(any())).thenReturn(null); - assertSame(null, productConnectorImpl.getProductRoleMappings("42")); - verify(productService).getProduct(any()); + void testGetProductRoleMappings() throws IOException { + + String productId = "123"; + + ClassPathResource resource = new ClassPathResource("stubs/Product.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + Product product = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + when(productServiceMock.getProduct(productId)).thenReturn(product); + Map result = productConnectorImpl.getProductRoleMappings(productId); + Assertions.assertEquals(product.getRoleMappings(), result); + Mockito.verify(productServiceMock, times(1)).getProduct(productId); } @Test - void getProductsTree() { - Product product = dummyProduct(); - when(productService.getProducts(anyBoolean(),anyBoolean())).thenReturn(List.of(product)); - when(productMapper.toTreeResource(List.of(product))).thenReturn(List.of(new ProductTree())); - productConnectorImpl.getProductsTree(); - verify(productService).getProducts(anyBoolean(),anyBoolean()); - verify(productMapper).toTreeResource(anyList()); + void getProductsTreeWithEmptyProduct() { + + when(productServiceMock.getProducts(false, true)).thenReturn(null); + List result = productConnectorImpl.getProductsTree(); + assertNull(result); + verify(productServiceMock, times(1)).getProducts(false, true); } - private Product dummyProduct(){ - Product product = new Product(); - product.setContractTemplatePath("Contract Template Path"); - product.setContractTemplateVersion("1.0.2"); - product.setId("42"); - product.setParentId("42"); - product.setRoleMappings(null); - product.setStatus(ProductStatus.ACTIVE); - product.setTitle("Dr"); - return product; + + @Test + void getProductsTree() throws IOException { + + ClassPathResource resource = new ClassPathResource("stubs/ProductList.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + List product = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + ClassPathResource productTreeResource = new ClassPathResource("stubs/ProductTree.json"); + byte[] productTreeStream = Files.readAllBytes(productTreeResource.getFile().toPath()); + List productTrees = objectMapper.readValue(productTreeStream, new TypeReference<>() { + }); + + when(productServiceMock.getProducts(anyBoolean(), anyBoolean())).thenReturn(product); + when(productMapper.toTreeResource(product)).thenReturn(productTrees); + + List result = productConnectorImpl.getProductsTree(); + assertSame(productTrees, result); + verify(productServiceMock, times(1)).getProducts(false, true); } } diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java index e32a67cb7..48503f117 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserConnectorImplTest.java @@ -1,6 +1,6 @@ package it.pagopa.selfcare.dashboard.connector.rest; -import it.pagopa.selfcare.commons.base.security.SelfCareAuthority; +import com.fasterxml.jackson.core.type.TypeReference; import it.pagopa.selfcare.dashboard.connector.exception.ResourceNotFoundException; import it.pagopa.selfcare.dashboard.connector.model.institution.Institution; import it.pagopa.selfcare.dashboard.connector.model.institution.InstitutionBase; @@ -20,101 +20,75 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.function.Executable; -import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.test.context.ContextConfiguration; +import wiremock.com.github.jknack.handlebars.internal.lang3.StringUtils; +import java.io.IOException; +import java.nio.file.Files; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; import java.util.List; -import static it.pagopa.selfcare.commons.utils.TestUtils.mockInstance; import static it.pagopa.selfcare.dashboard.connector.model.institution.RelationshipState.*; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; @ExtendWith(MockitoExtension.class) -@ContextConfiguration(classes = {UserConnectorImpl.class, InstitutionMapperImpl.class, UserMapper.class}) -class UserConnectorImplTest { +class UserConnectorImplTest extends BaseConnectorTest { @Mock - UserApiRestClient userApiRestClient; + private UserApiRestClient userApiRestClient; @Mock - UserPermissionRestClient userPermissionRestClient; + private UserPermissionRestClient userPermissionRestClient; @Mock - UserInstitutionApiRestClient userInstitutionApiRestClient; + private UserInstitutionApiRestClient userInstitutionApiRestClient; + @InjectMocks + protected UserConnectorImpl userConnector; - UserConnectorImpl userConnector; + @Spy + private UserMapper userMapper = new UserMapperImpl(); @Spy - UserMapper userMapper = new UserMapperImpl(); + private InstitutionMapperImpl institutionMapper = new InstitutionMapperImpl(); @BeforeEach - void setup() { - userConnector = new UserConnectorImpl(userApiRestClient, userInstitutionApiRestClient, userPermissionRestClient, new InstitutionMapperImpl(), userMapper); + public void setUp() { + super.setUp(); } - @Test void getUserProductsNotFound() { - when(userApiRestClient._usersUserIdInstitutionsGet("userID", null, + String userId = "userId"; + when(userApiRestClient._usersUserIdInstitutionsGet(userId, null, List.of(ACTIVE.name(), PENDING.name(), TOBEVALIDATED.name()))).thenThrow(ResourceNotFoundException.class); - Assertions.assertThrows(ResourceNotFoundException.class, () -> userConnector.getUserInstitutions("userID")); + Assertions.assertThrows(ResourceNotFoundException.class, () -> userConnector.getUserInstitutions(userId)); } @Test - void getUserProductsFound() { - UserInfoResponse userProductsResponse = getUserProductsResponse(); - when(userApiRestClient._usersUserIdInstitutionsGet("userID", null, - List.of(ACTIVE.name(), PENDING.name(), TOBEVALIDATED.name()))).thenReturn(ResponseEntity.ok(userProductsResponse)); - List result = userConnector.getUserInstitutions("userID"); - Assertions.assertEquals(4, result.size()); - Assertions.assertEquals(ACTIVE.name(), result.get(0).getStatus()); - Assertions.assertEquals("a", result.get(0).getName()); - Assertions.assertEquals("b", result.get(1).getName()); - Assertions.assertEquals("c", result.get(2).getName()); - Assertions.assertNull(result.get(3).getName()); - } + void getUserProductsFound() throws IOException { + String userId = "userId"; - private static UserInfoResponse getUserProductsResponse() { - UserInfoResponse userProductsResponse = new UserInfoResponse(); - userProductsResponse.setUserId("userId"); - UserInstitutionRoleResponse institutionProducts = new UserInstitutionRoleResponse(); - institutionProducts.setInstitutionId("institutionId"); - institutionProducts.setInstitutionName("c"); - institutionProducts.setStatus(OnboardedProductState.ACTIVE); - institutionProducts.setRole(PartyRole.MANAGER); - - UserInstitutionRoleResponse institutionProducts2 = new UserInstitutionRoleResponse(); - institutionProducts2.setInstitutionId("institutionId2"); - institutionProducts2.setInstitutionName("b"); - institutionProducts2.setStatus(OnboardedProductState.ACTIVE); - institutionProducts2.setRole(PartyRole.MANAGER); - - UserInstitutionRoleResponse institutionProducts4 = new UserInstitutionRoleResponse(); - institutionProducts4.setInstitutionId("institutionId3"); - institutionProducts4.setStatus(OnboardedProductState.ACTIVE); - institutionProducts4.setRole(PartyRole.MANAGER); - - UserInstitutionRoleResponse institutionProducts3 = new UserInstitutionRoleResponse(); - institutionProducts3.setInstitutionId("institutionId3"); - institutionProducts3.setInstitutionName("a"); - institutionProducts3.setStatus(OnboardedProductState.ACTIVE); - institutionProducts3.setRole(PartyRole.MANAGER); - - - userProductsResponse.setInstitutions(List.of(institutionProducts, institutionProducts2, institutionProducts4, institutionProducts3)); - return userProductsResponse; + ClassPathResource resource = new ClassPathResource("stubs/UserInfoResponse.json"); + String expectedResource = StringUtils.deleteWhitespace(new String(Files.readAllBytes(resource.getFile().toPath()))); + UserInfoResponse userInfoResponse = objectMapper.readValue(expectedResource, new TypeReference<>() {}); + when(userApiRestClient._usersUserIdInstitutionsGet(userId, null, + List.of(ACTIVE.name(), PENDING.name(), TOBEVALIDATED.name()))) + .thenReturn(ResponseEntity.ok(userInfoResponse)); + List result = userConnector.getUserInstitutions(userId); + assertNotNull(result); + assertEquals(result.get(0), institutionMapper.toInstitutionBase(userInfoResponse.getInstitutions().get(0))); + verify(userApiRestClient, times(1))._usersUserIdInstitutionsGet(userId, null, + List.of(ACTIVE.name(), PENDING.name(), TOBEVALIDATED.name())); } @Test @@ -168,40 +142,70 @@ void delete() { } @Test - void getUserById() { + void getUserById() throws IOException{ + String userId = "123e4567-e89b-12d3-a456-426614174000"; + String institutionId = "institutionId"; + String field = "field"; + List fields = List.of(field); - //given - final String userId = "userId"; - final String institutionId = "institutionId"; - final List fields = List.of("fields"); - UserDetailResponse userDetailResponse = mockInstance(new UserDetailResponse()); - when(userApiRestClient._usersIdDetailsGet(anyString(), anyString(), anyString())).thenReturn(new ResponseEntity<>(userDetailResponse, HttpStatus.OK)); - //when - User user = userConnector.getUserById(userId, institutionId, fields); - //then - assertNotNull(user); - verify(userApiRestClient, times(1))._usersIdDetailsGet(userId, fields.get(0), institutionId); + ClassPathResource resource = new ClassPathResource("stubs/UserDetailResponse.json"); + UserDetailResponse userDetailResponse = objectMapper.readValue(Files.readAllBytes(resource.getFile().toPath()), new TypeReference<>() { + }); + + ClassPathResource resourceResponse = new ClassPathResource("stubs/User.json"); + User user = objectMapper.readValue(Files.readAllBytes(resourceResponse.getFile().toPath()), new TypeReference<>() { + }); + + when(userApiRestClient._usersIdDetailsGet(userId, field, institutionId)).thenReturn(ResponseEntity.ok(userDetailResponse)); + when(userMapper.toUser(userDetailResponse)).thenReturn(user); + + User result = userConnector.getUserById(userId, institutionId, fields); + assertEquals(user,result); + assertNotNull(result); + verify(userApiRestClient, times(1))._usersIdDetailsGet(userId, field, institutionId); } + @Test + void getUserByIdEmptyUser() throws IOException{ + String userId = "123e4567-e89b-12d3-a456-426614174000"; + String institutionId = "institutionId"; + List fields = Collections.emptyList(); + + ClassPathResource resource = new ClassPathResource("stubs/UserDetailResponse.json"); + UserDetailResponse userDetailResponse = objectMapper.readValue(Files.readAllBytes(resource.getFile().toPath()), new TypeReference<>() { + }); + when(userApiRestClient._usersIdDetailsGet(userId, null, institutionId)).thenReturn(ResponseEntity.ok(userDetailResponse)); + when(userMapper.toUser(userDetailResponse)).thenReturn(null); + + User result = userConnector.getUserById(userId, institutionId, fields); + assertNull(result); + verify(userApiRestClient, times(1))._usersIdDetailsGet(userId, null, institutionId); + } @Test - void verifyUserExist_UserExists() { + void verifyUserExist_UserExists() throws IOException { String userId = "userId"; String institutionId = "institutionId"; String productId = "productId"; - when(userInstitutionApiRestClient._institutionsInstitutionIdUserInstitutionsGet(eq(institutionId), eq(null), eq(List.of(productId)), eq(null), anyList(), eq(userId))).thenReturn(ResponseEntity.ok(List.of(new UserInstitutionResponse()))); + ClassPathResource resource = new ClassPathResource("stubs/UserInstitutionResponse2.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserInstitutionResponse userInstitutionResponse = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + when(userInstitutionApiRestClient._institutionsInstitutionIdUserInstitutionsGet(institutionId, null, List.of(productId), null, List.of(ACTIVE.name(), PENDING.name(), TOBEVALIDATED.name(), SUSPENDED.name()), userId)).thenReturn(ResponseEntity.ok(List.of(userInstitutionResponse))); List response = userConnector.retrieveFilteredUser(userId, institutionId, productId); - assertEquals(1, response.size()); + assertEquals(institutionMapper.toInstitution(userInstitutionResponse), response.get(0)); verify(userInstitutionApiRestClient, times(1))._institutionsInstitutionIdUserInstitutionsGet(eq(institutionId), eq(null), eq(List.of(productId)), eq(null), anyList(), eq(userId)); } @Test - void verifyUserExist_UserDoesNotExist() { + void verifyUserExist_UserDoesNotExist() throws IOException { String userId = "userId"; String institutionId = "institutionId"; String productId = "productId"; - when(userInstitutionApiRestClient._institutionsInstitutionIdUserInstitutionsGet(eq(institutionId), eq(null), eq(List.of(productId)), eq(null), anyList(), eq(userId))) + ClassPathResource resource = new ClassPathResource("stubs/UserInstitutionResponse2.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserInstitutionResponse userInstitutionResponse = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + when(userInstitutionApiRestClient._institutionsInstitutionIdUserInstitutionsGet(institutionId, null, List.of(productId), null, List.of(ACTIVE.name(), PENDING.name(), TOBEVALIDATED.name(), SUSPENDED.name()), userId)) .thenReturn(ResponseEntity.ok(Collections.emptyList())); List response = userConnector.retrieveFilteredUser(userId, institutionId, productId); @@ -211,22 +215,44 @@ void verifyUserExist_UserDoesNotExist() { } @Test - void search() { - //given + void search() throws IOException { String fiscalCode = "fiscalCode"; - final String institutionId = "institutionId"; - UserDetailResponse userDetailResponse = mockInstance(new UserDetailResponse()); - when(userApiRestClient._usersSearchPost(any(), any())).thenReturn(new ResponseEntity<>(userDetailResponse, HttpStatus.OK)); - //when - User user = userConnector.searchByFiscalCode(fiscalCode, institutionId); - //then - assertNotNull(user); - ArgumentCaptor searchUserDtoArgumentCaptor = ArgumentCaptor.forClass(SearchUserDto.class); - verify(userApiRestClient, times(1))._usersSearchPost(eq(institutionId), searchUserDtoArgumentCaptor.capture()); - SearchUserDto captured = searchUserDtoArgumentCaptor.getValue(); - assertEquals(fiscalCode, captured.getFiscalCode()); + String institutionId = "institutionId"; + SearchUserDto searchUserDto = new SearchUserDto(fiscalCode); + + ClassPathResource resource = new ClassPathResource("stubs/UserDetailResponse.json"); + UserDetailResponse userDetailResponse = objectMapper.readValue(Files.readAllBytes(resource.getFile().toPath()), new TypeReference<>() { + }); + + ClassPathResource resourceResponse = new ClassPathResource("stubs/User.json"); + User user = objectMapper.readValue(Files.readAllBytes(resourceResponse.getFile().toPath()), new TypeReference<>() { + }); + + when(userApiRestClient._usersSearchPost(institutionId,searchUserDto)).thenReturn(ResponseEntity.ok(userDetailResponse)); + when(userMapper.toUser(userDetailResponse)).thenReturn(user); + + User result = userConnector.searchByFiscalCode(fiscalCode, institutionId); + + assertNotNull(result); + assertEquals(user, result); } + @Test + void searchEmptyUser() throws IOException { + String institutionId = "institutionId"; + SearchUserDto searchUserDto = new SearchUserDto(); + + ClassPathResource resource = new ClassPathResource("stubs/UserDetailResponse.json"); + UserDetailResponse userDetailResponse = objectMapper.readValue(Files.readAllBytes(resource.getFile().toPath()), new TypeReference<>() { + }); + + + when(userApiRestClient._usersSearchPost(institutionId,searchUserDto)).thenReturn(ResponseEntity.ok(userDetailResponse)); + when(userMapper.toUser(userDetailResponse)).thenReturn(null); + + User result = userConnector.searchByFiscalCode(null, institutionId); + assertNull(result); + } @Test void hasPermissionTrue() { //given @@ -270,16 +296,16 @@ void update() { } @Test - void getUsers_emptyList() { + void getUsers_emptyList() throws IOException { // given String institutionId = "institutionId"; String loggedUserId = "loggedUserId"; - UserInfo.UserInfoFilter userInfoFilter = new UserInfo.UserInfoFilter(); - userInfoFilter.setAllowedStates(List.of(ACTIVE, SUSPENDED)); - userInfoFilter.setRole(SelfCareAuthority.ADMIN); + ClassPathResource resourceFilter = new ClassPathResource("stubs/UserInfoFilter.json"); + UserInfo.UserInfoFilter userInfoFilter = objectMapper.readValue(Files.readAllBytes(resourceFilter.getFile().toPath()), new TypeReference<>() { + }); - when(userApiRestClient._usersUserIdInstitutionInstitutionIdGet(eq(institutionId), eq(loggedUserId), eq(null), eq(null), eq(null), eq(List.of("MANAGER", "DELEGATE", "SUB_DELEGATE")), eq(List.of("ACTIVE", "SUSPENDED")))) + when(userApiRestClient._usersUserIdInstitutionInstitutionIdGet(institutionId, loggedUserId, userInfoFilter.getUserId(), userInfoFilter.getProductRoles(), List.of(userInfoFilter.getProductId()), List.of("MANAGER", "DELEGATE", "SUB_DELEGATE"), List.of("ACTIVE", "SUSPENDED"))) .thenReturn(ResponseEntity.ok(Collections.emptyList())); // when @@ -287,88 +313,89 @@ void getUsers_emptyList() { // then assertTrue(result.isEmpty()); - verify(userApiRestClient, times(1))._usersUserIdInstitutionInstitutionIdGet(eq(institutionId), eq(loggedUserId), eq(null), eq(null), eq(null), eq(List.of("MANAGER", "DELEGATE", "SUB_DELEGATE")), eq(List.of("ACTIVE", "SUSPENDED"))); - verifyNoMoreInteractions(userApiRestClient); } @Test - void getUsers_notEmpty() { + void getUsers_notEmpty() throws IOException { // given String institutionId = "institutionId"; String loggedUserId = "loggedUserId"; - UserInfo.UserInfoFilter userInfoFilter = new UserInfo.UserInfoFilter(); - when(userApiRestClient._usersUserIdInstitutionInstitutionIdGet(institutionId, loggedUserId, null, null, null, null, null)) - .thenReturn(ResponseEntity.ok(List.of(UserDataResponse.builder().userId("userId").build()))); + ClassPathResource resourceFilter = new ClassPathResource("stubs/UserInfoFilter.json"); + UserInfo.UserInfoFilter userInfoFilter = objectMapper.readValue(Files.readAllBytes(resourceFilter.getFile().toPath()), new TypeReference<>() {}); + + // Simulate response from API by reading from a JSON file + ClassPathResource resourceResponse = new ClassPathResource("stubs/UserDataResponse.json"); + byte[] responseData = Files.readAllBytes(resourceResponse.getFile().toPath()); + List userDataResponseList = objectMapper.readValue(responseData, new TypeReference<>() {}); - when(userMapper.toUserInfo(any())).thenReturn(new UserInfo()); + when(userApiRestClient._usersUserIdInstitutionInstitutionIdGet(institutionId, loggedUserId, userInfoFilter.getUserId(), userInfoFilter.getProductRoles(), List.of(userInfoFilter.getProductId()), List.of("MANAGER", "DELEGATE", "SUB_DELEGATE"), List.of("ACTIVE", "SUSPENDED"))) + .thenReturn(ResponseEntity.ok(userDataResponseList)); // when Collection result = userConnector.getUsers(institutionId, userInfoFilter, loggedUserId); // then assertEquals(1, result.size()); - verify(userApiRestClient, times(1))._usersUserIdInstitutionInstitutionIdGet(institutionId, loggedUserId, null, null, null, null, null); - verifyNoMoreInteractions(userApiRestClient); + UserInfo actualUserInfo = result.iterator().next(); + assertEquals(userMapper.toUserInfo(userDataResponseList.get(0)), actualUserInfo); } @Test - void getProducts_returnsUserInstitution() { - // given + void getProducts_returnsUserInstitution() throws IOException{ String institutionId = "institutionId"; String userId = "userId"; - UserInstitutionResponse userInstitutionResponse = new UserInstitutionResponse(); + + + ClassPathResource resource = new ClassPathResource("stubs/UserInstitutionResponse.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserInstitutionResponse userInstitutions = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + when(userInstitutionApiRestClient._institutionsInstitutionIdUserInstitutionsGet( - eq(institutionId), - any(), - any(), - any(), - any(), - eq(userId) - )).thenReturn(ResponseEntity.ok(List.of(userInstitutionResponse))); + institutionId, + null, + null, + null, + null, + userId + )).thenReturn(ResponseEntity.ok(List.of(userInstitutions))); - // when UserInstitution result = userConnector.getProducts(institutionId, userId); + //Todo aggiungere expectedResponse - // then assertNotNull(result); verify(userInstitutionApiRestClient, times(1))._institutionsInstitutionIdUserInstitutionsGet(institutionId, null, null, null, null, userId); } @Test void getProducts_throwsResourceNotFoundException() { - // given String institutionId = "institutionId"; String userId = "userId"; when(userInstitutionApiRestClient._institutionsInstitutionIdUserInstitutionsGet( - eq(institutionId), - any(), - any(), - any(), - any(), - eq(userId) + institutionId, + null, + null, + null, + null, + userId )).thenReturn(ResponseEntity.ok(Collections.emptyList())); - // when Executable executable = () -> userConnector.getProducts(institutionId, userId); - // then assertThrows(ResourceNotFoundException.class, executable); verify(userInstitutionApiRestClient, times(1))._institutionsInstitutionIdUserInstitutionsGet(institutionId, null, null, null, null, userId); } @Test - void testCreateOrUpdateUserByFiscalCode() { + void testCreateOrUpdateUserByFiscalCode() throws IOException { // Arrange when(userApiRestClient._usersPost(Mockito.any())) .thenReturn(ResponseEntity.ok("userId")); - UserToCreate userDto = new UserToCreate(); - userDto.setName("Name"); - userDto.setProductRoles(new HashSet<>()); - userDto.setSurname("Doe"); - userDto.setTaxCode("Tax Code"); - userDto.setEmail("jane.doe@example.org"); + ClassPathResource resource = new ClassPathResource("stubs/UserToCreate.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserToCreate userDto = objectMapper.readValue(resourceStream, new TypeReference<>() {}); CreateUserDto.Role role = new CreateUserDto.Role(); role.setPartyRole(it.pagopa.selfcare.onboarding.common.PartyRole.MANAGER); @@ -380,25 +407,134 @@ void testCreateOrUpdateUserByFiscalCode() { RootParentResponse response = new RootParentResponse(); response.setDescription("rootDescription"); - Institution institution = new Institution(); - institution.setId("id"); - institution.setDescription("description"); + ClassPathResource institutionResource = new ClassPathResource("stubs/Institution.json"); + byte[] institutionResourceStream = Files.readAllBytes(institutionResource.getFile().toPath()); + Institution institution = objectMapper.readValue(institutionResourceStream, new TypeReference<>() {}); + institution.setRootParent(response); // Act - userConnector.createOrUpdateUserByFiscalCode(institution, "productId", userDto, List.of(role, role2)); + String userId = userConnector.createOrUpdateUserByFiscalCode(institution, "productId", userDto, List.of(role, role2)); // Assert that nothing has changed verify(userApiRestClient)._usersPost(Mockito.any()); - assertEquals("Doe", userDto.getSurname()); - assertEquals("Name", userDto.getName()); - assertEquals("Tax Code", userDto.getTaxCode()); - assertEquals("jane.doe@example.org", userDto.getEmail()); + assertEquals("userId", userId); } @Test - void testCreateOrUpdateUserByUserId() { + void testCreateOrUpdateUserByFiscalCode_withNullRoles() throws IOException { // Arrange - when(userApiRestClient._usersUserIdPost(eq("userId"), any())) + ClassPathResource resource = new ClassPathResource("stubs/UserToCreate.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserToCreate userDto = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + RootParentResponse response = new RootParentResponse(); + response.setDescription("rootDescription"); + ClassPathResource institutionResource = new ClassPathResource("stubs/Institution.json"); + byte[] institutionResourceStream = Files.readAllBytes(institutionResource.getFile().toPath()); + Institution institution = objectMapper.readValue(institutionResourceStream, new TypeReference<>() {}); + + institution.setRootParent(response); + + // Act & Assert + Exception exception = assertThrows(IllegalArgumentException.class, () -> userConnector.createOrUpdateUserByFiscalCode(institution, "productId", userDto, null)); + + assertEquals("Role list cannot be empty", exception.getMessage()); + } + + @Test + void testCreateOrUpdateUserByFiscalCode_withEmptyRoles() throws IOException { + // Arrange + ClassPathResource resource = new ClassPathResource("stubs/UserToCreate.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserToCreate userDto = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + RootParentResponse response = new RootParentResponse(); + response.setDescription("rootDescription"); + ClassPathResource institutionResource = new ClassPathResource("stubs/Institution.json"); + byte[] institutionResourceStream = Files.readAllBytes(institutionResource.getFile().toPath()); + Institution institution = objectMapper.readValue(institutionResourceStream, new TypeReference<>() {}); + + institution.setRootParent(response); + + // Act & Assert + Exception exception = assertThrows(IllegalArgumentException.class, () -> userConnector.createOrUpdateUserByFiscalCode(institution, "productId", userDto, Collections.emptyList())); + + assertEquals("Role list cannot be empty", exception.getMessage()); + } + + @Test + void testCreateOrUpdateUserByFiscalCode_withApiResponseNull() throws IOException { + // Arrange + ClassPathResource userDtoResource = new ClassPathResource("stubs/CreateUserDto.json"); + byte[] userDtoResourceStream = Files.readAllBytes(userDtoResource.getFile().toPath()); + it.pagopa.selfcare.user.generated.openapi.v1.dto.CreateUserDto createUserDto = objectMapper.readValue(userDtoResourceStream, new TypeReference<>() {}); + when(userApiRestClient._usersPost(createUserDto)) + .thenReturn(ResponseEntity.ok(null)); + + ClassPathResource resource = new ClassPathResource("stubs/UserToCreate.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserToCreate userDto = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + CreateUserDto.Role role = new CreateUserDto.Role(); + role.setPartyRole(it.pagopa.selfcare.onboarding.common.PartyRole.MANAGER); + role.setProductRole("admin"); + + RootParentResponse response = new RootParentResponse(); + response.setDescription("rootDescription"); + ClassPathResource institutionResource = new ClassPathResource("stubs/Institution.json"); + byte[] institutionResourceStream = Files.readAllBytes(institutionResource.getFile().toPath()); + Institution institution = objectMapper.readValue(institutionResourceStream, new TypeReference<>() {}); + + institution.setRootParent(response); + + // Act + String userId = userConnector.createOrUpdateUserByFiscalCode(institution, "productId", userDto, List.of(role)); + + // Assert that nothing has changed + verify(userApiRestClient)._usersPost(createUserDto); + assertNull(userId); + } + + @Test + void testCreateOrUpdateUserByFiscalCode_withApiResponseEmpty() throws IOException { + // Arrange + ClassPathResource userDtoResource = new ClassPathResource("stubs/CreateUserDto.json"); + byte[] userDtoResourceStream = Files.readAllBytes(userDtoResource.getFile().toPath()); + it.pagopa.selfcare.user.generated.openapi.v1.dto.CreateUserDto createUserDto = objectMapper.readValue(userDtoResourceStream, new TypeReference<>() {}); + when(userApiRestClient._usersPost(createUserDto)) + .thenReturn(ResponseEntity.ok("")); + + ClassPathResource resource = new ClassPathResource("stubs/UserToCreate.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserToCreate userDto = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + + CreateUserDto.Role role = new CreateUserDto.Role(); + role.setPartyRole(it.pagopa.selfcare.onboarding.common.PartyRole.MANAGER); + role.setProductRole("admin"); + + RootParentResponse response = new RootParentResponse(); + response.setDescription("rootDescription"); + ClassPathResource institutionResource = new ClassPathResource("stubs/Institution.json"); + byte[] institutionResourceStream = Files.readAllBytes(institutionResource.getFile().toPath()); + Institution institution = objectMapper.readValue(institutionResourceStream, new TypeReference<>() {}); + + institution.setRootParent(response); + + // Act + String userId = userConnector.createOrUpdateUserByFiscalCode(institution, "productId", userDto, List.of(role)); + + // Assert that nothing has changed + verify(userApiRestClient)._usersPost(createUserDto); + assertEquals("", userId); + } + @Test + void testCreateOrUpdateUserByUserId() throws IOException { + ClassPathResource userRoleResource = new ClassPathResource("stubs/AddUserRoleDto.json"); + byte[] userRoleResourceStream = Files.readAllBytes(userRoleResource.getFile().toPath()); + AddUserRoleDto addUserRoleDto = objectMapper.readValue(userRoleResourceStream, new TypeReference<>() {}); + + // Arrange + when(userApiRestClient._usersUserIdPost("userId", addUserRoleDto)) .thenReturn(ResponseEntity.ok().build()); CreateUserDto.Role role = new CreateUserDto.Role(); @@ -407,39 +543,45 @@ void testCreateOrUpdateUserByUserId() { RootParentResponse response = new RootParentResponse(); response.setDescription("rootDescription"); - Institution institution = new Institution(); - institution.setId("id"); - institution.setDescription("description"); + + ClassPathResource resource = new ClassPathResource("stubs/Institution.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + Institution institution = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + institution.setRootParent(response); // Act userConnector.createOrUpdateUserByUserId(institution, "productId", "userId", List.of(role)); // Assert that nothing has changed - verify(userApiRestClient)._usersUserIdPost(eq("userId"), any()); + verify(userApiRestClient)._usersUserIdPost("userId", addUserRoleDto); } + @Test - public void retrieveFilteredUserInstitutionReturnsUserInstitutions() { + void retrieveFilteredUserInstitutionReturnsUserInstitutions() throws IOException { // Given String institutionId = "institutionId"; UserInfo.UserInfoFilter userInfoFilter = new UserInfo.UserInfoFilter(); userInfoFilter.setAllowedStates(List.of(ACTIVE, SUSPENDED)); userInfoFilter.setProductId("productId"); - List userInstitutionResponses = List.of(new UserInstitutionResponse(), new UserInstitutionResponse()); + ClassPathResource resource = new ClassPathResource("stubs/UserInstitutionResponse.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserInstitutionResponse userInstitutionResponse = objectMapper.readValue(resourceStream, new TypeReference<>() {}); + when(userInstitutionApiRestClient._institutionsInstitutionIdUserInstitutionsGet(institutionId, null, List.of(userInfoFilter.getProductId()), null, userInfoFilter.getAllowedStates().stream().map(Enum::name).toList(), null)) - .thenReturn(ResponseEntity.ok(userInstitutionResponses)); + .thenReturn(ResponseEntity.ok(List.of(userInstitutionResponse))); // When List result = userConnector.retrieveFilteredUserInstitution(institutionId, userInfoFilter); // Then - assertEquals(userInstitutionResponses.size(), result.size()); + assertEquals(userInstitutionResponse.getUserId(), result.get(0)); } @Test - public void retrieveFilteredUserInstitutionReturnsEmptyListWhenNoUserInstitutions() { + void retrieveFilteredUserInstitutionReturnsEmptyListWhenNoUserInstitutions() { // Given String institutionId = "institutionId"; UserInfo.UserInfoFilter userInfoFilter = new UserInfo.UserInfoFilter(); diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserGroupConnectorImplTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserGroupConnectorImplTest.java index db97dccb5..a178756fc 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserGroupConnectorImplTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserGroupConnectorImplTest.java @@ -1,19 +1,24 @@ package it.pagopa.selfcare.dashboard.connector.rest; +import com.fasterxml.jackson.core.type.TypeReference; import it.pagopa.selfcare.dashboard.connector.model.groups.*; -import it.pagopa.selfcare.dashboard.connector.model.user.UserInfo; import it.pagopa.selfcare.dashboard.connector.rest.client.UserGroupRestClient; import it.pagopa.selfcare.dashboard.connector.rest.model.user_group.CreateUserGroupRequestDto; import it.pagopa.selfcare.dashboard.connector.rest.model.user_group.UpdateUserGroupRequestDto; import it.pagopa.selfcare.dashboard.connector.rest.model.user_group.UserGroupResponse; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.function.Executable; import org.mockito.*; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ClassPathResource; import org.springframework.data.domain.*; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.time.Instant; import java.util.List; import java.util.Optional; @@ -23,7 +28,6 @@ import static it.pagopa.selfcare.dashboard.connector.rest.UserGroupConnectorImpl.REQUIRED_GROUP_ID_MESSAGE; import static java.util.Collections.emptyList; import static java.util.UUID.randomUUID; -import static java.util.stream.Collectors.toList; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -31,7 +35,7 @@ @ExtendWith(MockitoExtension.class) -class UserGroupConnectorImplTest { +class UserGroupConnectorImplTest extends BaseConnectorTest { @Mock private UserGroupRestClient restClientMock; @@ -45,51 +49,54 @@ class UserGroupConnectorImplTest { @Captor private ArgumentCaptor updateRequestCaptor; + @BeforeEach + public void setUp() { + super.setUp(); + } + @Test void createGroup_nullGroup() { - //given - CreateUserGroup userGroup = null; - //when - Executable executable = () -> groupConnector.createUserGroup(userGroup); - //then + + Executable executable = () -> groupConnector.createUserGroup(null); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("A User Group is required", e.getMessage()); Mockito.verifyNoInteractions(restClientMock); } @Test - void createGroup() { - //given - CreateUserGroup userGroup = mockInstance(new CreateUserGroup()); - userGroup.setMembers(List.of("string1", "string2")); - UserGroupResponse response = mockInstance(new UserGroupResponse()); - when(restClientMock.createUserGroup(any())) - .thenReturn(response); - //when + void createGroup() throws IOException { + + ClassPathResource resource = new ClassPathResource("stubs/createUserGroup.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + CreateUserGroup userGroup = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + ClassPathResource resourceRequest = new ClassPathResource("stubs/createUserGroupRequest.json"); + byte[] resourceStreamRequest = Files.readAllBytes(resourceRequest.getFile().toPath()); + CreateUserGroupRequestDto userGroupRequest = objectMapper.readValue(resourceStreamRequest, new TypeReference<>() { + }); + + ClassPathResource ResponseResource = new ClassPathResource("stubs/userGroupResponse.json"); + byte[] responseStream = Files.readAllBytes(ResponseResource.getFile().toPath()); + UserGroupResponse response = objectMapper.readValue(responseStream, new TypeReference<>() { + }); + + when(restClientMock.createUserGroup(userGroupRequest)).thenReturn(response); String groupId = groupConnector.createUserGroup(userGroup); - //then - verify(restClientMock, times(1)) - .createUserGroup(requestDtoArgumentCaptor.capture()); - CreateUserGroupRequestDto request = requestDtoArgumentCaptor.getValue(); - assertEquals(userGroup.getName(), request.getName()); - assertEquals(userGroup.getDescription(), request.getDescription()); - assertEquals(userGroup.getMembers(), request.getMembers()); - assertEquals(userGroup.getInstitutionId(), request.getInstitutionId()); - assertEquals(userGroup.getProductId(), request.getProductId()); - assertEquals(UserGroupStatus.ACTIVE, request.getStatus()); - assertEquals(response.getId(), groupId); - verifyNoMoreInteractions(restClientMock); + assertEquals(response.getId(), groupId); + Mockito.verify(restClientMock, times(1)) + .createUserGroup(requestDtoArgumentCaptor.capture()); } @Test void updateGroup_nullGroup() { - //given + String groupId = "groupId"; - UpdateUserGroup userGroup = null; - //when - Executable executable = () -> groupConnector.updateUserGroup(groupId, userGroup); - //then + + Executable executable = () -> groupConnector.updateUserGroup(groupId, null); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("A User Group is required", e.getMessage()); Mockito.verifyNoInteractions(restClientMock); @@ -97,13 +104,12 @@ void updateGroup_nullGroup() { @Test void updateGroup_nullId() { - //given - String groupId = null; + UpdateUserGroup userGroup = mockInstance(new UpdateUserGroup()); userGroup.setMembers(List.of("string1", "string2")); - //when - Executable executable = () -> groupConnector.updateUserGroup(groupId, userGroup); - //then + + Executable executable = () -> groupConnector.updateUserGroup(null, userGroup); + IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GROUP_ID_MESSAGE, e.getMessage()); Mockito.verifyNoInteractions(restClientMock); @@ -111,13 +117,13 @@ void updateGroup_nullId() { @Test void updateGroup() { - //given + String groupId = "groupId"; UpdateUserGroup userGroup = mockInstance(new UpdateUserGroup()); userGroup.setMembers(List.of("string1", "string2")); - //when + Executable executable = () -> groupConnector.updateUserGroup(groupId, userGroup); - //then + assertDoesNotThrow(executable); verify(restClientMock, times(1)) .updateUserGroupById(any(), updateRequestCaptor.capture()); @@ -142,10 +148,8 @@ void delete() { @Test void delete_nullGroupId() { - //given - String groupId = null; //when - Executable executable = () -> groupConnector.delete(groupId); + Executable executable = () -> groupConnector.delete(null); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GROUP_ID_MESSAGE, e.getMessage()); @@ -166,10 +170,8 @@ void activate() { @Test void activate_nullGroupId() { - //given - String groupId = null; //when - Executable executable = () -> groupConnector.activate(groupId); + Executable executable = () -> groupConnector.activate(null); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GROUP_ID_MESSAGE, e.getMessage()); @@ -190,10 +192,8 @@ void suspend() { @Test void suspend_nullGroupId() { - //given - String groupId = null; //when - Executable executable = () -> groupConnector.suspend(groupId); + Executable executable = () -> groupConnector.suspend(null); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GROUP_ID_MESSAGE, e.getMessage()); @@ -201,69 +201,55 @@ void suspend_nullGroupId() { } @Test - void getUserGroupById() { - //given + void getUserGroupById() throws IOException { + String id = "id"; - UserGroupResponse response = mockInstance(new UserGroupResponse(), "setMembers"); - response.setMembers(List.of(randomUUID().toString(), randomUUID().toString())); - response.setCreatedAt(Instant.now()); - response.setModifiedAt(Instant.now()); - when(restClientMock.getUserGroupById(anyString())) - .thenReturn(response); - //when + + ClassPathResource resource = new ClassPathResource("stubs/userGroupResponseSingle.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserGroupResponse expectedResponse = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + ClassPathResource resourceResponse = new ClassPathResource("stubs/userGroupInfoGetUserGroupByIdSingle.json"); + byte[] resourceStreamResponse = Files.readAllBytes(resourceResponse.getFile().toPath()); + UserGroupInfo expectedGroupInfoResponse = objectMapper.readValue(resourceStreamResponse, new TypeReference<>() { + }); + + when(restClientMock.getUserGroupById(anyString())).thenReturn(expectedResponse); + UserGroupInfo groupInfo = groupConnector.getUserGroupById(id); - //then - assertEquals(response.getId(), groupInfo.getId()); - assertEquals(response.getInstitutionId(), groupInfo.getInstitutionId()); - assertEquals(response.getProductId(), groupInfo.getProductId()); - assertEquals(response.getStatus(), groupInfo.getStatus()); - assertEquals(response.getDescription(), groupInfo.getDescription()); - assertEquals(response.getName(), groupInfo.getName()); - assertEquals(response.getMembers(), groupInfo.getMembers().stream().map(UserInfo::getId).collect(toList())); - assertEquals(response.getCreatedAt(), groupInfo.getCreatedAt()); - assertEquals(response.getCreatedBy(), groupInfo.getCreatedBy().getId()); - assertEquals(response.getModifiedAt(), groupInfo.getModifiedAt()); - assertEquals(response.getModifiedBy(), groupInfo.getModifiedBy().getId()); - verify(restClientMock, times(1)) - .getUserGroupById(anyString()); + assertEquals(expectedGroupInfoResponse, groupInfo); + + verify(restClientMock, times(1)).getUserGroupById(anyString()); verifyNoMoreInteractions(restClientMock); } @Test - void getUserGroupById_nullModifiedBy() { - //given + void getUserGroupById_nullModifiedBy() throws IOException { + String id = "id"; - UserGroupResponse response = mockInstance(new UserGroupResponse(), "setMembers", "setModifiedBy"); - response.setMembers(List.of(randomUUID().toString(), randomUUID().toString())); - response.setCreatedAt(Instant.now()); - response.setModifiedAt(Instant.now()); - when(restClientMock.getUserGroupById(anyString())) - .thenReturn(response); - //when + + ClassPathResource resource = new ClassPathResource("stubs/userGroupResponseNullModifiedBy.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserGroupResponse expectedResponse = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + ClassPathResource resourceResponse = new ClassPathResource("stubs/userGroupInfoNullModifiedBy.json"); + byte[] resourceStreamResponse = Files.readAllBytes(resourceResponse.getFile().toPath()); + UserGroupInfo expectedGroupInfo = objectMapper.readValue(resourceStreamResponse, new TypeReference<>() { + }); + + when(restClientMock.getUserGroupById(anyString())).thenReturn(expectedResponse); + UserGroupInfo groupInfo = groupConnector.getUserGroupById(id); - //then - assertEquals(response.getId(), groupInfo.getId()); - assertEquals(response.getInstitutionId(), groupInfo.getInstitutionId()); - assertEquals(response.getProductId(), groupInfo.getProductId()); - assertEquals(response.getStatus(), groupInfo.getStatus()); - assertEquals(response.getDescription(), groupInfo.getDescription()); - assertEquals(response.getName(), groupInfo.getName()); - assertEquals(response.getMembers(), groupInfo.getMembers().stream().map(UserInfo::getId).collect(toList())); - assertEquals(response.getCreatedAt(), groupInfo.getCreatedAt()); - assertEquals(response.getCreatedBy(), groupInfo.getCreatedBy().getId()); - assertEquals(response.getModifiedAt(), groupInfo.getModifiedAt()); - assertNull(groupInfo.getModifiedBy()); - verify(restClientMock, times(1)) - .getUserGroupById(anyString()); - verifyNoMoreInteractions(restClientMock); + assertEquals(expectedGroupInfo, groupInfo); + verify(restClientMock, times(1)).getUserGroupById(anyString()); } @Test void getUserGroupById_nullId() { - //given - String id = null; //when - Executable executable = () -> groupConnector.getUserGroupById(id); + Executable executable = () -> groupConnector.getUserGroupById(null); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GROUP_ID_MESSAGE, e.getMessage()); @@ -287,11 +273,9 @@ void addMemberToUserGroup() { @Test void addMemberToUserGroup_nullId() { - //given - String groupId = null; UUID userId = randomUUID(); //when - Executable executable = () -> groupConnector.addMemberToUserGroup(groupId, userId); + Executable executable = () -> groupConnector.addMemberToUserGroup(null, userId); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GROUP_ID_MESSAGE, e.getMessage()); @@ -302,9 +286,8 @@ void addMemberToUserGroup_nullId() { void addMemberToUserGroup_nullUserId() { //given String groupId = "groupId"; - UUID userId = null; //when - Executable executable = () -> groupConnector.addMemberToUserGroup(groupId, userId); + Executable executable = () -> groupConnector.addMemberToUserGroup(groupId, null); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("A userId is required", e.getMessage()); @@ -327,11 +310,9 @@ void deleteMemberFromUserGroup() { @Test void deleteMemberFromUserGroup_nullId() { - //given - String groupId = null; UUID userId = randomUUID(); //when - Executable executable = () -> groupConnector.deleteMemberFromUserGroup(groupId, userId); + Executable executable = () -> groupConnector.deleteMemberFromUserGroup(null, userId); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals(REQUIRED_GROUP_ID_MESSAGE, e.getMessage()); @@ -342,9 +323,8 @@ void deleteMemberFromUserGroup_nullId() { void deleteMemberFromUserGroup_nullUserId() { //given String groupId = "groupId"; - UUID userId = null; //when - Executable executable = () -> groupConnector.deleteMemberFromUserGroup(groupId, userId); + Executable executable = () -> groupConnector.deleteMemberFromUserGroup(groupId, null); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("A userId is required", e.getMessage()); @@ -352,8 +332,8 @@ void deleteMemberFromUserGroup_nullUserId() { } @Test - void getUserGroups() { - //given + void getUserGroups() throws IOException { + // Given Optional institutionId = Optional.of("institutionId"); Optional productId = Optional.of("productId"); Optional userId = Optional.of(randomUUID()); @@ -362,31 +342,39 @@ void getUserGroups() { filter.setProductId(productId); filter.setUserId(userId); Pageable pageable = PageRequest.of(0, 1, Sort.by("name")); - UserGroupResponse response1 = mockInstance(new UserGroupResponse(), "setMembers"); - response1.setMembers(List.of(randomUUID().toString(), randomUUID().toString())); - response1.setCreatedAt(Instant.now()); - response1.setModifiedAt(Instant.now()); - when(restClientMock.getUserGroups(anyString(), anyString(), any(), any(), any())) - .thenAnswer(invocation -> getPage(List.of(response1), invocation.getArgument(4, Pageable.class), () -> 1L)); - //when + + ClassPathResource resource = new ClassPathResource("stubs/userGroupInfoGetUserGroups.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + UserGroupInfo userGroupInfo = objectMapper.readValue(resourceStream, new TypeReference<>() { + }); + + ClassPathResource ResponseResource = new ClassPathResource("stubs/userGroupResponse.json"); + byte[] responseStream = Files.readAllBytes(ResponseResource.getFile().toPath()); + UserGroupResponse response = objectMapper.readValue(responseStream, new TypeReference<>() { + }); + + + when(restClientMock.getUserGroups(filter.getInstitutionId().orElse(null), + filter.getProductId().orElse(null), + filter.getUserId().orElse(null), + List.of(UserGroupStatus.ACTIVE, UserGroupStatus.SUSPENDED), + pageable)) + .thenReturn(new PageImpl<>(List.of(response))); + Page groupInfos = groupConnector.getUserGroups(filter, pageable); - //then - assertNotNull(groupInfos); - assertNotNull(groupInfos.getContent()); - assertEquals(1, groupInfos.getContent().size()); - UserGroupInfo groupInfo = groupInfos.iterator().next(); - assertEquals(response1.getId(), groupInfo.getId()); - assertEquals(response1.getInstitutionId(), groupInfo.getInstitutionId()); - assertEquals(response1.getProductId(), groupInfo.getProductId()); - assertEquals(response1.getStatus(), groupInfo.getStatus()); - assertEquals(response1.getDescription(), groupInfo.getDescription()); - assertEquals(response1.getName(), groupInfo.getName()); - assertEquals(response1.getMembers(), groupInfo.getMembers().stream().map(UserInfo::getId).collect(toList())); - assertEquals(response1.getCreatedAt(), groupInfo.getCreatedAt()); - assertEquals(response1.getCreatedBy(), groupInfo.getCreatedBy().getId()); - assertEquals(response1.getModifiedAt(), groupInfo.getModifiedAt()); - assertEquals(response1.getModifiedBy(), groupInfo.getModifiedBy().getId()); - verifyNoMoreInteractions(restClientMock); + + assertEquals(1, groupInfos.getTotalElements()); + assertEquals(userGroupInfo, groupInfos.getContent().get(0)); + Mockito.verify(restClientMock, times(1)) + .getUserGroups(filter.getInstitutionId().orElse(null), + filter.getProductId().orElse(null), + filter.getUserId().orElse(null), + List.of(UserGroupStatus.ACTIVE, UserGroupStatus.SUSPENDED), + pageable); + + UserGroupInfo actualUserGroupInfo = groupInfos.getContent().get(0); + assertEquals(userGroupInfo, actualUserGroupInfo); + } @Test @@ -405,7 +393,7 @@ void getUserGroups_nullResponse_emptyInstitutionId_emptyProductId_emptyUserId_un } @Test - void getUserGroups_notEmptyInstitutionId_notEmptyProductId() { + void getUserGroups_notEmptyInstitutionId_notEmptyProductId() throws IOException { //given Optional institutionId = Optional.of("institutionId"); Optional productId = Optional.of("productId"); @@ -414,65 +402,51 @@ void getUserGroups_notEmptyInstitutionId_notEmptyProductId() { filter.setProductId(productId); Pageable pageable = Pageable.unpaged(); UserGroupResponse response1 = mockInstance(new UserGroupResponse(), "setMembers"); - response1.setMembers(List.of(randomUUID().toString(), randomUUID().toString())); - response1.setCreatedAt(Instant.now()); - response1.setModifiedAt(Instant.now()); + response1.setMembers(List.of("123", "321")); + response1.setCreatedAt(Instant.MAX); + response1.setModifiedAt(Instant.MAX); when(restClientMock.getUserGroups(anyString(), anyString(), any(), any(), any())) .thenAnswer(invocation -> getPage(List.of(response1), invocation.getArgument(4, Pageable.class), () -> 1L)); //when Page groupInfos = groupConnector.getUserGroups(filter, pageable); + + ClassPathResource resource = new ClassPathResource("stubs/getUserGroups_notEmptyInstitutionId_notEmptyProductId_notEmptyUserId.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + String expectedUserGroupInfoJson = new String(resourceStream, StandardCharsets.UTF_8); + + UserGroupInfo expectedUserGroupInfo = objectMapper.readValue(expectedUserGroupInfoJson, UserGroupInfo.class); + //then - assertNotNull(groupInfos); - assertNotNull(groupInfos.getContent()); - assertEquals(1, groupInfos.getContent().size()); - UserGroupInfo groupInfo = groupInfos.iterator().next(); - assertEquals(response1.getId(), groupInfo.getId()); - assertEquals(response1.getInstitutionId(), groupInfo.getInstitutionId()); - assertEquals(response1.getProductId(), groupInfo.getProductId()); - assertEquals(response1.getStatus(), groupInfo.getStatus()); - assertEquals(response1.getDescription(), groupInfo.getDescription()); - assertEquals(response1.getName(), groupInfo.getName()); - assertEquals(response1.getMembers(), groupInfo.getMembers().stream().map(UserInfo::getId).collect(toList())); - assertEquals(response1.getCreatedAt(), groupInfo.getCreatedAt()); - assertEquals(response1.getCreatedBy(), groupInfo.getCreatedBy().getId()); - assertEquals(response1.getModifiedAt(), groupInfo.getModifiedAt()); - assertEquals(response1.getModifiedBy(), groupInfo.getModifiedBy().getId()); + assertEquals(groupInfos.getContent().get(0), expectedUserGroupInfo); verify(restClientMock, times(1)) .getUserGroups(eq(institutionId.get()), eq(productId.get()), isNull(), eq(List.of(UserGroupStatus.ACTIVE, UserGroupStatus.SUSPENDED)), isNotNull()); verifyNoMoreInteractions(restClientMock); } @Test - void getUserGroups_notEmptyUserId() { + void getUserGroups_notEmptyUserId() throws IOException { //given Optional userId = Optional.of(randomUUID()); UserGroupFilter filter = new UserGroupFilter(); filter.setUserId(userId); Pageable pageable = Pageable.unpaged(); UserGroupResponse response1 = mockInstance(new UserGroupResponse(), "setMembers"); - response1.setMembers(List.of(randomUUID().toString(), randomUUID().toString())); - response1.setCreatedAt(Instant.now()); - response1.setModifiedAt(Instant.now()); + response1.setMembers(List.of("123", "321")); + response1.setCreatedAt(Instant.MAX); + response1.setModifiedAt(Instant.MAX); when(restClientMock.getUserGroups(any(), any(), any(), anyList(), any())) .thenAnswer(invocation -> getPage(List.of(response1), invocation.getArgument(4, Pageable.class), () -> 1L)); //when Page groupInfos = groupConnector.getUserGroups(filter, pageable); //then - assertNotNull(groupInfos); - assertNotNull(groupInfos.getContent()); - assertEquals(1, groupInfos.getContent().size()); - UserGroupInfo groupInfo = groupInfos.iterator().next(); - assertEquals(response1.getId(), groupInfo.getId()); - assertEquals(response1.getInstitutionId(), groupInfo.getInstitutionId()); - assertEquals(response1.getProductId(), groupInfo.getProductId()); - assertEquals(response1.getStatus(), groupInfo.getStatus()); - assertEquals(response1.getDescription(), groupInfo.getDescription()); - assertEquals(response1.getName(), groupInfo.getName()); - assertEquals(response1.getMembers(), groupInfo.getMembers().stream().map(UserInfo::getId).collect(toList())); - assertEquals(response1.getCreatedAt(), groupInfo.getCreatedAt()); - assertEquals(response1.getCreatedBy(), groupInfo.getCreatedBy().getId()); - assertEquals(response1.getModifiedAt(), groupInfo.getModifiedAt()); - assertEquals(response1.getModifiedBy(), groupInfo.getModifiedBy().getId()); + + ClassPathResource resource = new ClassPathResource("stubs/getUserGroups_notEmptyInstitutionId_notEmptyProductId_notEmptyUserId.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + String expectedUserGroupInfoJson = new String(resourceStream, StandardCharsets.UTF_8); + + UserGroupInfo expectedUserGroupInfo = objectMapper.readValue(expectedUserGroupInfoJson, UserGroupInfo.class); + assertEquals(groupInfos.getContent().get(0), expectedUserGroupInfo); + verify(restClientMock, times(1)) .getUserGroups(isNull(), isNull(), eq(userId.get()), eq(List.of(UserGroupStatus.ACTIVE, UserGroupStatus.SUSPENDED)), isNotNull()); verifyNoMoreInteractions(restClientMock); @@ -492,50 +466,43 @@ void getUserGroups_nullGroupInfos() { assertNotNull(groupInfos); assertTrue(groupInfos.isEmpty()); verify(restClientMock, times(1)) - .getUserGroups(isNull(), isNull(), isNull(),eq(List.of(UserGroupStatus.ACTIVE, UserGroupStatus.SUSPENDED)), isNotNull()); + .getUserGroups(isNull(), isNull(), isNull(), eq(List.of(UserGroupStatus.ACTIVE, UserGroupStatus.SUSPENDED)), isNotNull()); verifyNoMoreInteractions(restClientMock); } @Test - void groupResponse_toGroupInfo() { + void groupResponse_toGroupInfo() throws IOException { //given UserGroupResponse response1 = mockInstance(new UserGroupResponse(), "setMembers"); - response1.setMembers(List.of(randomUUID().toString(), randomUUID().toString())); - response1.setCreatedAt(Instant.now()); - response1.setModifiedAt(Instant.now()); + response1.setMembers(List.of("123", "321")); + response1.setCreatedAt(Instant.MAX); + response1.setModifiedAt(Instant.MAX); //when UserGroupInfo groupInfo = UserGroupConnectorImpl.GROUP_RESPONSE_TO_GROUP_INFO.apply(response1); //then - assertEquals(response1.getId(), groupInfo.getId()); - assertEquals(response1.getInstitutionId(), groupInfo.getInstitutionId()); - assertEquals(response1.getProductId(), groupInfo.getProductId()); - assertEquals(response1.getStatus(), groupInfo.getStatus()); - assertEquals(response1.getDescription(), groupInfo.getDescription()); - assertEquals(response1.getName(), groupInfo.getName()); - assertEquals(response1.getMembers(), groupInfo.getMembers().stream().map(UserInfo::getId).collect(toList())); - assertEquals(response1.getCreatedAt(), groupInfo.getCreatedAt()); - assertEquals(response1.getCreatedBy(), groupInfo.getCreatedBy().getId()); - assertEquals(response1.getModifiedAt(), groupInfo.getModifiedAt()); - assertEquals(response1.getModifiedBy(), groupInfo.getModifiedBy().getId()); + ClassPathResource resource = new ClassPathResource("stubs/groupResponse_toGroupInfo.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + String expectedUserGroupInfoJson = new String(resourceStream, StandardCharsets.UTF_8); + + UserGroupInfo expectedUserGroupInfo = objectMapper.readValue(expectedUserGroupInfoJson, UserGroupInfo.class); + assertEquals(groupInfo, expectedUserGroupInfo); } @Test - void groupResponse_toGroupInfo_nullMembers() { + void groupResponse_toGroupInfo_nullMembers() throws IOException { //given UserGroupResponse response1 = mockInstance(new UserGroupResponse(), "setMembers"); + response1.setCreatedAt(Instant.MAX); + response1.setModifiedAt(Instant.MAX); //when UserGroupInfo groupInfo = UserGroupConnectorImpl.GROUP_RESPONSE_TO_GROUP_INFO.apply(response1); //then - assertEquals(response1.getId(), groupInfo.getId()); - assertEquals(response1.getInstitutionId(), groupInfo.getInstitutionId()); - assertEquals(response1.getProductId(), groupInfo.getProductId()); - assertEquals(response1.getStatus(), groupInfo.getStatus()); - assertEquals(response1.getDescription(), groupInfo.getDescription()); - assertEquals(response1.getName(), groupInfo.getName()); - assertEquals(response1.getCreatedAt(), groupInfo.getCreatedAt()); - assertEquals(response1.getCreatedBy(), groupInfo.getCreatedBy().getId()); - assertEquals(response1.getModifiedAt(), groupInfo.getModifiedAt()); - assertEquals(response1.getModifiedBy(), groupInfo.getModifiedBy().getId()); + ClassPathResource resource = new ClassPathResource("stubs/groupResponse_toGroupInfo_nullMembers.json"); + byte[] resourceStream = Files.readAllBytes(resource.getFile().toPath()); + String expectedUserGroupInfoJson = new String(resourceStream, StandardCharsets.UTF_8); + + UserGroupInfo expectedUserGroupInfo = objectMapper.readValue(expectedUserGroupInfoJson, UserGroupInfo.class); + assertEquals(groupInfo, expectedUserGroupInfo); } @Test @@ -559,11 +526,10 @@ void deleteMembers() { @Test void deleteMembers_institutionId() { //given - String institutionId = null; String productId = "productId"; UUID memberId = randomUUID(); //when - Executable executable = () -> groupConnector.deleteMembers(memberId.toString(), institutionId, productId); + Executable executable = () -> groupConnector.deleteMembers(memberId.toString(), null, productId); //when IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); Assertions.assertEquals("Required institutionId", e.getMessage()); diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserRegistryConnectorImplTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserRegistryConnectorImplTest.java index 30d00f3ab..db8511aa0 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserRegistryConnectorImplTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/UserRegistryConnectorImplTest.java @@ -1,40 +1,46 @@ package it.pagopa.selfcare.dashboard.connector.rest; +import com.fasterxml.jackson.core.type.TypeReference; import it.pagopa.selfcare.commons.utils.TestUtils; -import it.pagopa.selfcare.dashboard.connector.model.user.*; +import it.pagopa.selfcare.dashboard.connector.model.user.MutableUserFieldsDto; +import it.pagopa.selfcare.dashboard.connector.model.user.SaveUserDto; +import it.pagopa.selfcare.dashboard.connector.model.user.User; +import it.pagopa.selfcare.dashboard.connector.model.user.UserId; import it.pagopa.selfcare.dashboard.connector.rest.client.UserRegistryRestClient; import it.pagopa.selfcare.dashboard.connector.rest.model.user_registry.EmbeddedExternalId; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.function.Executable; import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.core.io.ClassPathResource; +import java.io.IOException; +import java.nio.file.Files; import java.util.EnumSet; import java.util.HashMap; -import java.util.Map; import java.util.UUID; -import static it.pagopa.selfcare.dashboard.connector.model.user.Certification.NONE; -import static it.pagopa.selfcare.dashboard.connector.model.user.Certification.SPID; import static org.junit.jupiter.api.Assertions.*; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, - classes = { - UserRegistryConnectorImpl.class - } -) -class UserRegistryConnectorImplTest { +@ExtendWith(MockitoExtension.class) +class UserRegistryConnectorImplTest extends BaseConnectorTest { - - @Autowired + @InjectMocks private UserRegistryConnectorImpl userConnector; - @MockBean + @Mock private UserRegistryRestClient restClientMock; + @BeforeEach + public void setUp() { + super.setUp(); + } + @Test void search_nullInfo() { //given @@ -46,18 +52,9 @@ void search_nullInfo() { //when User user = userConnector.search(externalId, fieldList); ///then - assertNull(user.getName()); - assertNull(user.getFamilyName()); - assertNull(user.getEmail()); - assertNull(user.getId()); - assertNull(user.getWorkContacts()); - assertNull(user.getFiscalCode()); - ArgumentCaptor embeddedCaptor = ArgumentCaptor.forClass(EmbeddedExternalId.class); + assertEquals(user, userMock); Mockito.verify(restClientMock, Mockito.times(1)) - .search(embeddedCaptor.capture(), Mockito.eq(EnumSet.allOf(User.Fields.class))); - EmbeddedExternalId externalIdCaptured = embeddedCaptor.getValue(); - assertEquals(externalId, externalIdCaptured.getFiscalCode()); - Mockito.verifyNoMoreInteractions(restClientMock); + .search(new EmbeddedExternalId(externalId), EnumSet.allOf(User.Fields.class)); } @Test @@ -65,59 +62,43 @@ void search_nullInfo_nullUserResponse() { //given String externalId = "externalId"; final EnumSet fieldList = EnumSet.allOf(User.Fields.class); - User userMock = null; - Mockito.when(restClientMock.search(Mockito.any(), Mockito.any())) - .thenReturn(userMock); + Mockito.when(restClientMock.search(new EmbeddedExternalId(externalId), fieldList)) + .thenReturn(null); //when User user = userConnector.search(externalId, fieldList); ///then assertNull(user); - ArgumentCaptor embeddedCaptor = ArgumentCaptor.forClass(EmbeddedExternalId.class); Mockito.verify(restClientMock, Mockito.times(1)) - .search(embeddedCaptor.capture(), Mockito.eq(EnumSet.allOf(User.Fields.class))); - EmbeddedExternalId externalIdCaptured = embeddedCaptor.getValue(); - assertEquals(externalId, externalIdCaptured.getFiscalCode()); - Mockito.verifyNoMoreInteractions(restClientMock); + .search(new EmbeddedExternalId(externalId), EnumSet.allOf(User.Fields.class)); } @Test - void search_certificationNone() { + void search_certificationNone() throws IOException { //given String externalId = "externalId"; final EnumSet fieldList = EnumSet.allOf(User.Fields.class); - User userMock = TestUtils.mockInstance(new User()); - userMock.setId(UUID.randomUUID().toString()); - Map workContacts = new HashMap<>(); - workContacts.put("institutionId", TestUtils.mockInstance(new WorkContact())); - userMock.setWorkContacts(workContacts); - Mockito.when(restClientMock.search(Mockito.any(), Mockito.any())) + ClassPathResource userResource = new ClassPathResource("stubs/UserCertificationNone.json"); + byte[] userResourceStream = Files.readAllBytes(userResource.getFile().toPath()); + User userMock = objectMapper.readValue(userResourceStream, new TypeReference<>() {}); + + Mockito.when(restClientMock.search(new EmbeddedExternalId(externalId), fieldList)) .thenReturn(userMock); //when User user = userConnector.search(externalId, fieldList); ///then - assertEquals(NONE, user.getName().getCertification()); - assertEquals(NONE, user.getEmail().getCertification()); - assertEquals(NONE, user.getFamilyName().getCertification()); - user.getWorkContacts().forEach((key1, value) -> assertEquals(NONE, value.getEmail().getCertification())); - assertNotNull(user.getFiscalCode()); - - ArgumentCaptor embeddedCaptor = ArgumentCaptor.forClass(EmbeddedExternalId.class); + assertEquals(userMock,user); Mockito.verify(restClientMock, Mockito.times(1)) - .search(embeddedCaptor.capture(), Mockito.eq(EnumSet.allOf(User.Fields.class))); - EmbeddedExternalId externalIdCaptured = embeddedCaptor.getValue(); - assertEquals(externalId, externalIdCaptured.getFiscalCode()); - Mockito.verifyNoMoreInteractions(restClientMock); + .search(new EmbeddedExternalId(externalId), EnumSet.allOf(User.Fields.class)); } @Test void search_nullExternalId() { //given - String externalId = null; final EnumSet fieldList = EnumSet.allOf(User.Fields.class); //when - Executable executable = () -> userConnector.search(externalId, fieldList); + Executable executable = () -> userConnector.search(null, fieldList); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("A TaxCode is required", e.getMessage()); @@ -125,36 +106,22 @@ void search_nullExternalId() { } @Test - void search_certificationNotNone() { + void search_certificationNotNone() throws IOException { //given String externalId = "externalId"; final EnumSet fieldList = EnumSet.allOf(User.Fields.class); - User userMock = TestUtils.mockInstance(new User()); - userMock.getEmail().setCertification(Certification.SPID); - userMock.getFamilyName().setCertification(Certification.SPID); - userMock.getName().setCertification(Certification.SPID); - Map workContacts = new HashMap<>(); - WorkContact workContact = TestUtils.mockInstance(new WorkContact()); - workContact.getEmail().setCertification(Certification.SPID); - userMock.setWorkContacts(workContacts); - workContacts.put("institutionId", workContact); - Mockito.when(restClientMock.search(Mockito.any(), Mockito.any())) + ClassPathResource userResource = new ClassPathResource("stubs/UserCertificationNotNone.json"); + byte[] userResourceStream = Files.readAllBytes(userResource.getFile().toPath()); + User userMock = objectMapper.readValue(userResourceStream, new TypeReference<>() {}); + + Mockito.when(restClientMock.search(new EmbeddedExternalId(externalId), fieldList)) .thenReturn(userMock); //when User user = userConnector.search(externalId, fieldList); //then - assertEquals(SPID, user.getName().getCertification()); - assertEquals(SPID, user.getEmail().getCertification()); - assertEquals(SPID, user.getFamilyName().getCertification()); - user.getWorkContacts().forEach((key1, value) -> assertEquals(SPID, value.getEmail().getCertification())); - assertNotNull(user.getFiscalCode()); - - ArgumentCaptor embeddedCaptor = ArgumentCaptor.forClass(EmbeddedExternalId.class); + assertEquals(user, userMock); Mockito.verify(restClientMock, Mockito.times(1)) - .search(embeddedCaptor.capture(), Mockito.eq(EnumSet.allOf(User.Fields.class))); - EmbeddedExternalId externalIdCaptured = embeddedCaptor.getValue(); - assertEquals(externalId, externalIdCaptured.getFiscalCode()); - Mockito.verifyNoMoreInteractions(restClientMock); + .search(new EmbeddedExternalId(externalId), EnumSet.allOf(User.Fields.class)); } @Test @@ -163,20 +130,14 @@ void getUserByInternalId_nullInfo() { UUID userId = UUID.randomUUID(); final EnumSet fieldList = EnumSet.allOf(User.Fields.class); User userMock = new User(); - Mockito.when(restClientMock.getUserByInternalId(Mockito.any(), Mockito.any())) + Mockito.when(restClientMock.getUserByInternalId(userId, fieldList)) .thenReturn(userMock); //when User user = userConnector.getUserByInternalId(userId.toString(), fieldList); ///then - assertNull(user.getName()); - assertNull(user.getFamilyName()); - assertNull(user.getEmail()); - assertNull(user.getId()); - assertNull(user.getWorkContacts()); - assertNull(user.getFiscalCode()); + assertEquals(user, userMock); Mockito.verify(restClientMock, Mockito.times(1)) .getUserByInternalId(userId, EnumSet.allOf(User.Fields.class)); - Mockito.verifyNoMoreInteractions(restClientMock); } @Test @@ -184,56 +145,39 @@ void getUserByInternalId_nullInfo_nullUserResponse() { //given UUID userId = UUID.randomUUID(); final EnumSet fieldList = EnumSet.allOf(User.Fields.class); - User userMock = null; - Mockito.when(restClientMock.getUserByInternalId(Mockito.any(), Mockito.any())) - .thenReturn(userMock); + Mockito.when(restClientMock.getUserByInternalId(userId, fieldList)) + .thenReturn(null); //when User user = userConnector.getUserByInternalId(userId.toString(), fieldList); ///then assertNull(user); - - Mockito.verify(restClientMock, Mockito.times(1)) - .getUserByInternalId(userId, EnumSet.allOf(User.Fields.class)); - Mockito.verifyNoMoreInteractions(restClientMock); } @Test - void getUserByInternalId_certificationNone() { + void getUserByInternalId_certificationNone() throws IOException { //given - UUID userId = UUID.randomUUID(); + UUID userId = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479"); final EnumSet fieldList = EnumSet.allOf(User.Fields.class); - User userMock = TestUtils.mockInstance(new User()); - userMock.setId(userId.toString()); - Map workContacts = new HashMap<>(); - WorkContact workContact = TestUtils.mockInstance(new WorkContact()); - workContact.getEmail().setCertification(Certification.NONE); - userMock.setWorkContacts(workContacts); - workContacts.put("institutionId", workContact); - Mockito.when(restClientMock.getUserByInternalId(Mockito.any(), Mockito.any())) + ClassPathResource userResource = new ClassPathResource("stubs/UserCertificationNone.json"); + byte[] userResourceStream = Files.readAllBytes(userResource.getFile().toPath()); + User userMock = objectMapper.readValue(userResourceStream, new TypeReference<>() {}); + + Mockito.when(restClientMock.getUserByInternalId(userId, fieldList)) .thenReturn(userMock); //when User user = userConnector.getUserByInternalId(userId.toString(), fieldList); ///then - assertEquals(userId.toString(), user.getId()); - assertEquals(NONE, user.getName().getCertification()); - assertEquals(NONE, user.getEmail().getCertification()); - assertEquals(NONE, user.getFamilyName().getCertification()); - user.getWorkContacts().forEach((key1, value) -> assertEquals(NONE, value.getEmail().getCertification())); - assertNotNull(user.getFiscalCode()); - + assertEquals(user, userMock); Mockito.verify(restClientMock, Mockito.times(1)) .getUserByInternalId(userId, EnumSet.allOf(User.Fields.class)); - Mockito.verifyNoMoreInteractions(restClientMock); } @Test void getUserByInternalId_nullExternalId() { - //given - String userId = null; final EnumSet fieldList = EnumSet.allOf(User.Fields.class); //when - Executable executable = () -> userConnector.getUserByInternalId(userId, fieldList); + Executable executable = () -> userConnector.getUserByInternalId(null, fieldList); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("A userId is required", e.getMessage()); @@ -241,31 +185,21 @@ void getUserByInternalId_nullExternalId() { } @Test - void getUserByInternalId_certificationNotNone() { + void getUserByInternalId_certificationNotNone() throws IOException { //given - UUID userId = UUID.randomUUID(); + UUID userId = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479"); final EnumSet fieldList = EnumSet.allOf(User.Fields.class); - User userMock = TestUtils.mockInstance(new User()); - userMock.setId(userId.toString()); - userMock.getEmail().setCertification(Certification.SPID); - userMock.getFamilyName().setCertification(Certification.SPID); - userMock.getName().setCertification(Certification.SPID); - Map workContacts = new HashMap<>(); - WorkContact workContact = TestUtils.mockInstance(new WorkContact()); - workContact.getEmail().setCertification(Certification.SPID); - userMock.setWorkContacts(workContacts); - workContacts.put("institutionId", workContact); - Mockito.when(restClientMock.getUserByInternalId(Mockito.any(), Mockito.any())) + + ClassPathResource userResource = new ClassPathResource("stubs/UserCertificationNotNone.json"); + byte[] userResourceStream = Files.readAllBytes(userResource.getFile().toPath()); + User userMock = objectMapper.readValue(userResourceStream, new TypeReference<>() {}); + + Mockito.when(restClientMock.getUserByInternalId(userId, fieldList)) .thenReturn(userMock); //when User user = userConnector.getUserByInternalId(userId.toString(), fieldList); ///then - assertEquals(userId.toString(), user.getId()); - assertEquals(SPID, user.getName().getCertification()); - assertEquals(SPID, user.getEmail().getCertification()); - assertEquals(SPID, user.getFamilyName().getCertification()); - user.getWorkContacts().forEach((key1, value) -> assertEquals(SPID, value.getEmail().getCertification())); - assertNotNull(user.getFiscalCode()); + assertEquals(user, userMock); Mockito.verify(restClientMock, Mockito.times(1)) .getUserByInternalId(userId, EnumSet.allOf(User.Fields.class)); @@ -275,9 +209,9 @@ void getUserByInternalId_certificationNotNone() { @Test void updateUser() { //given - String institutionId = "institutionId"; UUID id = UUID.randomUUID(); - MutableUserFieldsDto userDto = TestUtils.mockInstance(new MutableUserFieldsDto(), "setWorkContacts"); + MutableUserFieldsDto userDto = new MutableUserFieldsDto(); + userDto.setWorkContacts(new HashMap<>()); //when Executable executable = () -> userConnector.updateUser(id, userDto); //then @@ -285,19 +219,16 @@ void updateUser() { ArgumentCaptor userDtoCaptor = ArgumentCaptor.forClass(MutableUserFieldsDto.class); Mockito.verify(restClientMock, Mockito.times(1)) .patchUser(Mockito.any(), userDtoCaptor.capture()); - MutableUserFieldsDto request = userDtoCaptor.getValue(); Mockito.verifyNoMoreInteractions(restClientMock); } @Test void updateUser_nullId() { - //given - UUID id = null; - MutableUserFieldsDto userDto = TestUtils.mockInstance(new MutableUserFieldsDto(), "setWorkContacts"); - + MutableUserFieldsDto userDto = new MutableUserFieldsDto(); + userDto.setWorkContacts(new HashMap<>()); //when - Executable executable = () -> userConnector.updateUser(id, userDto); + Executable executable = () -> userConnector.updateUser(null, userDto); //then IllegalArgumentException e = assertThrows(IllegalArgumentException.class, executable); assertEquals("A UUID is required", e.getMessage()); @@ -307,9 +238,10 @@ void updateUser_nullId() { @Test void saveUser() { //given - UserId id = TestUtils.mockInstance(new UserId()); - SaveUserDto saveUserDto = TestUtils.mockInstance(new SaveUserDto(), "setWorkContacts"); - Mockito.when(restClientMock.saveUser(Mockito.any())) + UserId id = new UserId(); + SaveUserDto saveUserDto = new SaveUserDto(); + saveUserDto.setWorkContacts(new HashMap<>()); + Mockito.when(restClientMock.saveUser(saveUserDto)) .thenReturn(id); //when UserId userId = userConnector.saveUser(saveUserDto); diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserGroupRestClientTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserGroupRestClientTest.java index 73ef43301..6d4aa9784 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserGroupRestClientTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserGroupRestClientTest.java @@ -67,13 +67,12 @@ public void initialize(ConfigurableApplicationContext applicationContext) { private enum TestCase { FULLY_VALUED, - FULLY_NULL, - EMPTY_RESULT + FULLY_NULL } - private static final Map testCase2igroupdMap = new EnumMap<>(UserGroupRestClientTest.TestCase.class) {{ - put(UserGroupRestClientTest.TestCase.FULLY_VALUED, "groupId1"); - put(UserGroupRestClientTest.TestCase.FULLY_NULL, "groupId2"); + private static final Map testCase2igroupdMap = new EnumMap<>(TestCase.class) {{ + put(TestCase.FULLY_VALUED, "groupId1"); + put(TestCase.FULLY_NULL, "groupId2"); }}; @Autowired private UserGroupRestClient restClient; diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserRegistryRestClientTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserRegistryRestClientTest.java index fddeae4dc..038c3f545 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserRegistryRestClientTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/client/UserRegistryRestClientTest.java @@ -78,9 +78,8 @@ void userUpdate() { void getUserByInternalId_nullFieldList() { //given UUID userId = UUID.fromString("3fa85f64-5717-4562-b3fc-2c963f66afa6"); - final EnumSet fieldList = null; //when - final Executable executable = () -> restClient.getUserByInternalId(userId, fieldList); + final Executable executable = () -> restClient.getUserByInternalId(userId, null); //then final FeignException.NotFound e = assertThrows(FeignException.NotFound.class, executable); assertTrue(e.getMessage().contains("Request was not matched")); diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/decoder/FeignErrorDecoderTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/decoder/FeignErrorDecoderTest.java index dba8c6d5d..c16ab7310 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/decoder/FeignErrorDecoderTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/decoder/FeignErrorDecoderTest.java @@ -19,10 +19,10 @@ class FeignErrorDecoderTest { FeignErrorDecoder feignDecoder = new FeignErrorDecoder(); - private Map> headers = new LinkedHashMap<>(); + private final Map> headers = new LinkedHashMap<>(); @Test - void testDecodeToResourceNotFound() throws Throwable { + void testDecodeToResourceNotFound() { //given Response response = Response.builder() .status(404) @@ -38,7 +38,7 @@ void testDecodeToResourceNotFound() throws Throwable { } @Test - void testDecodeToBadGateway() throws Throwable { + void testDecodeToBadGateway() { //given Response response = Response.builder() .status(500) diff --git a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/interceptor/BackOfficeAuthorizationInterceptorTest.java b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/interceptor/BackOfficeAuthorizationInterceptorTest.java index ae3e7f42a..ea2536df7 100644 --- a/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/interceptor/BackOfficeAuthorizationInterceptorTest.java +++ b/connector/rest/src/test/java/it/pagopa/selfcare/dashboard/connector/rest/interceptor/BackOfficeAuthorizationInterceptorTest.java @@ -8,6 +8,7 @@ import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -53,6 +54,6 @@ void applySubKey() { // then Map> headers = requestTemplate.headers(); - assertEquals(Arrays.asList("1"), headers.get("Ocp-Apim-Subscription-Key")); + assertEquals(List.of("1"), headers.get("Ocp-Apim-Subscription-Key")); } } diff --git a/connector/rest/src/test/resources/stubs/AddUserRoleDto.json b/connector/rest/src/test/resources/stubs/AddUserRoleDto.json new file mode 100644 index 000000000..3430c33b4 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/AddUserRoleDto.json @@ -0,0 +1,13 @@ +{ + "institutionId": "123e4567-e89b-12d3-a456-426614174000", + "product": { + "productId": "productId", + "role": "MANAGER", + "tokenId": null, + "productRoles": ["admin"] + }, + "institutionDescription": "description", + "institutionRootName": "rootDescription", + "userMailUuid": null, + "hasToSendEmail": null +} diff --git a/connector/rest/src/test/resources/stubs/BrokerInfo.json b/connector/rest/src/test/resources/stubs/BrokerInfo.json new file mode 100644 index 000000000..73372a97a --- /dev/null +++ b/connector/rest/src/test/resources/stubs/BrokerInfo.json @@ -0,0 +1,6 @@ +{ + "code": "taxCode", + "description": "description", + "enabled": null, + "extendedFaultBean": null +} diff --git a/connector/rest/src/test/resources/stubs/BrokerResponse.json b/connector/rest/src/test/resources/stubs/BrokerResponse.json new file mode 100644 index 000000000..682446bba --- /dev/null +++ b/connector/rest/src/test/resources/stubs/BrokerResponse.json @@ -0,0 +1,6 @@ +{ + "description": "description", + "id": null, + "numberOfDelegations": null, + "taxCode": "taxCode" +} diff --git a/connector/rest/src/test/resources/stubs/ConnectorDelegationRequest.json b/connector/rest/src/test/resources/stubs/ConnectorDelegationRequest.json new file mode 100644 index 000000000..63a15a2c6 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/ConnectorDelegationRequest.json @@ -0,0 +1,9 @@ +{ + "id": "id", + "from": null, + "to": null, + "productId": null, + "institutionFromName": null, + "institutionToName": null, + "type": null +} diff --git a/connector/rest/src/test/resources/stubs/ConnectorDelegationRequest_idNull.json b/connector/rest/src/test/resources/stubs/ConnectorDelegationRequest_idNull.json new file mode 100644 index 000000000..bed36e119 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/ConnectorDelegationRequest_idNull.json @@ -0,0 +1,9 @@ +{ + "id": null, + "from": null, + "to": null, + "productId": null, + "institutionFromName": null, + "institutionToName": null, + "type": null +} diff --git a/connector/rest/src/test/resources/stubs/CreateUserDto.json b/connector/rest/src/test/resources/stubs/CreateUserDto.json new file mode 100644 index 000000000..162d3f09d --- /dev/null +++ b/connector/rest/src/test/resources/stubs/CreateUserDto.json @@ -0,0 +1,19 @@ +{ + "institutionId": "123e4567-e89b-12d3-a456-426614174000", + "user": { + "birthDate": null, + "familyName": "Doe", + "name": "Name", + "fiscalCode": "Tax Code", + "institutionEmail": "jane.doe@example.org" + }, + "product": { + "productId": "productId", + "role": "MANAGER", + "tokenId": null, + "productRoles": ["admin"] + }, + "institutionDescription": "description", + "institutionRootName": "rootDescription", + "hasToSendEmail": null +} diff --git a/connector/rest/src/test/resources/stubs/DelegationRequest.json b/connector/rest/src/test/resources/stubs/DelegationRequest.json new file mode 100644 index 000000000..90d3bef17 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/DelegationRequest.json @@ -0,0 +1,8 @@ +{ + "from": null, + "institutionFromName": null, + "institutionToName": null, + "productId": null, + "to": null, + "type": null +} diff --git a/connector/rest/src/test/resources/stubs/DelegationResponse.json b/connector/rest/src/test/resources/stubs/DelegationResponse.json new file mode 100644 index 000000000..77a6159f2 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/DelegationResponse.json @@ -0,0 +1,17 @@ +{ + "brokerId": null, + "brokerName": null, + "brokerTaxCode": null, + "brokerType": null, + "createdAt": null, + "id": "id", + "institutionId": null, + "institutionName": null, + "institutionRootName": null, + "institutionType": null, + "productId": null, + "status": null, + "taxCode": null, + "type": null, + "updatedAt": null +} diff --git a/connector/rest/src/test/resources/stubs/DelegationResponse_idNull.json b/connector/rest/src/test/resources/stubs/DelegationResponse_idNull.json new file mode 100644 index 000000000..f094a3653 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/DelegationResponse_idNull.json @@ -0,0 +1,17 @@ +{ + "brokerId": null, + "brokerName": null, + "brokerTaxCode": null, + "brokerType": null, + "createdAt": null, + "id": null, + "institutionId": null, + "institutionName": null, + "institutionRootName": null, + "institutionType": null, + "productId": null, + "status": null, + "taxCode": null, + "type": null, + "updatedAt": null +} diff --git a/connector/rest/src/test/resources/stubs/Institution.json b/connector/rest/src/test/resources/stubs/Institution.json new file mode 100644 index 000000000..b2104a58e --- /dev/null +++ b/connector/rest/src/test/resources/stubs/Institution.json @@ -0,0 +1,67 @@ +{ + "id": "123e4567-e89b-12d3-a456-426614174000", + "externalId": "externalId", + "origin": "origin", + "originId": "originId", + "description": "description", + "institutionType": "PA", + "digitalAddress": "digitalAddress", + "address": "address", + "zipCode": "zipCode", + "taxCode": "taxCode", + "city": "city", + "county": "county", + "country": "country", + "billing": { + "vatNumber": "vatNumber", + "recipientCode": "recipientCode", + "publicServices": true + }, + "onboarding": [ + { + "productId": "productId", + "status": "ACTIVE", + "userRole": "MANAGER", + "billing": { + "vatNumber": "vatNumber", + "recipientCode": "recipientCode", + "publicServices": true + } + }, + { + "productId": "productId2", + "status": "ACTIVE", + "userRole": "OPERATOR", + "billing": { + "vatNumber": "vatNumber", + "recipientCode": "recipientCode", + "publicServices": true + } + } + ], + "geographicTaxonomies": [ + { + "code": "code", + "desc": "desc" + } + ], + "attributes": [ + { + "origin": "origin", + "code": "code", + "description": "description" + } + ], + "paymentServiceProvider": { + "abiCode": "abiCode", + "businessRegisterNumber": "businessRegisterNumber", + "legalRegisterName": "legalRegisterName", + "legalRegisterNumber": "legalRegisterNumber", + "vatNumberGroup": true + }, + "dataProtectionOfficer": { + "address": "address", + "email": "email", + "pec": "pec" + } +} diff --git a/connector/rest/src/test/resources/stubs/InstitutionResponse.json b/connector/rest/src/test/resources/stubs/InstitutionResponse.json new file mode 100644 index 000000000..2e5658262 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/InstitutionResponse.json @@ -0,0 +1,57 @@ +{ + "address": "setAddress", + "aooParentCode": "setAooParentCode", + "attributes": [ + { + "code": "setCode", + "description": "setDescription", + "origin": "setOrigin" + } + ], + "businessRegisterPlace": "setBusinessRegisterPlace", + "city": "setCity", + "country": "setCountry", + "county": "setCounty", + "createdAt": "2024-06-11T10:09:30.154695400+02:00", + "dataProtectionOfficer": { + "address": "setAddress", + "email": "setEmail", + "pec": "setPec" + }, + "delegation": true, + "description": "setDescription", + "digitalAddress": "setDigitalAddress", + "externalId": "setExternalId", + "geographicTaxonomies": [ + { + "code": "setCode", + "desc": "setDesc" + } + ], + "id": "setId", + "imported": true, + "institutionType": "AS", + "onboarding": [], + "origin": "setOrigin", + "originId": "setOriginId", + "paymentServiceProvider": { + "abiCode": "setAbiCode", + "businessRegisterNumber": "setBusinessRegisterNumber", + "legalRegisterName": "setLegalRegisterName", + "legalRegisterNumber": "setLegalRegisterNumber", + "vatNumberGroup": true + }, + "rea": "setRea", + "rootParent": { + "description": "setDescription", + "id": "setId" + }, + "shareCapital": "setShareCapital", + "subunitCode": "setSubunitCode", + "subunitType": "setSubunitType", + "supportEmail": "setSupportEmail", + "supportPhone": "setSupportPhone", + "taxCode": "setTaxCode", + "updatedAt": "2024-06-11T10:09:30.153694300+02:00", + "zipCode": "setZipCode" +} diff --git a/connector/rest/src/test/resources/stubs/Product.json b/connector/rest/src/test/resources/stubs/Product.json new file mode 100644 index 000000000..9591a7966 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/Product.json @@ -0,0 +1,35 @@ +{ + "id": "123", + "logo": "logoUrl", + "logoBgColor": "#FFFFFF", + "depictImageUrl": "depictImageUrl", + "title": "Title", + "description": "ProductDescription", + "urlPublic": "urlPublic", + "urlBO": "backOfficeUrl", + "status": "ACTIVE", + "identityTokenAudience": "audience", + "roleMappings": { + "MANAGER": { + "multiroleAllowed": true, + "roles": [ + { + "code": "code1", + "label": "label1", + "description": "description1" + }, + { + "code": "code2", + "label": "label2", + "description": "description2" + } + ] + } + }, + "parentId": "parentProduct", + "contractTemplatePath": "contractTemplatePath", + "contractTemplateVersion": "1.0.0", + "contractTemplateUpdatedAt": "2024-04-17T01:00:00Z", + "createdAt": "2024-04-17T01:00:00Z", + "roleManagementURL": "roleManagementUrl" +} diff --git a/connector/rest/src/test/resources/stubs/ProductList.json b/connector/rest/src/test/resources/stubs/ProductList.json new file mode 100644 index 000000000..de2e2014e --- /dev/null +++ b/connector/rest/src/test/resources/stubs/ProductList.json @@ -0,0 +1,72 @@ +[ + { + "id": "123", + "logo": "logoUrl", + "logoBgColor": "#FFFFFF", + "depictImageUrl": "depictImageUrl", + "title": "Title", + "description": "ProductDescription", + "urlPublic": "urlPublic", + "urlBO": "backOfficeUrl", + "status": "ACTIVE", + "identityTokenAudience": "audience", + "roleMappings": { + "MANAGER": { + "multiroleAllowed": true, + "roles": [ + { + "code": "code1", + "label": "label1", + "description": "description1" + }, + { + "code": "code2", + "label": "label2", + "description": "description2" + } + ] + } + }, + "parentId": "parentProduct", + "contractTemplatePath": "contractTemplatePath", + "contractTemplateVersion": "1.0.0", + "contractTemplateUpdatedAt": "2024-04-17T01:00:00Z", + "createdAt": "2024-04-17T01:00:00Z", + "roleManagementURL": "roleManagementUrl" + }, + { + "id": "123", + "logo": "logoUrl", + "logoBgColor": "#FFFFFF", + "depictImageUrl": "depictImageUrl", + "title": "Title", + "description": "ProductDescription", + "urlPublic": "urlPublic", + "urlBO": "backOfficeUrl", + "status": "ACTIVE", + "identityTokenAudience": "audience", + "roleMappings": { + "MANAGER": { + "multiroleAllowed": true, + "roles": [ + { + "code": "code1", + "label": "label1", + "description": "description1" + }, + { + "code": "code2", + "label": "label2", + "description": "description2" + } + ] + } + }, + "parentId": "parentProduct", + "contractTemplatePath": "contractTemplatePath", + "contractTemplateVersion": "1.0.0", + "contractTemplateUpdatedAt": "2024-04-17T01:00:00Z", + "createdAt": "2024-04-17T01:00:00Z", + "roleManagementURL": "roleManagementUrl" + } +] diff --git a/connector/rest/src/test/resources/stubs/ProductTree.json b/connector/rest/src/test/resources/stubs/ProductTree.json new file mode 100644 index 000000000..b4e1e33ec --- /dev/null +++ b/connector/rest/src/test/resources/stubs/ProductTree.json @@ -0,0 +1,132 @@ +[ + { + "node": { + "id": "product_id", + "logo": "product_logo", + "depictImageUrl": "product_image_url", + "title": "product_title", + "logoBgColor": "logo_background_color", + "description": "product_description", + "urlPublic": "public_url", + "urlBO": "back_office_url", + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": "string", + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": "modifier", + "roleMappings": { + "MANAGER": { + "multiroleAllowed": true, + "roles": [ + { + "code": "code1", + "label": "label1", + "description": "description1" + }, + { + "code": "code2", + "label": "label2", + "description": "description2" + } + ] + } + }, + "roleManagementURL": "role_management_url", + "contractTemplateUpdatedAt": "2022-01-01T00:00:00Z", + "contractTemplatePath": "contract_template_path", + "contractTemplateVersion": "contract_template_version", + "institutionContractMappings": { + "PSP": { + "contractTemplateUpdatedAt": "2022-01-01T00:00:00Z", + "contractTemplatePath": "value", + "contractTemplateVersion": "value1" + } + }, + "enabled": true, + "delegable": true, + "invoiceable": true, + "status": "ACTIVE", + "parentId": "parent_product_id", + "testEnvProductIds": [ + "test_env_product_id1", + "test_env_product_id2" + ], + "identityTokenAudience": "identity_token_audience", + "backOfficeEnvironmentConfigurations": { + "configuration1": { + "url": "value1", + "identityTokenAudience": "value2" + } + }, + "parent": null, + "consumers": [ + "consumer1", + "consumer2" + ] + }, + "children": [ + { + "id": "product_id", + "logo": "product_logo", + "depictImageUrl": "product_image_url", + "title": "product_title", + "logoBgColor": "logo_background_color", + "description": "product_description", + "urlPublic": "public_url", + "urlBO": "back_office_url", + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": "string", + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": "modifier", + "roleMappings": { + "MANAGER": { + "multiroleAllowed": true, + "roles": [ + { + "code": "code1", + "label": "label1", + "description": "description1" + }, + { + "code": "code2", + "label": "label2", + "description": "description2" + } + ] + } + }, + "roleManagementURL": "role_management_url", + "contractTemplateUpdatedAt": "2022-01-01T00:00:00Z", + "contractTemplatePath": "contract_template_path", + "contractTemplateVersion": "contract_template_version", + "institutionContractMappings": { + "PSP": { + "contractTemplateUpdatedAt": "2022-01-01T00:00:00Z", + "contractTemplatePath": "value", + "contractTemplateVersion": "value1" + } + }, + "enabled": true, + "delegable": true, + "invoiceable": true, + "status": "ACTIVE", + "parentId": "parent_product_id", + "testEnvProductIds": [ + "test_env_product_id1", + "test_env_product_id2" + ], + "identityTokenAudience": "identity_token_audience", + "backOfficeEnvironmentConfigurations": { + "configuration1": { + "url": "value1", + "identityTokenAudience": "value2" + } + }, + "parent": null, + "consumers": [ + "consumer1", + "consumer2" + ] + } + ] + } +] \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/User.json b/connector/rest/src/test/resources/stubs/User.json new file mode 100644 index 000000000..c6f7aee14 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/User.json @@ -0,0 +1,30 @@ +{ + "id": "123e4567-e89b-12d3-a456-426614174000", + "fiscalCode": "NLLGPJ67L30L783W", + "name": { + "value": "John" + }, + "familyName": { + "value": "Doe" + }, + "email": { + "value": "john.doe@example.com" + }, + "workContacts": { + "institution1": { + "email": { + "value": "contact1@work.it" + } + }, + "contact2": { + "email": { + "value": "contact2@work.it" + } + }, + "123e4567-e89b-12d3-a456-426614174000": { + "email": { + "value": "contact2@work.it" + } + } + } +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/UserCertificationNone.json b/connector/rest/src/test/resources/stubs/UserCertificationNone.json new file mode 100644 index 000000000..f513ba26b --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserCertificationNone.json @@ -0,0 +1,24 @@ +{ + "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "fiscalCode": "setFiscalCode", + "name": { + "certification": "NONE", + "value": "setValue" + }, + "familyName": { + "certification": "NONE", + "value": "setValue" + }, + "email": { + "certification": "NONE", + "value": "setValue" + }, + "workContacts": { + "institutionId": { + "email": { + "certification": "NONE", + "value": "setValue" + } + } + } +} diff --git a/connector/rest/src/test/resources/stubs/UserCertificationNotNone.json b/connector/rest/src/test/resources/stubs/UserCertificationNotNone.json new file mode 100644 index 000000000..e5e3d4cf7 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserCertificationNotNone.json @@ -0,0 +1,24 @@ +{ + "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479", + "fiscalCode": "setFiscalCode", + "name": { + "certification": "SPID", + "value": "setValue" + }, + "familyName": { + "certification": "SPID", + "value": "setValue" + }, + "email": { + "certification": "SPID", + "value": "setValue" + }, + "workContacts": { + "institutionId": { + "email": { + "certification": "SPID", + "value": "setValue" + } + } + } +} diff --git a/connector/rest/src/test/resources/stubs/UserDataResponse.json b/connector/rest/src/test/resources/stubs/UserDataResponse.json new file mode 100644 index 000000000..9c7609806 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserDataResponse.json @@ -0,0 +1,32 @@ +[ + { + "id": "id", + "userId": "123e4567-e89b-12d3-a456-426614174000", + "institutionId": "institutionId", + "institutionDescription": "institutionDescription", + "institutionRootName": "institutionRootName", + "userMailUuid": "userMailUuid", + "role": "MANAGER", + "status": "ACTIVE", + "products": [ + { + "productId": "productId", + "tokenId": "tokenId", + "status": "ACTIVE", + "productRole": "productRole", + "role": "MANAGER", + "env": "ROOT", + "createdAt": "2020-01-01T00:00:00Z", + "updatedAt": "2020-01-01T00:00:00Z" + } + ], + "userResponse": { + "id": "id", + "taxCode": "name", + "name": "email", + "surname": "ACTIVE", + "email": "2020-01-01T00:00:00Z", + "workContacts": null + } + } +] \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/UserDetailResponse.json b/connector/rest/src/test/resources/stubs/UserDetailResponse.json new file mode 100644 index 000000000..c6f7aee14 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserDetailResponse.json @@ -0,0 +1,30 @@ +{ + "id": "123e4567-e89b-12d3-a456-426614174000", + "fiscalCode": "NLLGPJ67L30L783W", + "name": { + "value": "John" + }, + "familyName": { + "value": "Doe" + }, + "email": { + "value": "john.doe@example.com" + }, + "workContacts": { + "institution1": { + "email": { + "value": "contact1@work.it" + } + }, + "contact2": { + "email": { + "value": "contact2@work.it" + } + }, + "123e4567-e89b-12d3-a456-426614174000": { + "email": { + "value": "contact2@work.it" + } + } + } +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/UserInfoFilter.json b/connector/rest/src/test/resources/stubs/UserInfoFilter.json new file mode 100644 index 000000000..70893f422 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserInfoFilter.json @@ -0,0 +1,7 @@ +{ + "role": "ADMIN", + "productId": "product1", + "productRoles": ["role1", "role2"], + "userId": "123e4567-e89b-12d3-a456-426614174000", + "allowedStates": ["ACTIVE", "SUSPENDED"] +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/UserInfoResponse.json b/connector/rest/src/test/resources/stubs/UserInfoResponse.json new file mode 100644 index 000000000..1cb79a96a --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserInfoResponse.json @@ -0,0 +1,12 @@ +{ + "userId": "userId", + "institutions": [ + { + "institutionId": "institutionId", + "institutionName": "institutionName", + "institutionRootName": "institutionRootName", + "role": "DELEGATE", + "status": "ACTIVE" + } + ] +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/UserInstitutionResponse.json b/connector/rest/src/test/resources/stubs/UserInstitutionResponse.json new file mode 100644 index 000000000..439632283 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserInstitutionResponse.json @@ -0,0 +1,20 @@ +{ + "id": "id", + "userId": "userId", + "institutionId": "institutionId", + "institutionDescription": "institutionDescription", + "institutionRootName": "institutionRootName", + "userMailUuid": "userMailUuid", + "products": [ + { + "productId": "productId", + "tokenId": "tokenId", + "status": "ACTIVE", + "productRole": "productRole", + "role": "DELEGATE", + "env": "ROOT", + "createdAt": "2022-01-01T00:00:00", + "updatedAt": "2022-01-01T00:00:00" + } + ] +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/UserInstitutionResponse2.json b/connector/rest/src/test/resources/stubs/UserInstitutionResponse2.json new file mode 100644 index 000000000..0927b653f --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserInstitutionResponse2.json @@ -0,0 +1,20 @@ +{ + "id": "id", + "userId": "userId", + "institutionId": "institutionId", + "institutionDescription": "institutionDescription", + "institutionRootName": "institutionRootName", + "userMailUuid": "userMailUuid", + "products": [ + { + "productId": "productId", + "tokenId": "tokenId", + "status": "ACTIVE", + "productRole": "productRole", + "role": "DELEGATE", + "env": "ROOT", + "createdAt": "2022-01-01T00:00", + "updatedAt": "2022-01-01T00:00" + } + ] +} diff --git a/connector/rest/src/test/resources/stubs/UserToCreate.json b/connector/rest/src/test/resources/stubs/UserToCreate.json new file mode 100644 index 000000000..054dd5ab4 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/UserToCreate.json @@ -0,0 +1,7 @@ +{ + "name": "Name", + "productRoles": [], + "surname": "Doe", + "taxCode": "Tax Code", + "email": "jane.doe@example.org" +} diff --git a/connector/rest/src/test/resources/stubs/createUserGroup.json b/connector/rest/src/test/resources/stubs/createUserGroup.json new file mode 100644 index 000000000..0de2bb890 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/createUserGroup.json @@ -0,0 +1,7 @@ +{ + "name": "groupName", + "description": "groupDescription", + "members": ["string1", "string2"], + "institutionId": "institutionId", + "productId": "productId" +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/createUserGroupRequest.json b/connector/rest/src/test/resources/stubs/createUserGroupRequest.json new file mode 100644 index 000000000..5236c1c51 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/createUserGroupRequest.json @@ -0,0 +1,8 @@ +{ + "institutionId": "institutionId", + "productId": "productId", + "name": "groupName", + "description": "groupDescription", + "status": "ACTIVE", + "members": ["string1", "string2"] +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponse.json b/connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponse.json new file mode 100644 index 000000000..74d7e0ac7 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponse.json @@ -0,0 +1 @@ +{"id":"id","institutionId":"from","brokerId":"to","productId":"setProductId","institutionName":"setInstitutionFromName","institutionRootName":null,"brokerName":"brokerName","type":"PT"} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponseV2.json b/connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponseV2.json new file mode 100644 index 000000000..407fe775b --- /dev/null +++ b/connector/rest/src/test/resources/stubs/delegationUsingFromExpectedResponseV2.json @@ -0,0 +1 @@ +{"id":"id","institutionId":"from","institutionName":"setInstitutionFromName","brokerId":"to","brokerName":"brokerName","brokerTaxCode":null,"brokerType":null,"productId":"setProductId","institutionRootName":null,"type":"PT","createdAt":null,"updatedAt":null,"institutionType":null,"status":null,"taxCode":null} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/getUserGroups_notEmptyInstitutionId_notEmptyProductId_notEmptyUserId.json b/connector/rest/src/test/resources/stubs/getUserGroups_notEmptyInstitutionId_notEmptyProductId_notEmptyUserId.json new file mode 100644 index 000000000..006863760 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/getUserGroups_notEmptyInstitutionId_notEmptyProductId_notEmptyUserId.json @@ -0,0 +1,46 @@ +{ + "id": "setId", + "institutionId": "setInstitutionId", + "productId": "setProductId", + "description": "setDescription", + "name": "setName", + "status": "ACTIVE", + "members": [ + { + "id": "123", + "user": null, + "role": null, + "products": null, + "status": null, + "institutionId": null, + "userMailUuid": null + }, + { + "id": "321", + "user": null, + "role": null, + "products": null, + "status": null, + "institutionId": null, + "userMailUuid": null + } + ], + "createdAt": "+1000000000-12-31T23:59:59.999999999Z", + "createdBy": { + "id": "setCreatedBy", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + }, + "modifiedAt": "+1000000000-12-31T23:59:59.999999999Z", + "modifiedBy": { + "id": "setModifiedBy", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + } +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo.json b/connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo.json new file mode 100644 index 000000000..006863760 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo.json @@ -0,0 +1,46 @@ +{ + "id": "setId", + "institutionId": "setInstitutionId", + "productId": "setProductId", + "description": "setDescription", + "name": "setName", + "status": "ACTIVE", + "members": [ + { + "id": "123", + "user": null, + "role": null, + "products": null, + "status": null, + "institutionId": null, + "userMailUuid": null + }, + { + "id": "321", + "user": null, + "role": null, + "products": null, + "status": null, + "institutionId": null, + "userMailUuid": null + } + ], + "createdAt": "+1000000000-12-31T23:59:59.999999999Z", + "createdBy": { + "id": "setCreatedBy", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + }, + "modifiedAt": "+1000000000-12-31T23:59:59.999999999Z", + "modifiedBy": { + "id": "setModifiedBy", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + } +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo_nullMembers.json b/connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo_nullMembers.json new file mode 100644 index 000000000..fd0047083 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/groupResponse_toGroupInfo_nullMembers.json @@ -0,0 +1,27 @@ +{ + "id": "setId", + "institutionId": "setInstitutionId", + "productId": "setProductId", + "description": "setDescription", + "name": "setName", + "status": "ACTIVE", + "members": null, + "createdAt": "+1000000000-12-31T23:59:59.999999999Z", + "createdBy": { + "id": "setCreatedBy", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + }, + "modifiedAt": "+1000000000-12-31T23:59:59.999999999Z", + "modifiedBy": { + "id": "setModifiedBy", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + } +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroupByIdSingle.json b/connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroupByIdSingle.json new file mode 100644 index 000000000..c029acf03 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroupByIdSingle.json @@ -0,0 +1,37 @@ +{ + "id": "groupId", + "institutionId": "institutionId", + "productId": "productId", + "description": "groupDescription", + "name": "groupName", + "status": "ACTIVE", + "members": [ + { + "id": "memberId1", + "user": null, + "role": null, + "products": null, + "status": null, + "institutionId": null, + "userMailUuid": null + } + ], + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": { + "id": "creatorId", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + }, + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": { + "id": "modifierId", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + } +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroups.json b/connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroups.json new file mode 100644 index 000000000..09dfcbf72 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/userGroupInfoGetUserGroups.json @@ -0,0 +1,21 @@ +{ + "id": "groupId", + "institutionId": "institutionId", + "productId": "productId", + "description": "groupDescription", + "name": "groupName", + "status": "ACTIVE", + "members": [ + { + "id": "userId1" + } + ], + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": { + "id": "creatorId" + }, + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": { + "id": "modifierId" + } +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/userGroupInfoNullModifiedBy.json b/connector/rest/src/test/resources/stubs/userGroupInfoNullModifiedBy.json new file mode 100644 index 000000000..e3383abdd --- /dev/null +++ b/connector/rest/src/test/resources/stubs/userGroupInfoNullModifiedBy.json @@ -0,0 +1,39 @@ +{ + "id": "id", + "institutionId": "institutionId", + "productId": "productId", + "description": "groupDescription", + "name": "groupName", + "status": "ACTIVE", + "members": [ + { + "id": "memberId1", + "user": null, + "role": null, + "products": null, + "status": null, + "institutionId": null, + "userMailUuid": null + }, + { + "id": "memberId2", + "user": null, + "role": null, + "products": null, + "status": null, + "institutionId": null, + "userMailUuid": null + } + ], + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": { + "id": "creatorId", + "fiscalCode": null, + "name": null, + "familyName": null, + "email": null, + "workContacts": null + }, + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": null +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/userGroupResponse.json b/connector/rest/src/test/resources/stubs/userGroupResponse.json new file mode 100644 index 000000000..e0c3f9c8b --- /dev/null +++ b/connector/rest/src/test/resources/stubs/userGroupResponse.json @@ -0,0 +1,13 @@ +{ + "id": "groupId", + "institutionId": "institutionId", + "productId": "productId", + "name": "groupName", + "description": "groupDescription", + "status": "ACTIVE", + "members": ["userId1"], + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": "creatorId", + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": "modifierId" +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/userGroupResponseNullModifiedBy.json b/connector/rest/src/test/resources/stubs/userGroupResponseNullModifiedBy.json new file mode 100644 index 000000000..310adf010 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/userGroupResponseNullModifiedBy.json @@ -0,0 +1,13 @@ +{ + "id": "id", + "institutionId": "institutionId", + "productId": "productId", + "name": "groupName", + "description": "groupDescription", + "status": "ACTIVE", + "members": ["memberId1", "memberId2"], + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": "creatorId", + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": null +} \ No newline at end of file diff --git a/connector/rest/src/test/resources/stubs/userGroupResponseSingle.json b/connector/rest/src/test/resources/stubs/userGroupResponseSingle.json new file mode 100644 index 000000000..0269bef37 --- /dev/null +++ b/connector/rest/src/test/resources/stubs/userGroupResponseSingle.json @@ -0,0 +1,13 @@ +{ + "id": "groupId", + "institutionId": "institutionId", + "productId": "productId", + "name": "groupName", + "description": "groupDescription", + "status": "ACTIVE", + "members": ["memberId1"], + "createdAt": "2022-01-01T00:00:00Z", + "createdBy": "creatorId", + "modifiedAt": "2022-01-01T00:00:00Z", + "modifiedBy": "modifierId" +} \ No newline at end of file