From fae639e4e89c9b0228cb25cdf9c733146a8992d3 Mon Sep 17 00:00:00 2001 From: kpatel-ch Date: Mon, 23 Sep 2024 16:20:29 +0100 Subject: [PATCH] IDVA6-1514: Third and final PR for refactoring acsp-manage-users-api tests --- .../manage/users/common/ComparisonUtils.java | 17 + .../AcspMembersRepositoryIntegrationTest.java | 394 +++------- ...zationAndInternalUserInterceptorsTest.java | 25 +- .../AuthorizationInterceptorTest.java | 60 +- .../AcspMembershipCollectionMappersTest.java | 6 +- .../mapper/AcspMembershipMapperTest.java | 5 +- .../users/rest/AccountsUserEndpointTest.java | 18 +- .../users/rest/AcspProfileEndpointTest.java | 2 +- .../users/service/AcspMembersServiceTest.java | 740 +++++++----------- .../users/service/UsersServiceTest.java | 63 +- .../utils/PaginationValidatorUtilTest.java | 31 +- .../users/utils/RequestContextUtilTest.java | 8 +- 12 files changed, 526 insertions(+), 843 deletions(-) diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/common/ComparisonUtils.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/common/ComparisonUtils.java index 3dc0816..9de3c21 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/common/ComparisonUtils.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/common/ComparisonUtils.java @@ -7,7 +7,9 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import org.bson.Document; import org.mockito.ArgumentMatcher; +import org.springframework.data.mongodb.core.query.Update; import uk.gov.companieshouse.acsp.manage.users.common.Preprocessors.Preprocessor; public class ComparisonUtils { @@ -65,4 +67,19 @@ public ArgumentMatcher compare( final T referenceObject, final List updateMatches( final Map expectedKeyValuePairs ) { + return update -> { + final var document = update.getUpdateObject().get( "$set", Document.class ); + return expectedKeyValuePairs.entrySet() + .stream() + .map( entry -> { + final var value = document.get(entry.getKey()); + final var expectedValue = entry.getValue(); + return value.equals(expectedValue); + } ) + .reduce((firstIsCorrect, secondIsCorrect) -> firstIsCorrect && secondIsCorrect) + .get(); + }; + } + } diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/integration/AcspMembersRepositoryIntegrationTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/integration/AcspMembersRepositoryIntegrationTest.java index 30030b8..14d913e 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/integration/AcspMembersRepositoryIntegrationTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/integration/AcspMembersRepositoryIntegrationTest.java @@ -4,317 +4,173 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Update; import uk.gov.companieshouse.acsp.manage.users.common.TestDataManager; import uk.gov.companieshouse.acsp.manage.users.model.AcspMembersDao; import uk.gov.companieshouse.acsp.manage.users.repositories.AcspMembersRepository; -import uk.gov.companieshouse.acsp.manage.users.utils.ApiClientUtil; import uk.gov.companieshouse.acsp.manage.users.utils.StaticPropertyUtil; -import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership; -import java.util.List; +import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.MembershipStatusEnum; +import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.UserRoleEnum; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -@Tag("integration-test") +@Tag( "integration-test" ) @DataMongoTest class AcspMembersRepositoryIntegrationTest { - @Autowired private MongoTemplate mongoTemplate; + @Autowired + private MongoTemplate mongoTemplate; - @MockBean private ApiClientUtil apiClientUtil; + @Autowired + private AcspMembersRepository acspMembersRepository; - @MockBean private StaticPropertyUtil staticPropertyUtil; + @MockBean + private StaticPropertyUtil staticPropertyUtil; - private final TestDataManager testDataManager = TestDataManager.getInstance(); + private final TestDataManager testDataManager = TestDataManager.getInstance(); - @Autowired private AcspMembersRepository acspMembersRepository; + @Test + void findAllNotRemovedByAcspNumberReturnsNotRemovedMembersForGivenAcspNumber() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos("COM001", "COM002", "COM003", "COM004", "COM005", "COM006" ) ); + + final var result = acspMembersRepository.findAllNotRemovedByAcspNumber("COMA001", PageRequest.of( 0, 10 ) ).getContent(); + + assertEquals( 3, result.size() ); + assertTrue( result.stream().allMatch( member -> member.getAcspNumber().equals("COMA001" ) ) ); + assertTrue( result.stream().allMatch( member -> member.getRemovedBy() == null ) ); + } + + @Test + void findAllByAcspNumberReturnsAllMembersForGivenAcspNumber() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "COM001", "COM002", "COM003", "COM004", "COM005", "COM006" ) ); + + final var result = acspMembersRepository.findAllByAcspNumber( "COMA001", PageRequest.of(0, 10) ); + + assertEquals( 6, result.getTotalElements() ); + assertTrue( result.getContent().stream().allMatch( member -> member.getAcspNumber().equals("COMA001" ) ) ); + } + + @Test + void findAllNotRemovedByAcspNumberAndUserRoleReturnsNotRemovedMembersForGivenAcspNumberAndUserRole() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "COM001", "COM002", "COM003", "COM004", "COM005", "COM006" ) ); + + final var result = acspMembersRepository.findAllNotRemovedByAcspNumberAndUserRole( "COMA001", UserRoleEnum.ADMIN.getValue(), PageRequest.of( 0, 10 ) ); + + assertEquals( 2, result.getTotalElements() ); + assertTrue( result.getContent().stream().allMatch( member -> member.getAcspNumber().equals( "COMA001" ) && member.getUserRole().equals( UserRoleEnum.ADMIN.getValue() ) && member.getRemovedBy() == null ) ) ; + } + + @Test + void findAllByAcspNumberAndUserRoleReturnsAllMembersForGivenAcspNumberAndUserRole() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos("COM001", "COM002", "COM003", "COM004", "COM005", "COM006" ) ); + + final var result = acspMembersRepository.findAllByAcspNumberAndUserRole( "COMA001", UserRoleEnum.ADMIN.getValue(), PageRequest.of(0, 10) ); + + assertEquals( 3, result.getTotalElements() ); + assertTrue( result.getContent().stream().allMatch( member -> member.getAcspNumber().equals( "COMA001" ) && member.getUserRole().equals( UserRoleEnum.ADMIN.getValue() ) ) ); + } + + @Test + void fetchAllAcspMembersByUserIdReturnsAllAcspMembersForProvidedUserId() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "COM001", "COM002", "COM003", "NF002", "TS002" ) ); + + final var result = acspMembersRepository.fetchAllAcspMembersByUserId( "TSU002" ); + + assertEquals( 2, result.size() ); + assertTrue( result.stream().anyMatch( elem -> elem.getId().equals( "NF002" ) && elem.getUserId().equals( "TSU002" ) && elem.getStatus().equals( MembershipStatusEnum.ACTIVE.getValue() ) ) ); + assertTrue( result.stream().anyMatch( elem -> elem.getId().equals("TS002") && elem.getUserId().equals( "TSU002" ) && elem.getStatus().equals( MembershipStatusEnum.REMOVED.getValue() ) ) ); + } + + @Test + void fetchActiveAcspMembersByUserIdReturnsActiveAcspMembersForProvidedUserId() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "COM001", "COM002", "COM003", "NF002", "TS002" ) ); + + final var result = acspMembersRepository.fetchActiveAcspMembersByUserId( "TSU002" ); + + assertEquals( 1, result.size() ); + assertTrue( result.stream().anyMatch( elem -> elem.getId().equals( "NF002" ) && elem.getUserId().equals( "TSU002" ) && elem.getStatus().equals( MembershipStatusEnum.ACTIVE.getValue() ) ) ); + } + + @Test + void fetchAllAcspMembersByUserIdAndAcspNumberReturnsRemovedAcspMembersForProvidedUserIdAndAcspNumber() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "COM001", "COM002", "COM003", "NF002", "TS002" ) ); + + final var result = acspMembersRepository.fetchAllAcspMembersByUserIdAndAcspNumber( "COMU001", "COMA001" ); + + assertEquals( 1, result.size() ); + assertTrue( result.stream().anyMatch( member -> member.getId().equals( "COM001" ) && member.getUserId().equals( "COMU001" ) && member.getAcspNumber().equals( "COMA001" ) && member.getStatus().equals( MembershipStatusEnum.REMOVED.getValue() ) ) ); + } + + @Test + void fetchActiveAcspMembersByUserIdAndAcspNumberReturnsActiveAcspMembersForProvidedUserIdAndAcspNumber() { + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "COM001", "COM002", "COM003", "NF002", "TS002" ) ); + final var result = acspMembersRepository.fetchActiveAcspMembersByUserIdAndAcspNumber( "COMU002", "COMA001" ); - @BeforeEach - void setUp() { - acspMembersRepository.deleteAll(); - } + assertEquals( 1, result.size() ); + assertTrue( result.stream().anyMatch( member -> member.getId().equals( "COM002" ) && member.getUserId().equals( "COMU002" ) && member.getAcspNumber().equals( "COMA001" ) && member.getStatus().equals( MembershipStatusEnum.ACTIVE.getValue() ) ) ); + } - @Nested - class FindAllNotRemovedByAcspNumber { @Test - void returnsNotRemovedMembersForGivenAcspNumber() { - // Given - String acspNumber = "COMA001"; - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos( - "COM001", "COM002", "COM003", "COM004", "COM005", "COM006")); - Pageable pageable = PageRequest.of(0, 10); - - // When - Page result = - acspMembersRepository.findAllNotRemovedByAcspNumber(acspNumber, pageable); - - // Then - assertEquals(3, result.getTotalElements()); - assertTrue( - result.getContent().stream() - .allMatch(member -> member.getAcspNumber().equals(acspNumber))); - assertTrue(result.getContent().stream().allMatch(member -> member.getRemovedBy() == null)); + void fetchNumberOfActiveOwnersWithNullOrMalformedOrNonexistentAcspNumberReturnsZero(){ + Assertions.assertEquals( 0, acspMembersRepository.fetchNumberOfActiveOwners( null ) ); + Assertions.assertEquals( 0, acspMembersRepository.fetchNumberOfActiveOwners( "£££" ) ); + Assertions.assertEquals( 0, acspMembersRepository.fetchNumberOfActiveOwners( "TS001" ) ); } - } - @Nested - class FindAllByAcspNumber { @Test - void returnsAllMembersForGivenAcspNumber() { - // Given - String acspNumber = "COMA001"; - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos( - "COM001", "COM002", "COM003", "COM004", "COM005", "COM006")); - Pageable pageable = PageRequest.of(0, 10); - - // When - Page result = acspMembersRepository.findAllByAcspNumber(acspNumber, pageable); - - // Then - assertEquals(6, result.getTotalElements()); - assertTrue( - result.getContent().stream() - .allMatch(member -> member.getAcspNumber().equals(acspNumber))); + void fetchNumberOfActiveOwnersRetrievesNumberOfActiveOwnersAtAcsp(){ + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS001", "COM001", "COM002", "COM003", "COM004" ) ); + Assertions.assertEquals( 1, acspMembersRepository.fetchNumberOfActiveOwners( "COMA001" ) ); } - } - @Nested - class FindAllNotRemovedByAcspNumberAndUserRole { @Test - void returnsNotRemovedMembersForGivenAcspNumberAndUserRole() { - // Given - String acspNumber = "COMA001"; - String userRole = AcspMembership.UserRoleEnum.ADMIN.getValue(); - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos( - "COM001", "COM002", "COM003", "COM004", "COM005", "COM006")); - Pageable pageable = PageRequest.of(0, 10); - - // When - Page result = - acspMembersRepository.findAllNotRemovedByAcspNumberAndUserRole( - acspNumber, userRole, pageable); - - // Then - assertEquals(2, result.getTotalElements()); - assertTrue( - result.getContent().stream() - .allMatch( - member -> - member.getAcspNumber().equals(acspNumber) - && member.getUserRole().equals(userRole) - && member.getRemovedBy() == null)); + void fetchActiveAcspMembershipWithNullOrMalformedOrNonexistentUserIdOrAcspNumberReturnsEmptyOptional(){ + Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( null, "TSA001" ).isPresent() ); + Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "£££", "TSA001" ).isPresent() ); + Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU001", null ).isPresent() ); + Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU001", "£££" ).isPresent() ); + Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU001", "TSA001" ).isPresent() ); } - } - @Nested - class FindAllByAcspNumberAndUserRole { @Test - void returnsAllMembersForGivenAcspNumberAndUserRole() { - // Given - String acspNumber = "COMA001"; - String userRole = AcspMembership.UserRoleEnum.ADMIN.getValue(); - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos( - "COM001", "COM002", "COM003", "COM004", "COM005", "COM006")); - Pageable pageable = PageRequest.of(0, 10); - - // When - Page result = - acspMembersRepository.findAllByAcspNumberAndUserRole(acspNumber, userRole, pageable); - - // Then - assertEquals(3, result.getTotalElements()); - assertTrue( - result.getContent().stream() - .allMatch( - member -> - member.getAcspNumber().equals(acspNumber) - && member.getUserRole().equals(userRole))); + void fetchActiveAcspMembershipAppliedToInactiveMembershipReturnsEmptyOptional(){ + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS002" ) ); + Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU002", "TSA001" ).isPresent() ); } - } - @Nested - class FetchAllAcspMembersByUserId { @Test - void returnsAllAcspMembersForProvidedUserId() { - // Given - final var userId = "TSU002"; - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos("COM001", "COM002", "COM003", "NF002", "TS002")); - - // When - final var result = acspMembersRepository.fetchAllAcspMembersByUserId(userId); - - // Then - assertEquals(2, result.size()); - assertTrue( - result.stream() - .anyMatch( - elem -> - elem.getId().equals("NF002") - && elem.getUserId().equals(userId) - && elem.getStatus() - .equals(AcspMembership.MembershipStatusEnum.ACTIVE.getValue()))); - assertTrue( - result.stream() - .anyMatch( - elem -> - elem.getId().equals("TS002") - && elem.getUserId().equals(userId) - && elem.getStatus() - .equals(AcspMembership.MembershipStatusEnum.REMOVED.getValue()))); + void fetchActiveAcspMembershipRetrievesMembership(){ + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS001" ) ); + Assertions.assertEquals( "TS001", acspMembersRepository.fetchActiveAcspMembership( "TSU001", "TSA001" ).get().getId() ); } - } - @Nested - class FetchActiveAcspMembersByUserId { @Test - void returnsActiveAcspMembersForProvidedUserId() { - // Given - final var userId = "TSU002"; - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos("COM001", "COM002", "COM003", "NF002", "TS002")); - - // When - final var result = acspMembersRepository.fetchActiveAcspMembersByUserId(userId); - - // Then - assertEquals(1, result.size()); - assertTrue( - result.stream() - .anyMatch( - elem -> - elem.getId().equals("NF002") - && elem.getUserId().equals(userId) - && elem.getStatus() - .equals(AcspMembership.MembershipStatusEnum.ACTIVE.getValue()))); + void updateAcspMembershipWithNullOrMalformedOrNonexistentAcspMembershipIdDoesNotPerformUpdate(){ + Assertions.assertEquals( 0, acspMembersRepository.updateAcspMembership( null, new Update().set( "user_role", "standard" ) ) ); + Assertions.assertEquals( 0, acspMembersRepository.updateAcspMembership( "£££", new Update().set( "user_role", "standard" ) ) ); + Assertions.assertEquals( 0, acspMembersRepository.updateAcspMembership( "TS001", new Update().set( "user_role", "standard" ) ) ); } - } - @Nested - class FetchAllAcspMembersByUserIdAndAcspNumber { @Test - void returnsRemovedAcspMembersForProvidedUserIdAndAcspNumber() { - // Given - String userId = "COMU001"; - String acspNumber = "COMA001"; - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos("COM001", "COM002", "COM003", "NF002", "TS002")); - - // When - List result = - acspMembersRepository.fetchAllAcspMembersByUserIdAndAcspNumber(userId, acspNumber); - - // Then - assertEquals(1, result.size()); - assertTrue( - result.stream() - .anyMatch( - member -> - member.getId().equals("COM001") - && member.getUserId().equals(userId) - && member.getAcspNumber().equals(acspNumber) - && member - .getStatus() - .equals(AcspMembership.MembershipStatusEnum.REMOVED.getValue()))); + void updateAcspMembershipWithNullUpdateThrowsIllegalArgumentException(){ + Assertions.assertThrows( IllegalStateException.class, () -> acspMembersRepository.updateAcspMembership( "TS001", null ) ); } - } - @Nested - class FetchActiveAcspMembersByUserIdAndAcspNumber { @Test - void returnsActiveAcspMembersForProvidedUserIdAndAcspNumber() { - // Given - String userId = "COMU002"; - String acspNumber = "COMA001"; - acspMembersRepository.insert( - testDataManager.fetchAcspMembersDaos("COM001", "COM002", "COM003", "NF002", "TS002")); - - // When - List result = - acspMembersRepository.fetchActiveAcspMembersByUserIdAndAcspNumber(userId, acspNumber); - - // Then - assertEquals(1, result.size()); - assertTrue( - result.stream() - .anyMatch( - member -> - member.getId().equals("COM002") - && member.getUserId().equals(userId) - && member.getAcspNumber().equals(acspNumber) - && member - .getStatus() - .equals(AcspMembership.MembershipStatusEnum.ACTIVE.getValue()))); + void updateAcspMembershipPerformsUpdate(){ + acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS001" ) ); + Assertions.assertEquals( 1, acspMembersRepository.updateAcspMembership( "TS001", new Update().set( "user_role", "standard" ) ) ); + Assertions.assertEquals( "standard", acspMembersRepository.findById( "TS001" ).get().getUserRole() ); } - } - - @Test - void fetchNumberOfActiveOwnersWithNullOrMalformedOrNonexistentAcspNumberReturnsZero(){ - Assertions.assertEquals( 0, acspMembersRepository.fetchNumberOfActiveOwners( null ) ); - Assertions.assertEquals( 0, acspMembersRepository.fetchNumberOfActiveOwners( "£££" ) ); - Assertions.assertEquals( 0, acspMembersRepository.fetchNumberOfActiveOwners( "TS001" ) ); - } - - @Test - void fetchNumberOfActiveOwnersRetrievesNumberOfActiveOwnersAtAcsp(){ - acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS001", "COM001", "COM002", "COM003", "COM004" ) ); - Assertions.assertEquals( 1, acspMembersRepository.fetchNumberOfActiveOwners( "COMA001" ) ); - } - - @Test - void fetchActiveAcspMembershipWithNullOrMalformedOrNonexistentUserIdOrAcspNumberReturnsEmptyOptional(){ - Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( null, "TSA001" ).isPresent() ); - Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "£££", "TSA001" ).isPresent() ); - Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU001", null ).isPresent() ); - Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU001", "£££" ).isPresent() ); - Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU001", "TSA001" ).isPresent() ); - } - - @Test - void fetchActiveAcspMembershipAppliedToInactiveMembershipReturnsEmptyOptional(){ - acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS002" ) ); - Assertions.assertFalse( acspMembersRepository.fetchActiveAcspMembership( "TSU002", "TSA001" ).isPresent() ); - } - - @Test - void fetchActiveAcspMembershipRetrievesMembership(){ - acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS001" ) ); - Assertions.assertEquals( "TS001", acspMembersRepository.fetchActiveAcspMembership( "TSU001", "TSA001" ).get().getId() ); - } - - @Test - void updateAcspMembershipWithNullOrMalformedOrNonexistentAcspMembershipIdDoesNotPerformUpdate(){ - Assertions.assertEquals( 0, acspMembersRepository.updateAcspMembership( null, new Update().set( "user_role", "standard" ) ) ); - Assertions.assertEquals( 0, acspMembersRepository.updateAcspMembership( "£££", new Update().set( "user_role", "standard" ) ) ); - Assertions.assertEquals( 0, acspMembersRepository.updateAcspMembership( "TS001", new Update().set( "user_role", "standard" ) ) ); - } - - @Test - void updateAcspMembershipWithNullUpdateThrowsIllegalArgumentException(){ - Assertions.assertThrows( IllegalStateException.class, () -> acspMembersRepository.updateAcspMembership( "TS001", null ) ); - } - - @Test - void updateAcspMembershipPerformsUpdate(){ - acspMembersRepository.insert( testDataManager.fetchAcspMembersDaos( "TS001" ) ); - Assertions.assertEquals( 1, acspMembersRepository.updateAcspMembership( "TS001", new Update().set( "user_role", "standard" ) ) ); - Assertions.assertEquals( "standard", acspMembersRepository.findById( "TS001" ).get().getUserRole() ); - } - - @AfterEach - public void after() { - mongoTemplate.dropCollection( AcspMembersDao.class ); - } - -} + + @AfterEach + public void after() { + mongoTemplate.dropCollection( AcspMembersDao.class ); + } + +} \ No newline at end of file diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationAndInternalUserInterceptorsTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationAndInternalUserInterceptorsTest.java index 9c00332..a4580c6 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationAndInternalUserInterceptorsTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationAndInternalUserInterceptorsTest.java @@ -4,7 +4,6 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; -import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -33,16 +32,16 @@ void setup(){ @Test void preHandleWithoutEricHeadersReturnsUnauthorised() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); - HttpServletResponse response = new MockHttpServletResponse(); - assertFalse( authorizationAndInternalUserInterceptors.preHandle(request, response, null) ); + final var response = new MockHttpServletResponse(); + assertFalse( authorizationAndInternalUserInterceptors.preHandle( request, response, null ) ); assertEquals(401, response.getStatus() ); } @Test void preHandleWithOAuth2RequestUsesAuthorizationInterceptor() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-identity", "111"); request.addHeader("Eric-identity-type", "oauth2"); @@ -53,30 +52,30 @@ void preHandleWithOAuth2RequestUsesAuthorizationInterceptor() { Mockito.doReturn( bruce ).when( usersService ).fetchUserDetails( "111" ); - HttpServletResponse response = new MockHttpServletResponse(); - assertTrue( authorizationAndInternalUserInterceptors.preHandle(request, response, null) ); + final var response = new MockHttpServletResponse(); + assertTrue( authorizationAndInternalUserInterceptors.preHandle( request, response, null ) ); } @Test void preHandleWithApiKeyRequestUsesInternalUserInterceptor() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-identity", "111"); request.addHeader("Eric-identity-type", "key"); request.addHeader("ERIC-Authorised-Key-Roles","*"); - HttpServletResponse response = new MockHttpServletResponse(); - assertTrue( authorizationAndInternalUserInterceptors.preHandle(request, response, null) ); + final var response = new MockHttpServletResponse(); + assertTrue( authorizationAndInternalUserInterceptors.preHandle( request, response, null ) ); } @Test void preHandleWithMalformedEricIdentityTypeReturnsUnauthorised(){ - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-identity", "111"); request.addHeader("Eric-identity-type", "fingerprint"); request.addHeader("ERIC-Authorised-Key-Roles","*"); - HttpServletResponse response = new MockHttpServletResponse(); - assertFalse( authorizationAndInternalUserInterceptors.preHandle(request, response, null) ); + final var response = new MockHttpServletResponse(); + assertFalse( authorizationAndInternalUserInterceptors.preHandle( request, response, null ) ); assertEquals(401, response.getStatus() ); } diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationInterceptorTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationInterceptorTest.java index 8823d2a..93e2763 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationInterceptorTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/interceptor/AuthorizationInterceptorTest.java @@ -5,7 +5,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.anyString; -import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -21,81 +20,80 @@ import uk.gov.companieshouse.acsp.manage.users.service.UsersService; import uk.gov.companieshouse.api.accounts.user.model.User; -@ExtendWith(MockitoExtension.class) -@Tag("unit-test") +@ExtendWith( MockitoExtension.class ) +@Tag( "unit-test" ) class AuthorizationInterceptorTest { - AuthorizationInterceptor interceptor; - @Mock - UsersService usersService; + private UsersService usersService; @InjectMocks - AuthorizationInterceptor authorizationInterceptor; + private AuthorizationInterceptor authorizationInterceptor; + + private AuthorizationInterceptor interceptor; @BeforeEach void setup(){ - interceptor = new AuthorizationInterceptor(usersService); + interceptor = new AuthorizationInterceptor( usersService ); } @Test void preHandleWithoutHeadersReturns401() { + final var request = new MockHttpServletRequest(); - HttpServletRequest request = new MockHttpServletRequest(); - - HttpServletResponse response = new MockHttpServletResponse(); - assertFalse(interceptor.preHandle(request, response, null)); - assertEquals(401, response.getStatus()); + final var response = new MockHttpServletResponse(); + assertFalse( interceptor.preHandle(request, response, null ) ); + assertEquals( 401, response.getStatus() ); } @Test void preHandleWithoutEricIdentityReturns401() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-Identity-Type", "oauth2"); - HttpServletResponse response = new MockHttpServletResponse(); - assertFalse(interceptor.preHandle(request, response, null)); - assertEquals(401, response.getStatus()); + final var response = new MockHttpServletResponse(); + assertFalse( interceptor.preHandle(request, response, null ) ); + assertEquals( 401, response.getStatus() ); } @Test void preHandleWithoutEricIdentityTypeReturns401() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-Identity", "abcd123456"); - HttpServletResponse response = new MockHttpServletResponse(); - assertFalse(interceptor.preHandle(request, response, null)); - assertEquals(401, response.getStatus()); + final var response = new MockHttpServletResponse(); + assertFalse(interceptor.preHandle( request, response, null ) ); + assertEquals( 401, response.getStatus() ); } @Test void preHandleWithIncorrectEricIdentityTypeReturns401() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-Identity", "abcd123456"); request.addHeader("Eric-Identity-Type", "key"); - HttpServletResponse response = new MockHttpServletResponse(); - assertFalse(interceptor.preHandle(request, response, null)); - assertEquals(401, response.getStatus()); + final var response = new MockHttpServletResponse(); + assertFalse( interceptor.preHandle(request, response, null ) ); + assertEquals( 401, response.getStatus() ); } @Test void preHandleWithMalformedOrNonexistentEricIdentityReturn403() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-Identity", "$$$"); request.addHeader( "ERIC-Identity-Type", "oauth2" ); - HttpServletResponse response = new MockHttpServletResponse(); + final var response = new MockHttpServletResponse(); Mockito.doThrow( new NotFoundRuntimeException( "accounts-association-api", "Not found" ) ).when( usersService ).fetchUserDetails( anyString() ); - assertFalse(interceptor.preHandle(request, response, null)); - assertEquals(403, response.getStatus()); + assertFalse( interceptor.preHandle(request, response, null ) ); + assertEquals( 403, response.getStatus() ); } @Test void preHandleShouldReturnTrueWhenAuthHeaderAndAuthHeaderTypeOauthAreProvided() { - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader("Eric-identity", "111"); request.addHeader("Eric-identity-type", "oauth2"); @@ -107,7 +105,7 @@ void preHandleShouldReturnTrueWhenAuthHeaderAndAuthHeaderTypeOauthAreProvided() Mockito.doReturn( bruce ).when( usersService ).fetchUserDetails( "111" ); HttpServletResponse response = new MockHttpServletResponse(); - assertTrue(interceptor.preHandle(request, response, null)); + assertTrue( interceptor.preHandle(request, response, null ) ); } } \ No newline at end of file diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipCollectionMappersTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipCollectionMappersTest.java index cdab15d..222b6b5 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipCollectionMappersTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipCollectionMappersTest.java @@ -26,8 +26,8 @@ import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.MembershipStatusEnum; import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.UserRoleEnum; -@ExtendWith(MockitoExtension.class) -@Tag("unit-test") +@ExtendWith( MockitoExtension.class ) +@Tag( "unit-test" ) class AcspMembershipCollectionMappersTest { @Mock @@ -41,8 +41,6 @@ class AcspMembershipCollectionMappersTest { private final TestDataManager testDataManager = TestDataManager.getInstance(); - private static final String DEFAULT_DISPLAY_NAME = "Not Provided"; - private static final String DEFAULT_KIND = "acsp-membership"; @Test diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipMapperTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipMapperTest.java index 812e603..8d2b068 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipMapperTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/mapper/AcspMembershipMapperTest.java @@ -1,6 +1,5 @@ package uk.gov.companieshouse.acsp.manage.users.mapper; -import static org.mockito.ArgumentMatchers.eq; import static uk.gov.companieshouse.acsp.manage.users.common.DateUtils.localDateTimeToNormalisedString; import static uk.gov.companieshouse.acsp.manage.users.common.DateUtils.reduceTimestampResolution; @@ -21,8 +20,8 @@ import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.MembershipStatusEnum; import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.UserRoleEnum; -@ExtendWith(MockitoExtension.class) -@Tag("unit-test") +@ExtendWith( MockitoExtension.class ) +@Tag( "unit-test" ) class AcspMembershipMapperTest { @Mock diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AccountsUserEndpointTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AccountsUserEndpointTest.java index 37b1e76..8078d71 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AccountsUserEndpointTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AccountsUserEndpointTest.java @@ -27,27 +27,27 @@ import static org.mockito.ArgumentMatchers.any; -@ExtendWith(MockitoExtension.class) -@Tag("unit-test") - class AccountsUserEndpointTest { +@ExtendWith( MockitoExtension.class ) +@Tag( "unit-test" ) +class AccountsUserEndpointTest { @Mock - ApiClientUtil apiClientService; + private ApiClientUtil apiClientService; @Mock - InternalApiClient internalApiClient; + private InternalApiClient internalApiClient; @Mock - PrivateAccountsUserResourceHandler privateAccountsUserResourceHandler; + private PrivateAccountsUserResourceHandler privateAccountsUserResourceHandler; @Mock - PrivateAccountsUserFindUserBasedOnEmailGet privateAccountsUserFindUserBasedOnEmailGet; + private PrivateAccountsUserFindUserBasedOnEmailGet privateAccountsUserFindUserBasedOnEmailGet; @Mock - PrivateAccountsUserUserGet privateAccountsUserUserGet; + private PrivateAccountsUserUserGet privateAccountsUserUserGet; @InjectMocks - AccountsUserEndpoint accountsUserEndpoint; + private AccountsUserEndpoint accountsUserEndpoint; @Test void searchUserDetailsWithNullInputThrowsNullPointerException() { diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AcspProfileEndpointTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AcspProfileEndpointTest.java index 011e5be..6178ea8 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AcspProfileEndpointTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/rest/AcspProfileEndpointTest.java @@ -25,7 +25,7 @@ import uk.gov.companieshouse.api.model.ApiResponse; @ExtendWith( MockitoExtension.class ) -@Tag("unit-test") +@Tag( "unit-test" ) class AcspProfileEndpointTest { @Mock diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/AcspMembersServiceTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/AcspMembersServiceTest.java index b9483ff..18695ec 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/AcspMembersServiceTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/AcspMembersServiceTest.java @@ -1,530 +1,370 @@ package uk.gov.companieshouse.acsp.manage.users.service; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.isNull; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; -import org.bson.Document; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.ArgumentMatcher; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.data.mongodb.core.query.Update; +import uk.gov.companieshouse.acsp.manage.users.common.ComparisonUtils; import uk.gov.companieshouse.acsp.manage.users.common.TestDataManager; import uk.gov.companieshouse.acsp.manage.users.exceptions.InternalServerErrorRuntimeException; -import uk.gov.companieshouse.acsp.manage.users.mapper.AcspMembershipMapper; import uk.gov.companieshouse.acsp.manage.users.mapper.AcspMembershipCollectionMappers; import uk.gov.companieshouse.acsp.manage.users.model.AcspMembersDao; import uk.gov.companieshouse.acsp.manage.users.repositories.AcspMembersRepository; -import uk.gov.companieshouse.api.accounts.user.model.User; -import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership; +import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.MembershipStatusEnum; import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembership.UserRoleEnum; import uk.gov.companieshouse.api.acsp_manage_users.model.AcspMembershipsList; import uk.gov.companieshouse.api.acsp_manage_users.model.RequestBodyPatch.UserStatusEnum; -import uk.gov.companieshouse.api.acspprofile.AcspProfile; -import uk.gov.companieshouse.api.acspprofile.AcspProfile.StatusEnum; import static org.mockito.Mockito.*; -import static uk.gov.companieshouse.GenerateEtagUtil.generateEtag; +import static uk.gov.companieshouse.acsp.manage.users.common.ComparisonUtils.updateMatches; -@ExtendWith(MockitoExtension.class) -@Tag("unit-test") +@ExtendWith( MockitoExtension.class ) +@Tag( "unit-test" ) class AcspMembersServiceTest { - @Mock private AcspMembersRepository acspMembersRepository; - - @Mock private AcspMembershipCollectionMappers acspMembershipCollectionMappers; - - @Mock private AcspMembershipMapper acspMembershipMapper; - - @InjectMocks private AcspMembersService acspMembersService; - - private TestDataManager testDataManager; - private User testUser; - private List testActiveAcspMembersDaos; - private List testAllAcspMembersDaos; - private List testAcspMemberships; - private AcspProfile testAcspProfile; - - @BeforeEach - void setUp() { - testDataManager = TestDataManager.getInstance(); - testUser = new User(); - testUser.setUserId("COMU002"); - testActiveAcspMembersDaos = List.of(createAcspMembersDao("1", false)); - testAllAcspMembersDaos = - Arrays.asList(createAcspMembersDao("1", false), createAcspMembersDao("2", true)); - testAcspMemberships = Arrays.asList(new AcspMembership(), new AcspMembership()); - testUser.setEmail("test@example.com"); - testUser.setDisplayName("Test User"); - testActiveAcspMembersDaos = List.of(createAcspMembersDao("1", false)); - testAllAcspMembersDaos = - Arrays.asList(createAcspMembersDao("1", false), createAcspMembersDao("2", true)); - testAcspMemberships = Arrays.asList(new AcspMembership(), new AcspMembership()); - testAcspProfile = new AcspProfile(); - testAcspProfile.setNumber("ACSP001"); - testAcspProfile.setName("Test ACSP"); - testAcspProfile.setStatus( StatusEnum.ACTIVE ); - } - - private ArgumentMatcher updateMatches(final Map expectedKeyValuePairs) { - return update -> { - final var document = update.getUpdateObject().get("$set", Document.class); - return expectedKeyValuePairs.entrySet().stream() - .map( - entry -> { - final var value = document.get(entry.getKey()); - final var expectedValue = entry.getValue(); - return value.equals(expectedValue); - }) - .reduce((firstIsCorrect, secondIsCorrect) -> firstIsCorrect && secondIsCorrect) - .get(); - }; - } - - private AcspMembersDao createAcspMembersDao(String id, boolean removed) { - AcspMembersDao dao = new AcspMembersDao(); - dao.setId(id); - dao.setRemovedBy(removed ? "remover" : null); - return dao; - } - - @Nested - class FetchAcspMemberships { - @Test - void fetchAcspMembershipsReturnsAllAcspMembersIfIncludeRemovedTrue() { - when(acspMembersRepository.fetchAllAcspMembersByUserId(testUser.getUserId())) - .thenReturn(testAllAcspMembersDaos); - when(acspMembershipCollectionMappers.daoToDto(testAllAcspMembersDaos, testUser, null)) - .thenReturn(testAcspMemberships); - - AcspMembershipsList result = acspMembersService.fetchAcspMemberships(testUser, true); - - assertNotNull(result); - assertEquals(2, result.getItems().size()); - assertSame(testAcspMemberships, result.getItems()); - verify(acspMembersRepository).fetchAllAcspMembersByUserId(testUser.getUserId()); - verify(acspMembershipCollectionMappers).daoToDto(testAllAcspMembersDaos, testUser, null); + @Mock + private AcspMembersRepository acspMembersRepository; + + @Mock + private AcspMembershipCollectionMappers acspMembershipCollectionMappers; + + @InjectMocks + private AcspMembersService acspMembersService; + + private static final TestDataManager testDataManager = TestDataManager.getInstance(); + + private static final ComparisonUtils comparisonUtils = new ComparisonUtils(); + + @Nested + class FetchAcspMemberships { + + @Test + void fetchAcspMembershipsReturnsAllAcspMembersIfIncludeRemovedTrue() { + final var user = testDataManager.fetchUserDtos( "TSU001" ).getFirst(); + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "TS001", "NF001" ); + final var acspMembershipDtos = testDataManager.fetchAcspMembershipDtos( "TS001", "NF001" ); + + Mockito.doReturn( acspMembersDaos ).when( acspMembersRepository ).fetchAllAcspMembersByUserId( "TSU001" ); + Mockito.doReturn( acspMembershipDtos ).when( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user, null ); + + final var result = acspMembersService.fetchAcspMemberships( user, true ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals( 2, result.getItems().size() ); + Assertions.assertSame( acspMembershipDtos, result.getItems() ); + Mockito.verify( acspMembersRepository ).fetchAllAcspMembersByUserId( "TSU001" ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user, null ); + } + + @Test + void fetchAcspMembershipsReturnsActiveAcspMembersIfIncludeRemovedFalse() { + final var user = testDataManager.fetchUserDtos( "TSU001" ).getFirst(); + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "TS001" ); + final var acspMembershipDtos = testDataManager.fetchAcspMembershipDtos( "TS001" ); + + Mockito.doReturn( acspMembersDaos ).when( acspMembersRepository ).fetchActiveAcspMembersByUserId( "TSU001" ); + Mockito.doReturn( acspMembershipDtos ).when( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user, null ); + + final var result = acspMembersService.fetchAcspMemberships( user, false ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals( 1, result.getItems().size() ); + Assertions.assertSame( acspMembershipDtos.getFirst(), result.getItems().getFirst() ); + Mockito.verify( acspMembersRepository ).fetchActiveAcspMembersByUserId( "TSU001" ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user, null ); + } + + @Test + void fetchAcspMembershipsReturnsEmptyListIfNoMemberships() { + final var user = testDataManager.fetchUserDtos( "TSU001" ).getFirst(); + + Mockito.doReturn( List.of() ).when( acspMembersRepository ).fetchAllAcspMembersByUserId( "TSU001" ); + Mockito.doReturn( List.of() ).when( acspMembershipCollectionMappers ).daoToDto( List.of(), user, null ); + + final var result = acspMembersService.fetchAcspMemberships( user, true ); + + Assertions.assertNotNull( result ); + Assertions.assertTrue( result.getItems().isEmpty() ); + Mockito.verify( acspMembersRepository ).fetchAllAcspMembersByUserId( "TSU001" ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( List.of(), user, null ); + } + } - @Test - void fetchAcspMembershipsReturnsActiveAcspMembersIfIncludeRemovedFalse() { - when(acspMembersRepository.fetchActiveAcspMembersByUserId(testUser.getUserId())) - .thenReturn(testActiveAcspMembersDaos); - when(acspMembershipCollectionMappers.daoToDto(testActiveAcspMembersDaos, testUser,null)) - .thenReturn(Collections.singletonList(testAcspMemberships.get(0))); - - AcspMembershipsList result = acspMembersService.fetchAcspMemberships(testUser, false); - - assertNotNull(result); - assertEquals(1, result.getItems().size()); - assertSame(testAcspMemberships.get(0), result.getItems().get(0)); - verify(acspMembersRepository).fetchActiveAcspMembersByUserId(testUser.getUserId()); - verify(acspMembershipCollectionMappers).daoToDto(testActiveAcspMembersDaos, testUser, null); + @Nested + class FindAllByAcspNumberAndRole { + + @Test + void findAllByAcspNumberAndRoleWithRoleAndIncludeRemovedTrue() { + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "TS002" ); + final var acspMembershipDtos = testDataManager.fetchAcspMembershipDtos( "TS002" ); + final var acspProfile = testDataManager.fetchAcspProfiles( "TSA001" ).getFirst(); + + Mockito.doReturn( new PageImpl<>( acspMembersDaos ) ).when( acspMembersRepository ).findAllByAcspNumberAndUserRole("TSA001", "admin", PageRequest.of(0, 10 ) ); + Mockito.doReturn( new AcspMembershipsList().items( acspMembershipDtos ) ).when( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspProfile ); + + final var result = acspMembersService.findAllByAcspNumberAndRole("TSA001", acspProfile, "admin", true, 0, 10 ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals(1, result.getItems().size() ); + Mockito.verify( acspMembersRepository ).findAllByAcspNumberAndUserRole( "TSA001", "admin", PageRequest.of(0, 10 ) ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspProfile ); + } + + @Test + void findAllByAcspNumberAndRoleWithRoleAndIncludeRemovedFalse() { + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "COM001", "COM002" ); + final var acspMembershipDtos = testDataManager.fetchAcspMembershipDtos( "COM001", "COM002" ); + final var acspAcspProfile = testDataManager.fetchAcspProfiles( "COMA001" ).getFirst(); + + Mockito.doReturn( new PageImpl<>( acspMembersDaos ) ).when( acspMembersRepository ).findAllNotRemovedByAcspNumberAndUserRole( "COMA001", "owner", PageRequest.of(0, 10 ) ); + Mockito.doReturn( new AcspMembershipsList().items( acspMembershipDtos ) ).when( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspAcspProfile ); + + final var result = acspMembersService.findAllByAcspNumberAndRole( "COMA001", acspAcspProfile, "owner", false, 0, 10 ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals( 2, result.getItems().size() ); + Mockito.verify( acspMembersRepository ).findAllNotRemovedByAcspNumberAndUserRole( "COMA001", "owner", PageRequest.of(0, 10 ) ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspAcspProfile ); + } + + @Test + void findAllByAcspNumberAndRoleWithoutRoleAndIncludeRemovedTrue() { + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "COM001", "COM002", "COM003" ); + final var acspMembershipDtos = testDataManager.fetchAcspMembershipDtos( "COM001", "COM002", "COM003" ); + final var acspAcspProfile = testDataManager.fetchAcspProfiles( "COMA001" ).getFirst(); + + Mockito.doReturn( new PageImpl<>( acspMembersDaos ) ).when( acspMembersRepository ).findAllByAcspNumber( "COMA001", PageRequest.of(0, 10 ) ); + Mockito.doReturn( new AcspMembershipsList().items( acspMembershipDtos ) ).when( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspAcspProfile ); + + final var result = acspMembersService.findAllByAcspNumberAndRole( "COMA001", acspAcspProfile, null, true, 0, 10 ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals( 3, result.getItems().size() ); + Mockito.verify( acspMembersRepository ).findAllByAcspNumber( "COMA001", PageRequest.of(0, 10 ) ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspAcspProfile ); + } + + @Test + void findAllByAcspNumberAndRoleWithoutRoleAndIncludeRemovedFalse() { + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "COM002" ); + final var acspMembershipDtos = testDataManager.fetchAcspMembershipDtos( "COM002" ); + final var acspAcspProfile = testDataManager.fetchAcspProfiles( "COMA001" ).getFirst(); + + Mockito.doReturn( new PageImpl<>( acspMembersDaos ) ).when( acspMembersRepository ).findAllByAcspNumber( "COMA001", PageRequest.of(0, 10 ) ); + Mockito.doReturn( new AcspMembershipsList().items( acspMembershipDtos ) ).when( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspAcspProfile ); + + final var result = acspMembersService.findAllByAcspNumberAndRole( "COMA001", acspAcspProfile, null, true, 0, 10 ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals( 1, result.getItems().size()) ; + Mockito.verify( acspMembersRepository ).findAllByAcspNumber( "COMA001", PageRequest.of(0, 10 ) ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( new PageImpl<>( acspMembersDaos ), null, acspAcspProfile ); + } } - @Test - void fetchAcspMembershipsReturnsEmptyListIfNoMemberships() { - when(acspMembersRepository.fetchAllAcspMembersByUserId(testUser.getUserId())) - .thenReturn(Collections.emptyList()); - when(acspMembershipCollectionMappers.daoToDto(Collections.emptyList(), testUser,null)) - .thenReturn(Collections.emptyList()); - - AcspMembershipsList result = acspMembersService.fetchAcspMemberships(testUser, true); - - assertNotNull(result); - assertTrue(result.getItems().isEmpty()); - verify(acspMembersRepository).fetchAllAcspMembersByUserId(testUser.getUserId()); - verify(acspMembershipCollectionMappers).daoToDto(Collections.emptyList(), testUser, null); + @Nested + class FetchMembership { + + @Test + void fetchMembershipWithNullMembershipIdThrowsIllegalArgumentException() { + Mockito.doThrow( new IllegalArgumentException( "Cannot be null" ) ).when( acspMembersRepository ).findById( isNull() ); + assertThrows( IllegalArgumentException.class, () -> acspMembersService.fetchMembership( null ) ); + } + + @Test + void fetchMembershipWithMalformedOrNonexistentMembershipIdReturnsEmptyOptional() { + Mockito.doReturn( Optional.empty() ).when( acspMembersRepository ).findById( "$$$" ); + Assertions.assertTrue( acspMembersService.fetchMembership( "$$$" ).isEmpty() ); + Mockito.verify( acspMembersRepository ).findById( "$$$" ); + } + + @Test + void fetchMembershipRetrievesMembership() { + final var acspMemberDao = testDataManager.fetchAcspMembersDaos( "TS001" ).getFirst(); + final var acspMembershipDto = testDataManager.fetchAcspMembershipDtos( "TS001" ).getFirst(); + + Mockito.doReturn( Optional.of( acspMemberDao ) ).when( acspMembersRepository ).findById( "TS001" ); + Mockito.doReturn( acspMembershipDto ).when( acspMembershipCollectionMappers ).daoToDto( acspMemberDao,null,null ); + + final var result = acspMembersService.fetchMembership( "TS001" ); + + Assertions.assertTrue( result.isPresent() ); + Assertions.assertSame( acspMembershipDto, result.get()); + Mockito.verify( acspMembersRepository ).findById( "TS001" ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( acspMemberDao,null,null ); + } } - } - - @Nested - class FindAllByAcspNumberAndRole { - private AcspProfile acspAcspProfile; - private Pageable pageable; - private Page pageResult; - - @BeforeEach - void setUp() { - acspAcspProfile = new AcspProfile(); - acspAcspProfile.setNumber("ACSP001"); - pageable = PageRequest.of(0, 10); - pageResult = new PageImpl<>(testAllAcspMembersDaos); + + @Nested + class FetchAcspMembershipsWithAcspNumber { + + @Test + void fetchAcspMembershipsWithAcspNumberReturnsAllMembersIfIncludeRemovedTrue() { + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "TS001" ); + final var acspMembershipsDtos = testDataManager.fetchAcspMembershipDtos( "TS001" ); + final var user = testDataManager.fetchUserDtos( "TSU001" ).getFirst(); + + Mockito.doReturn( acspMembersDaos ).when( acspMembersRepository ).fetchAllAcspMembersByUserIdAndAcspNumber( "TSU001", "TSA001" ); + Mockito.doReturn( acspMembershipsDtos ).when( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user,null ); + + final var result = acspMembersService.fetchAcspMemberships( user, true, "TSA001" ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals( 1, result.getItems().size() ); + Assertions.assertSame( acspMembershipsDtos, result.getItems() ); + Mockito.verify( acspMembersRepository ).fetchAllAcspMembersByUserIdAndAcspNumber( "TSU001", "TSA001" ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user, null ); + } + + @Test + void fetchAcspMembershipsWithAcspNumberReturnsActiveMembersIfIncludeRemovedFalse() { + final var acspMembersDaos = testDataManager.fetchAcspMembersDaos( "TS001" ); + final var acspMembershipsDtos = testDataManager.fetchAcspMembershipDtos( "TS001" ); + final var user = testDataManager.fetchUserDtos( "TSU001" ).getFirst(); + + Mockito.doReturn( acspMembersDaos ).when( acspMembersRepository ).fetchActiveAcspMembersByUserIdAndAcspNumber( "TSU001", "TSA001" ); + Mockito.doReturn( acspMembershipsDtos ).when( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user,null ); + + final var result = acspMembersService.fetchAcspMemberships( user, false, "TSA001" ); + + Assertions.assertNotNull( result ); + Assertions.assertEquals( 1, result.getItems().size() ); + Assertions.assertSame( acspMembershipsDtos, result.getItems() ); + Mockito.verify( acspMembersRepository ).fetchActiveAcspMembersByUserIdAndAcspNumber( "TSU001", "TSA001" ); + Mockito.verify( acspMembershipCollectionMappers ).daoToDto( acspMembersDaos, user, null ); + } } @Test - void findAllByAcspNumberAndRoleWithRoleAndIncludeRemovedTrue() { - when(acspMembersRepository.findAllByAcspNumberAndUserRole("ACSP001", "standard", pageable)) - .thenReturn(pageResult); - when(acspMembershipCollectionMappers.daoToDto(pageResult, null, testAcspProfile)) - .thenReturn(new AcspMembershipsList().items(testAcspMemberships)); - - AcspMembershipsList result = - acspMembersService.findAllByAcspNumberAndRole( - "ACSP001", testAcspProfile, "standard", true, 0, 10); - - assertNotNull(result); - assertEquals(2, result.getItems().size()); - verify(acspMembersRepository).findAllByAcspNumberAndUserRole("ACSP001", "standard", pageable); - verify(acspMembershipCollectionMappers).daoToDto(pageResult, null, testAcspProfile); + void fetchMembershipDaoWithNullMembershipIdThrowsIllegalArgumentException() { + Mockito.doThrow( new IllegalArgumentException( "Cannot be null" ) ).when( acspMembersRepository ).findById( isNull() ); + Assertions.assertThrows( IllegalArgumentException.class, () -> acspMembersService.fetchMembershipDao( null ) ); } @Test - void findAllByAcspNumberAndRoleWithRoleAndIncludeRemovedFalse() { - when(acspMembersRepository.findAllNotRemovedByAcspNumberAndUserRole( - "ACSP001", "standard", pageable)) - .thenReturn(pageResult); - when(acspMembershipCollectionMappers.daoToDto(pageResult, null, acspAcspProfile)) - .thenReturn(new AcspMembershipsList().items(testAcspMemberships)); - - AcspMembershipsList result = - acspMembersService.findAllByAcspNumberAndRole( - "ACSP001", acspAcspProfile, "standard", false, 0, 10); - - assertNotNull(result); - assertEquals(2, result.getItems().size()); - verify(acspMembersRepository) - .findAllNotRemovedByAcspNumberAndUserRole("ACSP001", "standard", pageable); - verify(acspMembershipCollectionMappers).daoToDto(pageResult, null, acspAcspProfile); + void fetchMembershipDaoWithMalformedOrNonExistentMembershipIdReturnsEmptyOptional() { + Assertions.assertFalse( acspMembersService.fetchMembershipDao( "£££" ).isPresent() ); + Assertions.assertFalse( acspMembersService.fetchMembershipDao( "TS001" ).isPresent() ); } @Test - void findAllByAcspNumberAndRoleWithoutRoleAndIncludeRemovedTrue() { - when(acspMembersRepository.findAllByAcspNumber("ACSP001", pageable)).thenReturn(pageResult); - when(acspMembershipCollectionMappers.daoToDto(pageResult, null, acspAcspProfile)) - .thenReturn(new AcspMembershipsList().items(testAcspMemberships)); - - AcspMembershipsList result = - acspMembersService.findAllByAcspNumberAndRole("ACSP001", acspAcspProfile, null, true, 0, 10); - - assertNotNull(result); - assertEquals(2, result.getItems().size()); - verify(acspMembersRepository).findAllByAcspNumber("ACSP001", pageable); - verify(acspMembershipCollectionMappers).daoToDto(pageResult, null, acspAcspProfile); + void fetchMembershipDaoRetrievesMembership() { + acspMembersService.fetchMembershipDao( "TS001" ); + Mockito.verify( acspMembersRepository ).findById( "TS001" ); } @Test - void findAllByAcspNumberAndRoleWithoutRoleAndIncludeRemovedFalse() { - when(acspMembersRepository.findAllNotRemovedByAcspNumber("ACSP001", pageable)) - .thenReturn(pageResult); - when(acspMembershipCollectionMappers.daoToDto(pageResult, null, acspAcspProfile)) - .thenReturn(new AcspMembershipsList().items(testAcspMemberships)); - - AcspMembershipsList result = - acspMembersService.findAllByAcspNumberAndRole("ACSP001", acspAcspProfile, null, false, 0, 10); - - assertNotNull(result); - assertEquals(2, result.getItems().size()); - verify(acspMembersRepository).findAllNotRemovedByAcspNumber("ACSP001", pageable); - verify(acspMembershipCollectionMappers).daoToDto(pageResult, null, acspAcspProfile); + void fetchNumberOfActiveOwnersWithNullOrMalformedOrNonexistentAcspNumberReturnsZero() { + Assertions.assertEquals( 0, acspMembersService.fetchNumberOfActiveOwners(null ) ); + Assertions.assertEquals( 0, acspMembersService.fetchNumberOfActiveOwners("£££" ) ); + Assertions.assertEquals( 0, acspMembersService.fetchNumberOfActiveOwners("TS001" ) ); } - } - @Nested - class FetchMembership { @Test - void fetchMembershipWithNullMembershipIdThrowsIllegalArgumentException() { - Mockito.doThrow(new IllegalArgumentException("Cannot be null")) - .when(acspMembersRepository) - .findById(isNull()); - assertThrows(IllegalArgumentException.class, () -> acspMembersService.fetchMembership(null)); + void fetchNumberOfActiveOwnersRetrievesNumberOfActiveOwnersAtAcsp() { + acspMembersService.fetchNumberOfActiveOwners( "COMA001" ); + Mockito.verify( acspMembersRepository ).fetchNumberOfActiveOwners( "COMA001" ); } @Test - void fetchMembershipWithMalformedOrNonexistentMembershipIdReturnsEmptyOptional() { - when(acspMembersRepository.findById("$$$")).thenReturn(Optional.empty()); - - Optional result = acspMembersService.fetchMembership("$$$"); - - assertFalse(result.isPresent()); - verify(acspMembersRepository).findById("$$$"); + void fetchActiveAcspMembershipWithNullOrMalformedOrNonexistentUserIdOrAcspNumberReturnsEmptyOptional() { + Assertions.assertFalse( acspMembersService.fetchActiveAcspMembership( null, "TSA001" ).isPresent() ); + Assertions.assertFalse( acspMembersService.fetchActiveAcspMembership( "£££", "TSA001" ).isPresent() ); + Assertions.assertFalse( acspMembersService.fetchActiveAcspMembership( "TSU001", null ).isPresent() ); + Assertions.assertFalse( acspMembersService.fetchActiveAcspMembership( "TSU001", "£££" ).isPresent() ); + Assertions.assertFalse( acspMembersService.fetchActiveAcspMembership( "TSU001", "TSA001" ).isPresent() ); } @Test - void fetchMembershipRetrievesMembership() { - AcspMembersDao acspMemberDao = testDataManager.fetchAcspMembersDaos("TS001").get(0); - AcspMembership expectedMembership = new AcspMembership(); + void fetchActiveAcspMembershipAppliedToInactiveMembershipReturnsEmptyOptional() { + Assertions.assertFalse( acspMembersService.fetchActiveAcspMembership( "TSU002", "TSA001" ).isPresent() ); + } - when(acspMembersRepository.findById("TS001")).thenReturn(Optional.of(acspMemberDao)); - when(acspMembershipCollectionMappers.daoToDto(acspMemberDao,null,null)).thenReturn(expectedMembership); + @Test + void fetchActiveAcspMembershipRetrievesMembership() { + acspMembersService.fetchActiveAcspMembership( "TSU001", "TSA001" ); + Mockito.verify( acspMembersRepository ).fetchActiveAcspMembership( "TSU001", "TSA001" ); + } - Optional result = acspMembersService.fetchMembership("TS001"); + @Test + void updateMembershipWithNullMembershipIdThrowsIllegalArgumentException() { + Assertions.assertThrows( IllegalArgumentException.class, () -> acspMembersService.updateMembership( null, UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002" ) ); + } - assertTrue(result.isPresent()); - assertSame(expectedMembership, result.get()); - verify(acspMembersRepository).findById("TS001"); - verify(acspMembershipCollectionMappers).daoToDto(acspMemberDao,null,null); + @Test + void updateMembershipWithMalformedOrNonexistentMembershipIdThrowsInternalServerErrorRuntimeException() { + Assertions.assertThrows( InternalServerErrorRuntimeException.class, () -> acspMembersService.updateMembership( "£££", UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002" ) ); + Assertions.assertThrows( InternalServerErrorRuntimeException.class, () -> acspMembersService.updateMembership( "TS001", UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002" ) ); } - } - @Nested - class FetchAcspMembershipsWithAcspNumber { + @Test + void updateMembershipWithNullUserStatusAndNotNullUserRoleOnlyUpdatesEtagAndRole() { + Mockito.doReturn( 1 ).when( acspMembersRepository ).updateAcspMembership( eq( "TS001" ), any( Update.class ) ); + acspMembersService.updateMembership("TS001", null, UserRoleEnum.STANDARD, "TSU002" ); + Mockito.verify(acspMembersRepository).updateAcspMembership( eq("TS001"), argThat( updateMatches( Map.of("user_role", UserRoleEnum.STANDARD.getValue() ) ) ) ); + } @Test - void fetchAcspMembershipsWithAcspNumberReturnsAllMembersIfIncludeRemovedTrue() { - when(acspMembersRepository.fetchAllAcspMembersByUserIdAndAcspNumber( - testUser.getUserId(), "ACSP001")) - .thenReturn(testAllAcspMembersDaos); - when(acspMembershipCollectionMappers.daoToDto(testAllAcspMembersDaos, testUser,null)) - .thenReturn(testAcspMemberships); - - AcspMembershipsList result = - acspMembersService.fetchAcspMemberships(testUser, true, "ACSP001"); - - assertNotNull(result); - assertEquals(2, result.getItems().size()); - assertSame(testAcspMemberships, result.getItems()); - verify(acspMembersRepository) - .fetchAllAcspMembersByUserIdAndAcspNumber(testUser.getUserId(), "ACSP001"); - verify(acspMembershipCollectionMappers).daoToDto(testAllAcspMembersDaos, testUser, null); + void updateMembershipWithNotNullUserStatusAndNullUserRoleOnlyUpdatesEtagAndStatusAndRemovedAtAndRemovedBy() { + Mockito.doReturn( 1 ).when( acspMembersRepository ).updateAcspMembership( eq( "TS001" ), any( Update.class ) ); + acspMembersService.updateMembership( "TS001", UserStatusEnum.REMOVED, null, "TSU002" ); + Mockito.verify( acspMembersRepository ).updateAcspMembership(eq( "TS001" ), argThat( updateMatches( Map.of("status", UserStatusEnum.REMOVED.getValue(), "removed_by", "TSU002") ) ) ); } @Test - void fetchAcspMembershipsWithAcspNumberReturnsActiveMembersIfIncludeRemovedFalse() { - when(acspMembersRepository.fetchActiveAcspMembersByUserIdAndAcspNumber( - testUser.getUserId(), "ACSP001")) - .thenReturn(testActiveAcspMembersDaos); - when(acspMembershipCollectionMappers.daoToDto(testActiveAcspMembersDaos, testUser,null)) - .thenReturn(Collections.singletonList(testAcspMemberships.get(0))); - - AcspMembershipsList result = - acspMembersService.fetchAcspMemberships(testUser, false, "ACSP001"); - - assertNotNull(result); - assertEquals(1, result.getItems().size()); - assertSame(testAcspMemberships.get(0), result.getItems().get(0)); - verify(acspMembersRepository) - .fetchActiveAcspMembersByUserIdAndAcspNumber(testUser.getUserId(), "ACSP001"); - verify(acspMembershipCollectionMappers).daoToDto(testActiveAcspMembersDaos, testUser,null); + void updateMembershipWithNotNullUserStatusAndNotNullUserRoleOnlyUpdatesEverything() { + Mockito.doReturn( 1 ).when( acspMembersRepository ).updateAcspMembership( eq( "TS001" ), any( Update.class ) ); + acspMembersService.updateMembership( "TS001", UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002" ); + Mockito.verify( acspMembersRepository ).updateAcspMembership( eq( "TS001" ), argThat( updateMatches( Map.of("user_role", UserRoleEnum.STANDARD.getValue(), "status", UserStatusEnum.REMOVED.getValue(), "removed_by", "TSU002" ) ) ) ); } - } - - @Test - void fetchMembershipDaoWithNullMembershipIdThrowsIllegalArgumentException() { - Mockito.doThrow(new IllegalArgumentException("Cannot be null")) - .when(acspMembersRepository) - .findById(isNull()); - Assertions.assertThrows( - IllegalArgumentException.class, () -> acspMembersService.fetchMembershipDao(null)); - } - - @Test - void fetchMembershipDaoWithMalformedOrNonExistentMembershipIdReturnsEmptyOptional() { - Assertions.assertFalse(acspMembersService.fetchMembershipDao("£££").isPresent()); - Assertions.assertFalse(acspMembersService.fetchMembershipDao("TS001").isPresent()); - } - - @Test - void fetchMembershipDaoRetrievesMembership() { - acspMembersService.fetchMembershipDao("TS001"); - Mockito.verify(acspMembersRepository).findById("TS001"); - } - - @Test - void fetchNumberOfActiveOwnersWithNullOrMalformedOrNonexistentAcspNumberReturnsZero() { - Assertions.assertEquals(0, acspMembersService.fetchNumberOfActiveOwners(null)); - Assertions.assertEquals(0, acspMembersService.fetchNumberOfActiveOwners("£££")); - Assertions.assertEquals(0, acspMembersService.fetchNumberOfActiveOwners("TS001")); - } - - @Test - void fetchNumberOfActiveOwnersRetrievesNumberOfActiveOwnersAtAcsp() { - acspMembersService.fetchNumberOfActiveOwners("COMA001"); - Mockito.verify(acspMembersRepository).fetchNumberOfActiveOwners("COMA001"); - } - - @Test - void - fetchActiveAcspMembershipWithNullOrMalformedOrNonexistentUserIdOrAcspNumberReturnsEmptyOptional() { - Assertions.assertFalse( - acspMembersService.fetchActiveAcspMembership(null, "TSA001").isPresent()); - Assertions.assertFalse( - acspMembersService.fetchActiveAcspMembership("£££", "TSA001").isPresent()); - Assertions.assertFalse( - acspMembersService.fetchActiveAcspMembership("TSU001", null).isPresent()); - Assertions.assertFalse( - acspMembersService.fetchActiveAcspMembership("TSU001", "£££").isPresent()); - Assertions.assertFalse( - acspMembersService.fetchActiveAcspMembership("TSU001", "TSA001").isPresent()); - } - - @Test - void fetchActiveAcspMembershipAppliedToInactiveMembershipReturnsEmptyOptional() { - Assertions.assertFalse( - acspMembersService.fetchActiveAcspMembership("TSU002", "TSA001").isPresent()); - } - - @Test - void fetchActiveAcspMembershipRetrievesMembership() { - acspMembersService.fetchActiveAcspMembership("TSU001", "TSA001"); - Mockito.verify(acspMembersRepository).fetchActiveAcspMembership("TSU001", "TSA001"); - } - - @Test - void updateMembershipWithNullMembershipIdThrowsIllegalArgumentException() { - Assertions.assertThrows( - IllegalArgumentException.class, - () -> - acspMembersService.updateMembership( - null, UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002")); - } - - @Test - void - updateMembershipWithMalformedOrNonexistentMembershipIdThrowsInternalServerErrorRuntimeException() { - Assertions.assertThrows( - InternalServerErrorRuntimeException.class, - () -> - acspMembersService.updateMembership( - "£££", UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002")); - Assertions.assertThrows( - InternalServerErrorRuntimeException.class, - () -> - acspMembersService.updateMembership( - "TS001", UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002")); - } - - @Test - void updateMembershipWithNullUserStatusAndNotNullUserRoleOnlyUpdatesEtagAndRole() { - Mockito.doReturn(1) - .when(acspMembersRepository) - .updateAcspMembership(eq("TS001"), any(Update.class)); - acspMembersService.updateMembership("TS001", null, UserRoleEnum.STANDARD, "TSU002"); - Mockito.verify(acspMembersRepository) - .updateAcspMembership( - eq("TS001"), - argThat(updateMatches(Map.of("user_role", UserRoleEnum.STANDARD.getValue())))); - } - - @Test - void - updateMembershipWithNotNullUserStatusAndNullUserRoleOnlyUpdatesEtagAndStatusAndRemovedAtAndRemovedBy() { - Mockito.doReturn(1) - .when(acspMembersRepository) - .updateAcspMembership(eq("TS001"), any(Update.class)); - acspMembersService.updateMembership("TS001", UserStatusEnum.REMOVED, null, "TSU002"); - Mockito.verify(acspMembersRepository) - .updateAcspMembership( - eq("TS001"), - argThat( - updateMatches( - Map.of("status", UserStatusEnum.REMOVED.getValue(), "removed_by", "TSU002")))); - } - - @Test - void updateMembershipWithNotNullUserStatusAndNotNullUserRoleOnlyUpdatesEverything() { - Mockito.doReturn(1) - .when(acspMembersRepository) - .updateAcspMembership(eq("TS001"), any(Update.class)); - acspMembersService.updateMembership( - "TS001", UserStatusEnum.REMOVED, UserRoleEnum.STANDARD, "TSU002"); - Mockito.verify(acspMembersRepository) - .updateAcspMembership( - eq("TS001"), - argThat( - updateMatches( - Map.of( - "user_role", - UserRoleEnum.STANDARD.getValue(), - "status", - UserStatusEnum.REMOVED.getValue(), - "removed_by", - "TSU002")))); - } - - @Nested - class AddAcspMember { + @Test void addAcspMemberReturnsAddedAcspMembersDao() { - // Given - final var user = testDataManager.fetchUserDtos("TSU001").getFirst(); - final var acspNumber = "TS001"; - final var userRole = AcspMembership.UserRoleEnum.ADMIN; - final var addedByUserId = "COMU001"; - final var newAcspMembersDao = new AcspMembersDao(); - newAcspMembersDao.setUserId(user.getUserId()); - newAcspMembersDao.setAcspNumber(acspNumber); - newAcspMembersDao.setUserRole(userRole.getValue()); - newAcspMembersDao.setAddedBy(addedByUserId); - newAcspMembersDao.setEtag(generateEtag()); - newAcspMembersDao.setStatus(AcspMembership.MembershipStatusEnum.ACTIVE.getValue()); - when(acspMembersRepository.insert(any(AcspMembersDao.class))).thenReturn(newAcspMembersDao); - // When - final var result = - acspMembersService.addAcspMember(user.getUserId(), acspNumber, userRole, addedByUserId); - // Then - assertEquals(user.getUserId(), result.getUserId()); - assertEquals(acspNumber, result.getAcspNumber()); - assertEquals(userRole.getValue(), result.getUserRole()); - assertEquals(addedByUserId, result.getAddedBy()); - assertEquals(AcspMembership.MembershipStatusEnum.ACTIVE.getValue(), result.getStatus()); - assertFalse(result.getEtag().isEmpty()); - verify(acspMembersRepository) - .insert( - argThat( - (ArgumentMatcher) - dao -> - dao.getUserId().equals(user.getUserId()) - && dao.getAcspNumber().equals(acspNumber) - && dao.getUserRole().equals(userRole.getValue()) - && dao.getAddedBy().equals(addedByUserId) - && dao.getStatus() - .equals(AcspMembership.MembershipStatusEnum.ACTIVE.getValue()))); + final var acspMembersDao = testDataManager.fetchAcspMembersDaos( "COM004" ).getFirst(); + + Mockito.doReturn( acspMembersDao ).when( acspMembersRepository ).insert( any( AcspMembersDao.class ) ); + + final var result = acspMembersService.addAcspMember( "COMU004", "COMA001", UserRoleEnum.ADMIN, "COMU002" ); + + Assertions.assertEquals( "COMU004", result.getUserId() ); + Assertions.assertEquals( "COMA001", result.getAcspNumber() ); + Assertions.assertEquals( UserRoleEnum.ADMIN.getValue(), result.getUserRole() ); + Assertions.assertEquals( "COMU002", result.getAddedBy() ); + Assertions.assertEquals( MembershipStatusEnum.ACTIVE.getValue(), result.getStatus() ); + Assertions.assertFalse( result.getEtag().isEmpty() ); + Mockito.verify( acspMembersRepository ).insert( argThat( comparisonUtils.compare( acspMembersDao, List.of( "userId", "acspNumber", "userRole", "addedBy", "status" ), List.of(), Map.of() ) ) ); } - } - @Nested - class AddAcspMembership { @Test void addAcspMembershipReturnsAddedAcspMembership() { - // Given - final var user = testDataManager.fetchUserDtos("TSU001").getFirst(); - final var acspProfile = testDataManager.fetchAcspProfiles("TSA001").getFirst(); - final var acspNumber = "TS001"; - final var userRole = AcspMembership.UserRoleEnum.ADMIN; - final var addedByUserId = "COMU001"; - final var newAcspMembersDao = new AcspMembersDao(); - newAcspMembersDao.setUserId(user.getUserId()); - newAcspMembersDao.setAcspNumber(acspNumber); - newAcspMembersDao.setUserRole(userRole.getValue()); - newAcspMembersDao.setAddedBy(addedByUserId); - newAcspMembersDao.setEtag(generateEtag()); - newAcspMembersDao.setStatus(AcspMembership.MembershipStatusEnum.ACTIVE.getValue()); - when(acspMembersRepository.insert(any(AcspMembersDao.class))).thenReturn(newAcspMembersDao); - final var expectedMembership = new AcspMembership(); - expectedMembership.setUserId(user.getUserId()); - when(acspMembershipCollectionMappers.daoToDto( - any(AcspMembersDao.class), any(User.class), any(AcspProfile.class))) - .thenReturn(expectedMembership); - // When - final var result = - acspMembersService.addAcspMembership(user, acspProfile, acspNumber, userRole, addedByUserId); - // Then - assertEquals(user.getUserId(), result.getUserId()); + final var acspMembersDao = testDataManager.fetchAcspMembersDaos( "COM004" ).getFirst(); + final var acspMembershipDto = testDataManager.fetchAcspMembershipDtos( "COM004" ).getFirst(); + final var userDto = testDataManager.fetchUserDtos( "COMU004" ).getFirst(); + final var acspProfile = testDataManager.fetchAcspProfiles( "COMA001" ).getFirst(); + + Mockito.doReturn( acspMembersDao ).when( acspMembersRepository ).insert( any( AcspMembersDao.class ) ); + Mockito.doReturn( acspMembershipDto ).when( acspMembershipCollectionMappers ).daoToDto( acspMembersDao, userDto, acspProfile ); + + final var result = acspMembersService.addAcspMembership( userDto, acspProfile, "COMA001", UserRoleEnum.ADMIN, "COMU002" ); + + assertEquals( "COMU004", result.getUserId() ); } - } + } diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/UsersServiceTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/UsersServiceTest.java index d091854..4a8a2ab 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/UsersServiceTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/service/UsersServiceTest.java @@ -1,7 +1,6 @@ package uk.gov.companieshouse.acsp.manage.users.service; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; import com.google.api.client.http.HttpHeaders; import com.google.api.client.http.HttpResponseException.Builder; @@ -29,17 +28,17 @@ import uk.gov.companieshouse.api.handler.exception.URIValidationException; import uk.gov.companieshouse.api.model.ApiResponse; -@ExtendWith(MockitoExtension.class) -@Tag("unit-test") +@ExtendWith( MockitoExtension.class ) +@Tag( "unit-test" ) class UsersServiceTest { @Mock private AccountsUserEndpoint accountsUserEndpoint; @Mock - PrivateAccountsUserUserGet privateAccountsUserUserGet; + private PrivateAccountsUserUserGet privateAccountsUserUserGet; - private final TestDataManager testDataManager = TestDataManager.getInstance(); + private static final TestDataManager testDataManager = TestDataManager.getInstance(); @InjectMocks private UsersService usersService; @@ -191,43 +190,27 @@ void searchUserDetailsWithIncorrectlyFormattedUriThrowsInternalServerError() thr Assertions.assertThrows( InternalServerErrorRuntimeException.class, () -> usersService.searchUserDetails( emails ) ); } - @Test - void doesUserExist_UserExists_ReturnsTrue() throws Exception { - String userId = "existingUser"; - User user = new User().userId(userId); - ApiResponse response = new ApiResponse<>(200, Map.of(), user); - - when(accountsUserEndpoint.createGetUserDetailsRequest(userId)) - .thenReturn(privateAccountsUserUserGet); - when(privateAccountsUserUserGet.execute()).thenReturn(response); - - Assertions.assertTrue(usersService.doesUserExist(userId)); - } - - @Test - void doesUserExist_UserDoesNotExist_ReturnsFalse() throws Exception { - String userId = "nonExistentUser"; - - when(accountsUserEndpoint.createGetUserDetailsRequest(userId)) - .thenReturn(privateAccountsUserUserGet); - when(privateAccountsUserUserGet.execute()) - .thenThrow(new ApiErrorResponseException(new Builder(404, "Not found", new HttpHeaders()))); - - Assertions.assertFalse(usersService.doesUserExist(userId)); - } - - @Test - void doesUserExist_OtherException_Rethrows() throws Exception { - String userId = "exceptionUser"; + @Test + void doesUserExist_UserExists_ReturnsTrue() throws Exception { + final var userDto = testDataManager.fetchUserDtos( "TSU001" ).getFirst(); + Mockito.doReturn( privateAccountsUserUserGet ).when( accountsUserEndpoint ).createGetUserDetailsRequest( "TSU001" ); + Mockito.doReturn( new ApiResponse<>( 200, Map.of(), userDto ) ).when( privateAccountsUserUserGet ).execute(); + Assertions.assertTrue( usersService.doesUserExist( "TSU001" ) ); + } - when(accountsUserEndpoint.createGetUserDetailsRequest(userId)) - .thenReturn(privateAccountsUserUserGet); - when(privateAccountsUserUserGet.execute()) - .thenThrow(new InternalServerErrorRuntimeException("Unexpected error")); + @Test + void doesUserExist_UserDoesNotExist_ReturnsFalse() throws Exception { + Mockito.doReturn( privateAccountsUserUserGet ).when( accountsUserEndpoint ).createGetUserDetailsRequest( "TSU001" ); + Mockito.doThrow( new ApiErrorResponseException( new Builder(404, "Not found", new HttpHeaders() ) ) ).when( privateAccountsUserUserGet ).execute(); + Assertions.assertFalse( usersService.doesUserExist( "TSU001" ) ); + } - Assertions.assertThrows( - InternalServerErrorRuntimeException.class, () -> usersService.doesUserExist(userId)); - } + @Test + void doesUserExist_OtherException_Rethrows() throws Exception { + Mockito.doReturn( privateAccountsUserUserGet ).when( accountsUserEndpoint ).createGetUserDetailsRequest( "TSU001" ); + Mockito.doThrow( new InternalServerErrorRuntimeException("Unexpected error") ).when( privateAccountsUserUserGet ).execute(); + Assertions.assertThrows( InternalServerErrorRuntimeException.class, () -> usersService.doesUserExist( "TSU001" ) ); + } @Test void fetchUserDetailsWithNullThrowsNullPointerException(){ diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/PaginationValidatorUtilTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/PaginationValidatorUtilTest.java index 24fb3d8..6d60eb8 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/PaginationValidatorUtilTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/PaginationValidatorUtilTest.java @@ -4,45 +4,38 @@ import org.junit.jupiter.api.Test; import uk.gov.companieshouse.acsp.manage.users.exceptions.BadRequestRuntimeException; -import uk.gov.companieshouse.acsp.manage.users.utils.PaginationValidatorUtil.PaginationParams; class PaginationValidatorUtilTest { @Test void testValidateAndGetParamsWithValidParams() { - PaginationParams params = PaginationValidatorUtil.validateAndGetParams(1, 10); - assertEquals(1, params.pageIndex); - assertEquals(10, params.itemsPerPage); + final var params = PaginationValidatorUtil.validateAndGetParams( 1, 10 ); + assertEquals( 1, params.pageIndex ); + assertEquals( 10, params.itemsPerPage ); } @Test void testValidateAndGetParamsWithNullParams() { - PaginationParams params = PaginationValidatorUtil.validateAndGetParams(null, null); - assertEquals(0, params.pageIndex); - assertEquals(15, params.itemsPerPage); + final var params = PaginationValidatorUtil.validateAndGetParams( null, null ); + assertEquals( 0, params.pageIndex ); + assertEquals( 15, params.itemsPerPage ); } @Test void testValidateAndGetParamsWithNegativePageIndex() { - Exception exception = assertThrows(BadRequestRuntimeException.class, () -> - PaginationValidatorUtil.validateAndGetParams(-1, 10) - ); - assertEquals("Please check the request and try again", exception.getMessage()); + final var exception = assertThrows( BadRequestRuntimeException.class, () -> PaginationValidatorUtil.validateAndGetParams( -1, 10 ) ); + assertEquals( "Please check the request and try again", exception.getMessage() ); } @Test void testValidateAndGetParamsWithZeroItemsPerPage() { - Exception exception = assertThrows(BadRequestRuntimeException.class, () -> - PaginationValidatorUtil.validateAndGetParams(1, 0) - ); - assertEquals("Please check the request and try again", exception.getMessage()); + final var exception = assertThrows( BadRequestRuntimeException.class, () -> PaginationValidatorUtil.validateAndGetParams( 1, 0 ) ); + assertEquals( "Please check the request and try again", exception.getMessage() ); } @Test void testValidateAndGetParamsWithNegativeItemsPerPage() { - Exception exception = assertThrows(BadRequestRuntimeException.class, () -> - PaginationValidatorUtil.validateAndGetParams(1, -1) - ); - assertEquals("Please check the request and try again", exception.getMessage()); + final var exception = assertThrows( BadRequestRuntimeException.class, () -> PaginationValidatorUtil.validateAndGetParams( 1, -1 ) ); + assertEquals( "Please check the request and try again", exception.getMessage() ); } } diff --git a/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/RequestContextUtilTest.java b/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/RequestContextUtilTest.java index 4a52fab..27611e8 100644 --- a/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/RequestContextUtilTest.java +++ b/src/test/java/uk/gov/companieshouse/acsp/manage/users/utils/RequestContextUtilTest.java @@ -18,10 +18,10 @@ class RequestContextUtilTest { @Test void isOAuth2RequestReturnsTrueIfEricIdentityTypeIsOAuth2(){ - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader( ERIC_IDENTITY_TYPE, "oauth2" ); - ServletRequestAttributes requestAttributes = new ServletRequestAttributes( request ); + final var requestAttributes = new ServletRequestAttributes( request ); RequestContextHolder.setRequestAttributes( requestAttributes ); Assertions.assertTrue( isOAuth2Request() ); @@ -29,10 +29,10 @@ void isOAuth2RequestReturnsTrueIfEricIdentityTypeIsOAuth2(){ @Test void isOAuth2RequestReturnsFalseIfEricIdentityTypeIsNotOAuth2(){ - MockHttpServletRequest request = new MockHttpServletRequest(); + final var request = new MockHttpServletRequest(); request.addHeader( ERIC_IDENTITY_TYPE, "key" ); - ServletRequestAttributes requestAttributes = new ServletRequestAttributes( request ); + final var requestAttributes = new ServletRequestAttributes( request ); RequestContextHolder.setRequestAttributes( requestAttributes ); Assertions.assertFalse( isOAuth2Request() );