diff --git a/src/main/java/org/ays/auth/config/SecurityConfiguration.java b/src/main/java/org/ays/auth/config/SecurityConfiguration.java index 58d3b6324..12f05e5ed 100644 --- a/src/main/java/org/ays/auth/config/SecurityConfiguration.java +++ b/src/main/java/org/ays/auth/config/SecurityConfiguration.java @@ -137,9 +137,9 @@ SecurityFilterChain filterChain(final HttpSecurity httpSecurity, .requestMatchers(HttpMethod.GET, "/public/**").permitAll() .requestMatchers(HttpMethod.POST, "/api/v1/authentication/**").permitAll() .requestMatchers(HttpMethod.GET, "/api/v1/authentication/password/**").permitAll() - .requestMatchers(HttpMethod.GET, "/api/v1/admin-registration-application/*/summary").permitAll() - .requestMatchers(HttpMethod.POST, "/api/v1/admin-registration-application/*/complete").permitAll() - .requestMatchers(HttpMethod.POST, "/api/v1/emergency-evacuation-application").permitAll() + .requestMatchers(HttpMethod.GET, "/api/v1/admin-registration-application/*/summary", "/api/institution/v1/admin-registration-application/*/summary").permitAll() + .requestMatchers(HttpMethod.POST, "/api/v1/admin-registration-application/*/complete", "/api/institution/v1/admin-registration-application/*/complete").permitAll() + .requestMatchers(HttpMethod.POST, "/api/v1/emergency-evacuation-application", "/api/landing/v1/emergency-evacuation-application").permitAll() .anyRequest().authenticated() ) .sessionManagement(customizer -> customizer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) diff --git a/src/main/java/org/ays/auth/controller/AdminRegistrationApplicationController.java b/src/main/java/org/ays/auth/controller/AdminRegistrationApplicationController.java index 99fe58a63..82a56a58d 100644 --- a/src/main/java/org/ays/auth/controller/AdminRegistrationApplicationController.java +++ b/src/main/java/org/ays/auth/controller/AdminRegistrationApplicationController.java @@ -41,7 +41,7 @@ @Validated @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1") +@RequestMapping({"/api/v1", "/api/institution/v1"}) class AdminRegistrationApplicationController { private final AdminRegistrationApplicationService adminRegistrationApplicationService; diff --git a/src/main/java/org/ays/auth/controller/AysPermissionController.java b/src/main/java/org/ays/auth/controller/AysPermissionController.java index a74c340f3..e574b3d39 100644 --- a/src/main/java/org/ays/auth/controller/AysPermissionController.java +++ b/src/main/java/org/ays/auth/controller/AysPermissionController.java @@ -19,7 +19,7 @@ */ @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1") +@RequestMapping({"/api/v1", "/api/institution/v1"}) class AysPermissionController { private final AysPermissionService permissionService; diff --git a/src/main/java/org/ays/auth/controller/AysRoleController.java b/src/main/java/org/ays/auth/controller/AysRoleController.java index 319879918..f61af6c9e 100644 --- a/src/main/java/org/ays/auth/controller/AysRoleController.java +++ b/src/main/java/org/ays/auth/controller/AysRoleController.java @@ -44,7 +44,7 @@ @Validated @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1") +@RequestMapping({"/api/v1", "/api/institution/v1"}) class AysRoleController { private final AysRoleReadService roleReadService; diff --git a/src/main/java/org/ays/auth/controller/AysUserController.java b/src/main/java/org/ays/auth/controller/AysUserController.java index f7c8f49c3..872fc0c5e 100644 --- a/src/main/java/org/ays/auth/controller/AysUserController.java +++ b/src/main/java/org/ays/auth/controller/AysUserController.java @@ -38,7 +38,7 @@ @Validated @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1") +@RequestMapping({"/api/v1", "/api/institution/v1"}) class AysUserController { private final AysUserReadService userReadService; diff --git a/src/main/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationController.java b/src/main/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationController.java index 6453ce8b2..3189b86fe 100644 --- a/src/main/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationController.java +++ b/src/main/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationController.java @@ -23,18 +23,15 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * REST controller class for managing emergency evacuation application-related operations via HTTP requests. * This controller handles the business operations for emergency evacuation applications in the system. - * The mapping path for this controller is "/api/v1/emergency-evacuation-application". */ @Validated @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1") class EmergencyEvacuationApplicationController { private final EmergencyEvacuationApplicationService emergencyEvacuationApplicationService; @@ -50,7 +47,7 @@ class EmergencyEvacuationApplicationController { * @param listRequest The request body containing the parameters for listing emergency evacuation applications. * @return A response containing a paginated list of {@link EmergencyEvacuationApplicationsResponse}. */ - @PostMapping("/emergency-evacuation-applications") + @PostMapping({"/api/v1/emergency-evacuation-applications", "/api/institution/v1/emergency-evacuation-applications"}) @PreAuthorize("hasAnyAuthority('application:evacuation:list')") public AysResponse> findAll( @RequestBody @Valid EmergencyEvacuationApplicationListRequest listRequest) { @@ -64,13 +61,14 @@ public AysResponse> fin return AysResponse.successOf(pageOfEmergencyEvacuationApplicationsResponse); } + /** * Handles GET requests for retrieving the details of an emergency evacuation application by its ID. * * @param id the ID of the emergency evacuation application to retrieve * @return a response entity containing the details of the emergency evacuation application */ - @GetMapping("/emergency-evacuation-application/{id}") + @GetMapping({"/api/v1/emergency-evacuation-application/{id}", "/api/institution/v1/emergency-evacuation-application/{id}"}) @PreAuthorize("hasAuthority('application:evacuation:detail')") public AysResponse findById(@PathVariable @UUID String id) { final EmergencyEvacuationApplication emergencyEvacuationApplication = emergencyEvacuationApplicationService.findById(id); @@ -88,7 +86,7 @@ public AysResponse findById(@PathVariabl * @return a response indicating the success of the operation */ @CheckEmergencyEvacuationApplicationActivity - @PostMapping("/emergency-evacuation-application") + @PostMapping({"/api/v1/emergency-evacuation-application", "/api/landing/v1/emergency-evacuation-application"}) public AysResponse create(@RequestBody @Valid EmergencyEvacuationApplicationRequest emergencyEvacuationApplicationRequest) { emergencyEvacuationApplicationService.create(emergencyEvacuationApplicationRequest); return AysResponse.success(); @@ -108,7 +106,7 @@ public AysResponse create(@RequestBody @Valid EmergencyEvacuationApplicati * @param updateRequest the request object containing the details to update the Emergency Evacuation Application * @return a response indicating the success of the update operation */ - @PutMapping("/emergency-evacuation-application/{id}") + @PutMapping({"/api/v1/emergency-evacuation-application/{id}", "/api/institution/v1/emergency-evacuation-application/{id}"}) @PreAuthorize("hasAuthority('application:evacuation:update')") public AysResponse update(@PathVariable @UUID final String id, @RequestBody @Valid final EmergencyEvacuationApplicationUpdateRequest updateRequest) { diff --git a/src/main/java/org/ays/institution/controller/InstitutionController.java b/src/main/java/org/ays/institution/controller/InstitutionController.java index 435bf8a3d..fa961b933 100644 --- a/src/main/java/org/ays/institution/controller/InstitutionController.java +++ b/src/main/java/org/ays/institution/controller/InstitutionController.java @@ -20,7 +20,7 @@ */ @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1") +@RequestMapping({"/api/v1", "/api/institution/v1"}) class InstitutionController { private final InstitutionService institutionService; diff --git a/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationControllerOldTest.java b/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationControllerOldTest.java new file mode 100644 index 000000000..b014ea7a1 --- /dev/null +++ b/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationControllerOldTest.java @@ -0,0 +1,775 @@ +package org.ays.auth.controller; + +import org.ays.AysRestControllerTest; +import org.ays.auth.exception.AysAdminRegistrationApplicationNotExistByIdAuthException; +import org.ays.auth.model.AdminRegistrationApplication; +import org.ays.auth.model.AdminRegistrationApplicationBuilder; +import org.ays.auth.model.enums.AdminRegistrationApplicationStatus; +import org.ays.auth.model.mapper.AdminRegistrationApplicationToApplicationResponseMapper; +import org.ays.auth.model.mapper.AdminRegistrationApplicationToApplicationsResponseMapper; +import org.ays.auth.model.mapper.AdminRegistrationApplicationToCreateResponseMapper; +import org.ays.auth.model.mapper.AdminRegistrationApplicationToSummaryResponseMapper; +import org.ays.auth.model.request.AdminRegistrationApplicationCompleteRequest; +import org.ays.auth.model.request.AdminRegistrationApplicationCompleteRequestBuilder; +import org.ays.auth.model.request.AdminRegistrationApplicationCreateRequest; +import org.ays.auth.model.request.AdminRegistrationApplicationCreateRequestBuilder; +import org.ays.auth.model.request.AdminRegistrationApplicationListRequest; +import org.ays.auth.model.request.AdminRegistrationApplicationListRequestBuilder; +import org.ays.auth.model.request.AdminRegistrationApplicationRejectRequest; +import org.ays.auth.model.request.AdminRegistrationApplicationRejectRequestBuilder; +import org.ays.auth.model.response.AdminRegistrationApplicationCreateResponse; +import org.ays.auth.model.response.AdminRegistrationApplicationResponse; +import org.ays.auth.model.response.AdminRegistrationApplicationSummaryResponse; +import org.ays.auth.model.response.AdminRegistrationApplicationsResponse; +import org.ays.auth.service.AdminRegistrationApplicationService; +import org.ays.auth.service.AdminRegistrationCompleteService; +import org.ays.common.model.AysPage; +import org.ays.common.model.AysPageBuilder; +import org.ays.common.model.request.AysPhoneNumberRequest; +import org.ays.common.model.request.AysPhoneNumberRequestBuilder; +import org.ays.common.model.response.AysErrorResponse; +import org.ays.common.model.response.AysErrorResponseBuilder; +import org.ays.common.model.response.AysPageResponse; +import org.ays.common.model.response.AysResponse; +import org.ays.common.model.response.AysResponseBuilder; +import org.ays.institution.model.Institution; +import org.ays.institution.model.InstitutionBuilder; +import org.ays.util.AysMockMvcRequestBuilders; +import org.ays.util.AysMockResultMatchersBuilders; +import org.ays.util.AysValidTestData; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mockito; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import java.util.List; + +@Deprecated(since = "1.2.0 - Use or Develop AdminRegistrationApplicationControllerTest Class", forRemoval = true) +class AdminRegistrationApplicationControllerOldTest extends AysRestControllerTest { + + @MockitoBean + private AdminRegistrationApplicationService adminRegistrationApplicationService; + + @MockitoBean + private AdminRegistrationCompleteService adminRegistrationCompleteService; + + + private final AdminRegistrationApplicationToApplicationsResponseMapper adminRegistrationApplicationToApplicationsResponseMapper = AdminRegistrationApplicationToApplicationsResponseMapper.initialize(); + private final AdminRegistrationApplicationToApplicationResponseMapper adminRegistrationApplicationToApplicationResponseMapper = AdminRegistrationApplicationToApplicationResponseMapper.initialize(); + private final AdminRegistrationApplicationToSummaryResponseMapper adminRegistrationApplicationToSummaryResponseMapper = AdminRegistrationApplicationToSummaryResponseMapper.initialize(); + private final AdminRegistrationApplicationToCreateResponseMapper adminRegistrationApplicationToCreateResponseMapper = AdminRegistrationApplicationToCreateResponseMapper.initialize(); + + + private static final String BASE_PATH = "/api/v1"; + + + @Test + void givenValidAdminRegisterApplicationListRequest_whenAdminRegisterApplicationsFound_thenReturnAysPageResponseOfAdminRegisterApplicationsResponse() throws Exception { + + // Given + AdminRegistrationApplicationListRequest mockListRequest = new AdminRegistrationApplicationListRequestBuilder() + .withValidValues() + .build(); + + // When + List mockApplications = List.of( + new AdminRegistrationApplicationBuilder().withValidValues().build() + ); + + AysPage mockApplicationPage = AysPageBuilder + .from(mockApplications, mockListRequest.getPageable()); + + Mockito.when(adminRegistrationApplicationService.findAll(Mockito.any(AdminRegistrationApplicationListRequest.class))) + .thenReturn(mockApplicationPage); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + List mockApplicationsResponse = adminRegistrationApplicationToApplicationsResponseMapper.map(mockApplications); + AysPageResponse pageOfResponse = AysPageResponse.builder() + .of(mockApplicationPage) + .content(mockApplicationsResponse) + .build(); + AysResponse> mockResponse = AysResponse + .successOf(pageOfResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.times(1)) + .findAll(Mockito.any(AdminRegistrationApplicationListRequest.class)); + } + + @Test + void givenValidAdminRegisterApplicationListRequest_whenUnauthorizedForListing_thenReturnAccessDeniedException() throws Exception { + // Given + AdminRegistrationApplicationListRequest mockListRequest = new AdminRegistrationApplicationListRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.never()) + .findAll(Mockito.any(AdminRegistrationApplicationListRequest.class)); + } + + @Test + void givenValidAdminRegisterApplicationId_whenAdminRegisterApplicationFound_thenReturnAdminRegisterApplicationResponse() throws Exception { + + // Given + String mockApplicationId = "a0c2351d-54ce-4019-8ffe-a2f8a2700824"; + + // When + AdminRegistrationApplication mockRegisterApplication = new AdminRegistrationApplicationBuilder() + .withId(mockApplicationId) + .build(); + Mockito.when(adminRegistrationApplicationService.findById(mockApplicationId)) + .thenReturn(mockRegisterApplication); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockApplicationId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockSuperAdminToken.getAccessToken()); + + AdminRegistrationApplicationResponse mockApplicationResponse = adminRegistrationApplicationToApplicationResponseMapper + .map(mockRegisterApplication); + AysResponse mockResponse = AysResponse + .successOf(mockApplicationResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.times(1)) + .findById(mockApplicationId); + + } + + @Test + void givenValidAdminRegisterApplicationId_whenUnauthorizedForGettingAdminRegisterApplicationById_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockApplicationId = "68c867b4-e84a-405c-b1ab-f8dcaa9c41f2"; + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/".concat(mockApplicationId)); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.never()) + .findById(mockApplicationId); + } + + @ParameterizedTest + @ValueSource(strings = { + "This is a valid text with sufficient length and contains alphabetic characters.", + "This text includes numbers 12345 and still should be accepted because it's within limits.", + "This text, which includes punctuation marks, should be accepted.", + "ÇalıŞkan ve dÜrüst İnsanlar her zaman başarıyı yakalar.(:;?/)" + }) + void givenValidAdminRegisterApplicationCreateRequest_whenCreatingAdminRegisterApplication_thenReturnAdminRegisterApplicationCreateResponse(String reason) throws Exception { + + // Given + AdminRegistrationApplicationCreateRequest mockRequest = new AdminRegistrationApplicationCreateRequestBuilder() + .withValidValues() + .withInstitutionId(AysValidTestData.SuperAdmin.INSTITUTION_ID) + .withReason(reason) + .build(); + + // When + Institution mockInstitution = new InstitutionBuilder() + .withId(mockRequest.getInstitutionId()) + .build(); + AdminRegistrationApplication mockRegisterApplication = new AdminRegistrationApplicationBuilder() + .withValidValues() + .withInstitution(mockInstitution) + .withReason(mockRequest.getReason()) + .withStatus(AdminRegistrationApplicationStatus.WAITING) + .build(); + + Mockito.when(adminRegistrationApplicationService.create(Mockito.any(AdminRegistrationApplicationCreateRequest.class))) + .thenReturn(mockRegisterApplication); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockRequest); + + AdminRegistrationApplicationCreateResponse mockApplicationCreateResponse = adminRegistrationApplicationToCreateResponseMapper + .map(mockRegisterApplication); + AysResponse mockResponse = AysResponse.successOf(mockApplicationCreateResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.times(1)) + .create(Mockito.any(AdminRegistrationApplicationCreateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "Invalid reason with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "Too short", + " a", + " spaceAtTheBeginning", + "spaceAtTheEnd ", + " both ", + " justAString ", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vestibulum commodo turpis, sed venenatis sapien suscipit sit amet. Etiam malesuada, ligula in semper varius, nisi mi pulvinar libero, ut commodo dolor orci quis urna. Vivamus ac euismod ex. Proin vel vulputate orci. Ut id nibh finibus, mattis sem id, maximus ante. Proin fringilla ipsum at arcu venenatis, non bibendum justo luctus. Phasellus vestibulum feugiat est sit amet bibendum. Donec nulla leo, ultricies sed pharetra sed, hendrerit vel nunc." + }) + void givenInvalidAdminRegisterApplicationCreateRequest_whenCreatingAdminRegisterApplication_thenReturnValidationError(String invalidReason) throws Exception { + + // Given + AdminRegistrationApplicationCreateRequest createRequest = new AdminRegistrationApplicationCreateRequestBuilder() + .withValidValues() + .withReason(invalidReason) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), createRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.never()) + .create(Mockito.any(AdminRegistrationApplicationCreateRequest.class)); + } + + @Test + void givenValidAdminRegisterApplicationCreateRequest_whenUnauthorizedForCreatingAdminRegisterApplication_thenReturnAccessDeniedException() throws Exception { + + // Given + AdminRegistrationApplicationCreateRequest mockRequest = new AdminRegistrationApplicationCreateRequestBuilder() + .withValidValues() + .withInstitutionId(AysValidTestData.SuperAdmin.INSTITUTION_ID) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.never()) + .create(Mockito.any(AdminRegistrationApplicationCreateRequest.class)); + } + + + @Test + void givenValidAdminRegisterApplicationId_whenAdminApplicationFound_thenReturnAdminApplicationSummaryResponse() throws Exception { + + // Given + String mockId = "085fbe72-caa7-439d-8db1-166ed005e120"; + AdminRegistrationApplication mockAdminRegistrationApplication = new AdminRegistrationApplicationBuilder() + .withId(mockId) + .build(); + + // When + Mockito.when(adminRegistrationApplicationService.findSummaryById(mockId)) + .thenReturn(mockAdminRegistrationApplication); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/".concat(mockId).concat("/summary")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint); + + AdminRegistrationApplicationSummaryResponse mockSummaryResponse = adminRegistrationApplicationToSummaryResponseMapper + .map(mockAdminRegistrationApplication); + AysResponse mockResponse = AysResponse + .successOf(mockSummaryResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + } + + @Test + void givenIdAndAdminRegisterApplication_whenAdminApplicationNotFound_thenReturnUnauthorizedError() throws Exception { + + // Given + String mockId = "181e8310-6dfd-444c-aa38-056ce8401345"; + + // When + Mockito.when(adminRegistrationApplicationService.findSummaryById(mockId)) + .thenThrow(new AysAdminRegistrationApplicationNotExistByIdAuthException(mockId)); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/".concat(mockId).concat("/summary")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.UNAUTHORIZED; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isUnauthorized()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotHaveJsonPath()); + } + + + @ParameterizedTest + @ValueSource(strings = { + "a@b.co", + "abcdef@mail.com", + "abc+def@archive.com", + "john.doe123@example.co.uk", + "admin_123@example.org", + "admin-test@ays.com", + "johndoe@gmail.com", + "janedoe123@yahoo.com", + "michael.jordan@nba.com", + "alice.smith@company.co.uk", + "info@mywebsite.org", + "support@helpdesk.net", + "rajeshmehmetjosephanastasiyahamidjianguonalalitachunoscarmanojfelixmichaelhugoaslambeatrizsergeyemmaricardohenrymunnigaryrobertorosehungabdullahramaisaaclijunxinchonadiaqiangyuliyabrendapauljeanlyubovpablogiuseppexuanchaosimakevinminlongperez@aystest.org" + }) + void givenValidAdminRegisterRequest_whenAdminRegistered_thenReturnSuccessResponse(String mockEmailAddress) throws Exception { + + // Given + String mockId = "e8de09dc-a44e-40eb-bcc7-cf0141f8733c"; + AdminRegistrationApplicationCompleteRequest mockRequest = new AdminRegistrationApplicationCompleteRequestBuilder() + .withValidValues() + .withEmailAddress(mockEmailAddress) + .build(); + + // When + Mockito.doNothing().when(adminRegistrationCompleteService).complete(Mockito.anyString(), Mockito.any()); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/complete"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationCompleteService, Mockito.times(1)) + .complete(Mockito.anyString(), Mockito.any()); + } + + + @Test + void givenIdAndAdminRegisterRequest_whenAdminApplicationNotFound_thenReturnUnauthorizedError() throws Exception { + + // Given + String mockId = "181e8310-6dfd-444c-aa38-056ce8401345"; + AdminRegistrationApplicationCompleteRequest mockRequest = new AdminRegistrationApplicationCompleteRequestBuilder() + .withValidValues().build(); + + // When + Mockito.doThrow(new AysAdminRegistrationApplicationNotExistByIdAuthException(mockId)) + .when(adminRegistrationCompleteService) + .complete(Mockito.anyString(), Mockito.any()); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/complete"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.UNAUTHORIZED; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isUnauthorized()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotHaveJsonPath()); + + // Verify + Mockito.verify(adminRegistrationCompleteService, Mockito.times(1)) + .complete(Mockito.anyString(), Mockito.any()); + } + + @CsvSource({ + "country code must be 90, ABC, ABC", + "country code must be 90, 80, 1234567890", + "country code must be 90, ABC, ABCDEFGHIJ", + "country code must be 90, 456786745645, 6546467456435548676845321346656654", + "line number length must be 10, 90, ABC", + "line number length must be 10, 90, 123456789", + "line number length must be 10, 90, 12345678901", + "must be valid, 90, 1234567890", + "must be valid, 90, 9104567890", + }) + @ParameterizedTest + void givenAdminRegistrationApplicationCompleteRequest_whenPhoneNumberIsNotValid_thenReturnValidationError(String mockMessage, + String mockCountryCode, + String mockLineNumber) throws Exception { + + // Given + String mockId = "25930d3f-4cea-4147-a21a-0f22c9bf72de"; + AysPhoneNumberRequest mockPhoneNumberRequest = new AysPhoneNumberRequestBuilder() + .withCountryCode(mockCountryCode) + .withLineNumber(mockLineNumber) + .build(); + AdminRegistrationApplicationCompleteRequest mockCompleteRequest = new AdminRegistrationApplicationCompleteRequestBuilder() + .withValidValues() + .withPhoneNumber(mockPhoneNumberRequest) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/complete"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockCompleteRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].message") + .value(mockMessage)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].field") + .value("phoneNumber")) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].value") + .value(mockPhoneNumberRequest.getCountryCode() + mockPhoneNumberRequest.getLineNumber())); + + // Verify + Mockito.verify(adminRegistrationCompleteService, Mockito.never()) + .complete(Mockito.anyString(), Mockito.any()); + } + + @ParameterizedTest + @ValueSource(strings = { + "John 1234", + "John *^%$#", + " John", + "? John", + "J", + "J----", + "City--King", + "John Doe" + }) + void givenInvalidAdminRegisterApplicationCompleteRequestWithParametrizedInvalidNames_whenNamesAreNotValid_thenReturnValidationError(String invalidName) throws Exception { + + // Given + String mockId = "f423facc-36fe-4615-a68d-f7f1fe5cd860"; + AdminRegistrationApplicationCompleteRequest mockRequest = new AdminRegistrationApplicationCompleteRequestBuilder() + .withValidValues() + .withFirstName(invalidName) + .withLastName(invalidName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/complete"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationCompleteService, Mockito.never()) + .complete(Mockito.anyString(), Mockito.any()); + } + + @ParameterizedTest + @ValueSource(strings = { + "a@b.c", + "plainaddress", + "@missingusername.com", + "username@.com", + "username@gmail", + "username@gmail..com", + "username@gmail.c", + "username@-gmail.com", + "username@gmail-.com", + "username@gmail.com.", + "username@.gmail.com", + "username@gmail@gmail.com", + "username(john.doe)@gmail.com", + "user@domain(comment).com", + "usernamegmail.com", + "username@gmail,com", + "username@gmail space.co", + "username@gmail..co.uk", + "user#gmail.com", + "bekeleandreaevelynirenealexandrascottmirasoniamustafahuivladimirmarcoyolandaraymondakhtermichaeldennistatianayuliyagangmargaretthomassumanjeanamymostafasaidrubenchenedithjumasitimeilucasgaryghulamminaxiaohongmarcosrafaelamyantoniamohamadfatmaahmed@aystest.org" + }) + void givenInvalidAdminRegisterApplicationCompleteRequestWithParametrizedInvalidEmails_whenEmailsAreNotValid_thenReturnValidationError(String mockEmailAddress) throws Exception { + + // Given + String mockId = "53617d24-e32c-4249-b9e6-b10e63a439bd"; + AdminRegistrationApplicationCompleteRequest mockRequest = new AdminRegistrationApplicationCompleteRequestBuilder() + .withValidValues() + .withEmailAddress(mockEmailAddress) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/complete"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationCompleteService, Mockito.never()) + .complete(Mockito.anyString(), Mockito.any()); + } + + @ParameterizedTest + @ValueSource(strings = { + "g", + "g.h2j5L", + "uqTY6zlNlPgQZtyaRIVNPEAaLAPdOxEhmLWcoCcR4TbkLWedAcaHa96ZYXdrvor7qhN8B5ccms06NfbzVG2gzq0DWkHLxQupzmmbH3W9UhrnLS0LjuBVgOjQEoyaXesrJ" + }) + void givenInvalidAdminRegisterApplicationCompleteRequestWithInvalidPassword_whenPasswordDoesNotValid_thenReturnValidationError(String mockPassword) throws Exception { + + // Given + String mockId = "de2b9621-0bf6-45df-a173-4697797446b7"; + AdminRegistrationApplicationCompleteRequest mockRequest = new AdminRegistrationApplicationCompleteRequestBuilder() + .withValidValues() + .withPassword(mockPassword) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/complete"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationCompleteService, Mockito.never()) + .complete(Mockito.anyString(), Mockito.any()); + } + + @Test + void givenValidAdminRegisterApplicationId_whenApproveAdminRegisterApplication_thenReturnNothing() throws Exception { + // Given + String mockId = "47d91587-612f-462b-975f-ed227e2ee3a7"; + + // When + Mockito.doNothing() + .when(adminRegistrationApplicationService).approve(mockId); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/".concat(mockId).concat("/approve")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken()); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.times(1)) + .approve(mockId); + } + + @Test + void givenValidAdminRegisterApplicationId_whenUnauthorizedForApprovingAdminRegisterApplication_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "5cbc8774-e2c3-414b-a1d8-26abcf3c9d17"; + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/".concat(mockId).concat("/approve")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.never()) + .approve(mockId); + } + + @Test + void givenValidAdminRegisterApplicationRejectRequest_whenRejectingAdminRegisterApplication_thenReturnSuccess() throws Exception { + + // Given + String mockId = "c5c504a6-1223-483b-a8ba-6fb4ea309e00"; + AdminRegistrationApplicationRejectRequest mockRequest = new AdminRegistrationApplicationRejectRequestBuilder() + .withValidValues() + .build(); + + // When + Mockito.doNothing().when(adminRegistrationApplicationService).reject(mockId, mockRequest); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/reject"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.times(1)) + .reject(Mockito.eq(mockId), Mockito.any(AdminRegistrationApplicationRejectRequest.class)); + + } + + @Test + void givenValidAdminRegisterApplicationRejectRequest_whenUnauthorizedForRejectingAdminRegisterApplication_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "c27aa25e-7e2f-4bc1-8056-eb9c2948f507"; + AdminRegistrationApplicationRejectRequest mockRequest = new AdminRegistrationApplicationRejectRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/reject"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.never()) + .reject(Mockito.eq(mockId), Mockito.any(AdminRegistrationApplicationRejectRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + " ", + "less than 40", + """ + Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. + Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. + Donec qudam felis, ultricies nec, pellentesque eu, pretscsxwium quis, sem. Nulla consequat massa quis + enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, + imperdiet a, venenatdskjvndshjcndsis vitae, justo. Nullam dictum felis eu pedde mollis pretium. Integer tincidunt. + Cras dapibus. Vivdamus ewl + """, + " spaceAtTheBeginning", + "spaceAtTheEnd ", + " both ", + " justAString " + }) + void givenInvalidAdminRegisterApplicationRejectRequest_whenRejectingAdminRegisterApplication_thenReturnValidationError(String rejectReason) throws Exception { + + // Given + String mockId = "4d04bd1e-6318-43ba-ab40-57efb8afc918"; + AdminRegistrationApplicationRejectRequest mockRequest = new AdminRegistrationApplicationRejectRequestBuilder() + .withValidValues() + .withRejectReason(rejectReason) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/admin-registration-application/").concat(mockId).concat("/reject"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(adminRegistrationApplicationService, Mockito.never()) + .reject(Mockito.anyString(), + Mockito.any(AdminRegistrationApplicationRejectRequest.class)); + } + +} diff --git a/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationControllerTest.java b/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationControllerTest.java index 660985fca..ebd508854 100644 --- a/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationControllerTest.java +++ b/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationControllerTest.java @@ -42,26 +42,27 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import java.util.List; class AdminRegistrationApplicationControllerTest extends AysRestControllerTest { - @MockBean + @MockitoBean private AdminRegistrationApplicationService adminRegistrationApplicationService; - @MockBean + @MockitoBean private AdminRegistrationCompleteService adminRegistrationCompleteService; + private final AdminRegistrationApplicationToApplicationsResponseMapper adminRegistrationApplicationToApplicationsResponseMapper = AdminRegistrationApplicationToApplicationsResponseMapper.initialize(); private final AdminRegistrationApplicationToApplicationResponseMapper adminRegistrationApplicationToApplicationResponseMapper = AdminRegistrationApplicationToApplicationResponseMapper.initialize(); private final AdminRegistrationApplicationToSummaryResponseMapper adminRegistrationApplicationToSummaryResponseMapper = AdminRegistrationApplicationToSummaryResponseMapper.initialize(); private final AdminRegistrationApplicationToCreateResponseMapper adminRegistrationApplicationToCreateResponseMapper = AdminRegistrationApplicationToCreateResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; @Test diff --git a/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationEndToEndTest.java b/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationEndToEndTest.java index 567991bab..92a7a1618 100644 --- a/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationEndToEndTest.java +++ b/src/test/java/org/ays/auth/controller/AdminRegistrationApplicationEndToEndTest.java @@ -82,7 +82,7 @@ class AdminRegistrationApplicationEndToEndTest extends AysEndToEndTest { private final AdminRegistrationApplicationToCreateResponseMapper adminRegistrationApplicationToCreateResponseMapper = AdminRegistrationApplicationToCreateResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; @Test diff --git a/src/test/java/org/ays/auth/controller/AysAuthControllerTest.java b/src/test/java/org/ays/auth/controller/AysAuthControllerTest.java index fe8bca1d6..39c6ab580 100644 --- a/src/test/java/org/ays/auth/controller/AysAuthControllerTest.java +++ b/src/test/java/org/ays/auth/controller/AysAuthControllerTest.java @@ -27,17 +27,16 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; class AysAuthControllerTest extends AysRestControllerTest { - - @MockBean + @MockitoBean private AysAuthService authService; - @MockBean + @MockitoBean private AysUserPasswordService userPasswordService; diff --git a/src/test/java/org/ays/auth/controller/AysPermissionControllerOldTest.java b/src/test/java/org/ays/auth/controller/AysPermissionControllerOldTest.java new file mode 100644 index 000000000..da92ca49b --- /dev/null +++ b/src/test/java/org/ays/auth/controller/AysPermissionControllerOldTest.java @@ -0,0 +1,96 @@ +package org.ays.auth.controller; + +import org.ays.AysRestControllerTest; +import org.ays.auth.model.AysPermission; +import org.ays.auth.model.AysPermissionBuilder; +import org.ays.auth.model.mapper.AysPermissionToPermissionsResponseMapper; +import org.ays.auth.model.response.AysPermissionsResponse; +import org.ays.auth.service.AysPermissionService; +import org.ays.common.model.response.AysErrorResponse; +import org.ays.common.model.response.AysErrorResponseBuilder; +import org.ays.common.model.response.AysResponse; +import org.ays.util.AysMockMvcRequestBuilders; +import org.ays.util.AysMockResultMatchersBuilders; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import java.util.List; + +@Deprecated(since = "1.2.0 - Use or Develop AysPermissionControllerTest Class", forRemoval = true) +class AysPermissionControllerOldTest extends AysRestControllerTest { + + @MockitoBean + private AysPermissionService permissionService; + + + private final AysPermissionToPermissionsResponseMapper permissionToPermissionsResponseMapper = AysPermissionToPermissionsResponseMapper.initialize(); + + + private static final String BASE_PATH = "/api/v1"; + + + @Test + void whenPermissionsFound_thenReturnPermissions() throws Exception { + + // When + List mockPermissions = List.of( + new AysPermissionBuilder().withValidValues().build(), + new AysPermissionBuilder().withValidValues().build() + ); + + Mockito.when(permissionService.findAll()) + .thenReturn(mockPermissions); + + // Then + String endpoint = BASE_PATH.concat("/permissions"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + List mockPermissionsResponses = permissionToPermissionsResponseMapper.map(mockPermissions); + AysResponse> mockResponse = AysResponse + .successOf(mockPermissionsResponses); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(permissionService, Mockito.times(1)) + .findAll(); + } + + @Test + void whenUnauthorizedForFoundingPermissions_thenReturnAccessDeniedException() throws Exception { + + // When + List mockPermissions = List.of( + new AysPermissionBuilder().withValidValues().build(), + new AysPermissionBuilder().withValidValues().build() + ); + + Mockito.when(permissionService.findAll()) + .thenReturn(mockPermissions); + + // Then + String endpoint = BASE_PATH.concat("/permissions"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(permissionService, Mockito.never()) + .findAll(); + } + +} \ No newline at end of file diff --git a/src/test/java/org/ays/auth/controller/AysPermissionControllerTest.java b/src/test/java/org/ays/auth/controller/AysPermissionControllerTest.java index 5f6774ed3..bd69b446f 100644 --- a/src/test/java/org/ays/auth/controller/AysPermissionControllerTest.java +++ b/src/test/java/org/ays/auth/controller/AysPermissionControllerTest.java @@ -13,21 +13,22 @@ import org.ays.util.AysMockResultMatchersBuilders; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import java.util.List; class AysPermissionControllerTest extends AysRestControllerTest { - @MockBean + @MockitoBean private AysPermissionService permissionService; private final AysPermissionToPermissionsResponseMapper permissionToPermissionsResponseMapper = AysPermissionToPermissionsResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; + @Test void whenPermissionsFound_thenReturnPermissions() throws Exception { diff --git a/src/test/java/org/ays/auth/controller/AysPermissionEndToEndTest.java b/src/test/java/org/ays/auth/controller/AysPermissionEndToEndTest.java index 44c5258c5..938a06af9 100644 --- a/src/test/java/org/ays/auth/controller/AysPermissionEndToEndTest.java +++ b/src/test/java/org/ays/auth/controller/AysPermissionEndToEndTest.java @@ -24,7 +24,8 @@ class AysPermissionEndToEndTest extends AysEndToEndTest { private final AysPermissionToPermissionsResponseMapper permissionToPermissionsResponseMapper = AysPermissionToPermissionsResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; + @Test void whenPermissionsFoundIfUserIsSuperAdmin_thenReturnPermissionsWithSuperPermissionsWithoutLandingPagePermission() throws Exception { diff --git a/src/test/java/org/ays/auth/controller/AysRoleControllerOldTest.java b/src/test/java/org/ays/auth/controller/AysRoleControllerOldTest.java new file mode 100644 index 000000000..07214c97f --- /dev/null +++ b/src/test/java/org/ays/auth/controller/AysRoleControllerOldTest.java @@ -0,0 +1,1050 @@ +package org.ays.auth.controller; + +import org.ays.AysRestControllerTest; +import org.ays.auth.exception.AysRoleAlreadyDeletedException; +import org.ays.auth.exception.AysRoleAssignedToUserException; +import org.ays.auth.model.AysRole; +import org.ays.auth.model.AysRoleBuilder; +import org.ays.auth.model.enums.AysRoleStatus; +import org.ays.auth.model.mapper.AysRoleToResponseMapper; +import org.ays.auth.model.mapper.AysRoleToRolesResponseMapper; +import org.ays.auth.model.mapper.AysRoleToRolesSummaryResponseMapper; +import org.ays.auth.model.request.AysRoleCreateRequest; +import org.ays.auth.model.request.AysRoleCreateRequestBuilder; +import org.ays.auth.model.request.AysRoleListRequest; +import org.ays.auth.model.request.AysRoleListRequestBuilder; +import org.ays.auth.model.request.AysRoleUpdateRequest; +import org.ays.auth.model.request.AysRoleUpdateRequestBuilder; +import org.ays.auth.model.response.AysRoleResponse; +import org.ays.auth.model.response.AysRolesResponse; +import org.ays.auth.model.response.AysRolesSummaryResponse; +import org.ays.auth.service.AysRoleCreateService; +import org.ays.auth.service.AysRoleReadService; +import org.ays.auth.service.AysRoleUpdateService; +import org.ays.common.model.AysPage; +import org.ays.common.model.AysPageBuilder; +import org.ays.common.model.AysPageableBuilder; +import org.ays.common.model.response.AysErrorResponse; +import org.ays.common.model.response.AysErrorResponseBuilder; +import org.ays.common.model.response.AysPageResponse; +import org.ays.common.model.response.AysResponse; +import org.ays.common.model.response.AysResponseBuilder; +import org.ays.common.util.AysRandomUtil; +import org.ays.util.AysMockMvcRequestBuilders; +import org.ays.util.AysMockResultMatchersBuilders; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mockito; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Deprecated(since = "1.2.0 - Use or Develop AysRoleControllerTest Class", forRemoval = true) +class AysRoleControllerOldTest extends AysRestControllerTest { + + @MockitoBean + private AysRoleReadService roleReadService; + + @MockitoBean + private AysRoleCreateService roleCreateService; + + @MockitoBean + private AysRoleUpdateService roleUpdateService; + + + private final AysRoleToRolesResponseMapper roleToRolesResponseMapper = AysRoleToRolesResponseMapper.initialize(); + private final AysRoleToRolesSummaryResponseMapper roleToRolesSummaryResponseMapper = AysRoleToRolesSummaryResponseMapper.initialize(); + private final AysRoleToResponseMapper roleToRoleResponseMapper = AysRoleToResponseMapper.initialize(); + + + private static final String BASE_PATH = "/api/v1"; + + + @Test + void whenRolesFound_thenReturnSummaryOfRoles() throws Exception { + + // When + List mockRoles = List.of( + new AysRoleBuilder().withValidValues().build(), + new AysRoleBuilder().withValidValues().build() + ); + + Mockito.when(roleReadService.findAll()) + .thenReturn(mockRoles); + + // Then + String endpoint = BASE_PATH.concat("/roles/summary"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + List mockRolesSummaryResponses = roleToRolesSummaryResponseMapper.map(mockRoles); + AysResponse> mockResponse = AysResponse + .successOf(mockRolesSummaryResponses); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(roleReadService, Mockito.times(1)) + .findAll(); + } + + @Test + void whenUserUnauthorizedOnRolesSummary_thenReturnAccessDeniedException() throws Exception { + // Then + String endpoint = BASE_PATH.concat("/roles/summary"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleReadService, Mockito.never()) + .findAll(); + } + + @Test + void givenValidRoleListRequest_whenRolesFound_thenReturnAysPageResponseOfRolesResponse() throws Exception { + + // Given + AysRoleListRequest mockListRequest = new AysRoleListRequestBuilder() + .withValidValues() + .build(); + + // When + List mockRoles = List.of( + new AysRoleBuilder().withValidValues().build() + ); + + AysPage mockRolePage = AysPageBuilder + .from(mockRoles, mockListRequest.getPageable()); + + Mockito.when(roleReadService.findAll(Mockito.any(AysRoleListRequest.class))) + .thenReturn(mockRolePage); + + // Then + String endpoint = BASE_PATH.concat("/roles"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + List mockRolesResponse = roleToRolesResponseMapper.map(mockRoles); + AysPageResponse pageOfResponse = AysPageResponse.builder() + .of(mockRolePage) + .content(mockRolesResponse) + .build(); + AysResponse> mockResponse = AysResponse + .successOf(pageOfResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(roleReadService, Mockito.times(1)) + .findAll(Mockito.any(AysRoleListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "Test Role 1234", + "Role *^%$#", + " Test", + "? Role", + "J", + "J----", + "City--King", + "John Doe" + }) + void givenRoleListRequest_whenNameDoesNotValid_thenReturnValidationError(String invalidName) throws Exception { + + // Given + AysRoleListRequest mockListRequest = new AysRoleListRequestBuilder() + .withValidValues() + .withName(invalidName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/roles"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleReadService, Mockito.never()) + .findAll(Mockito.any(AysRoleListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "1", + "109", + "99999", + "15" + }) + void givenInvalidRoleListRequest_whenPageSizeNotTen_thenReturnValidationError(int invalidPageSize) throws Exception { + + // Given + AysRoleListRequest mockListRequest = new AysRoleListRequestBuilder() + .withPageable(new AysPageableBuilder() + .withPage(1) + .withPageSize(invalidPageSize) + .build() + ) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/roles"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleReadService, Mockito.never()) + .findAll(Mockito.any(AysRoleListRequest.class)); + } + + @Test + void givenValidRoleListRequest_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + // Given + AysRoleListRequest mockListRequest = new AysRoleListRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/roles"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleReadService, Mockito.never()) + .findAll(Mockito.any(AysRoleListRequest.class)); + } + + + @Test + void givenValidRoleId_whenRoleFound_thenReturnAysRoleResponse() throws Exception { + + // Given + String mockRoleId = AysRandomUtil.generateUUID(); + + // When + AysRole mockRole = new AysRoleBuilder() + .withValidValues() + .withId(mockRoleId) + .build(); + + Mockito.when(roleReadService.findById(mockRoleId)) + .thenReturn(mockRole); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockRoleId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + AysRoleResponse mockRoleResponse = roleToRoleResponseMapper + .map(mockRole); + AysResponse mockResponse = AysResponse + .successOf(mockRoleResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(roleReadService, Mockito.times(1)) + .findById(mockRoleId); + } + + @Test + void givenRoleId_whenUnauthorizedForGettingRoleById_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockRoleId = AysRandomUtil.generateUUID(); + + // Then + String endpoint = BASE_PATH.concat("/role/".concat(mockRoleId)); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleReadService, Mockito.never()) + .findById(mockRoleId); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenInvalidId_whenIdNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(invalidId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + + @Test + void givenValidRoleCreateRequest_whenRoleCreated_thenReturnSuccess() throws Exception { + // Given + AysRoleCreateRequest mockCreateRequest = new AysRoleCreateRequestBuilder() + .withValidValues() + .build(); + + // When + Mockito.doNothing() + .when(roleCreateService) + .create(Mockito.any(AysRoleCreateRequest.class)); + + // Then + String endpoint = BASE_PATH.concat("/role"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(roleCreateService, Mockito.times(1)) + .create(Mockito.any(AysRoleCreateRequest.class)); + } + + @Test + void givenValidRoleCreateRequest_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + // Given + AysRoleCreateRequest mockCreateRequest = new AysRoleCreateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleCreateService, Mockito.never()) + .create(Mockito.any(AysRoleCreateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + " Kurum yöneticisi", + "!Kurum", + "12Kurum", + "J----", + "City--King", + "John Doe", + "A", + "% fsdh ", + "493268349068342", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec odio nec urna tincidunt fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec odio nec urna tincidunt fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec odio nec urna tincidunt fermentum." + }) + void givenInvalidRoleCreateRequest_whenNameIsNotValid_thenReturnValidationError(String invalidName) throws Exception { + // Given + AysRoleCreateRequest mockCreateRequest = new AysRoleCreateRequestBuilder() + .withValidValues() + .withName(invalidName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleCreateService, Mockito.never()) + .create(Mockito.any(AysRoleCreateRequest.class)); + } + + @Test + void givenInvalidRoleCreateRequest_whenPermissionIdsAreNull_thenReturnValidationError() throws Exception { + // Given + AysRoleCreateRequest mockCreateRequest = new AysRoleCreateRequestBuilder() + .withValidValues() + .withPermissionIds(null) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleCreateService, Mockito.never()) + .create(Mockito.any(AysRoleCreateRequest.class)); + } + + @Test + void givenInvalidRoleCreateRequest_whenPermissionIdsAreEmpty_thenReturnValidationError() throws Exception { + // Given + AysRoleCreateRequest mockCreateRequest = new AysRoleCreateRequestBuilder() + .withValidValues() + .withPermissionIds(Set.of()) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleCreateService, Mockito.never()) + .create(Mockito.any(AysRoleCreateRequest.class)); + } + + @ParameterizedTest + @NullSource + @ValueSource(strings = { + "", + "55aed4c4facb4b66bdb5-309eaaef4453" + }) + void givenInvalidRoleCreateRequest_whenPermissionIdIsNotValid_thenReturnValidationError(String invalidPermissionId) throws Exception { + // Given + AysRoleCreateRequest mockCreateRequest = new AysRoleCreateRequestBuilder() + .withValidValues() + .withPermissionIds(Collections.singleton(invalidPermissionId)) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleCreateService, Mockito.never()) + .create(Mockito.any(AysRoleCreateRequest.class)); + } + + + @Test + void givenValidIdAndRoleUpdateRequest_whenRoleUpdated_thenReturnSuccess() throws Exception { + // Given + String mockId = AysRandomUtil.generateUUID(); + AysRoleUpdateRequest mockUpdateRequest = new AysRoleUpdateRequestBuilder() + .withValidValues() + .build(); + + // When + Mockito.doNothing() + .when(roleUpdateService) + .update(Mockito.any(), Mockito.any(AysRoleUpdateRequest.class)); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.times(1)) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + @Test + void givenValidIdAndRoleUpdateRequest_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = AysRandomUtil.generateUUID(); + AysRoleUpdateRequest mockUpdateRequest = new AysRoleUpdateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockUserToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenInvalidIdAndValidRoleUpdateRequest_whenIdNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Given + AysRoleUpdateRequest mockUpdateRequest = new AysRoleUpdateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(invalidId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "A", + " Role", + "Role ", + "123Role", + "J----", + "City--King", + "John Doe", + ".Role", + "% fsdh ", + "493268349068342", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec odio nec urna tincidunt fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec odio nec urna tincidunt fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla nec odio nec urna tincidunt fermentum." + }) + void givenValidIdAndInvalidRoleUpdateRequest_whenNameIsNotValid_thenReturnValidationError(String invalidName) throws Exception { + + // Given + String mockId = AysRandomUtil.generateUUID(); + AysRoleUpdateRequest mockUpdateRequest = new AysRoleUpdateRequestBuilder() + .withValidValues() + .withName(invalidName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + @Test + void givenValidIdAndInvalidRoleUpdateRequest_whenPermissionIdsAreNull_thenReturnValidationError() throws Exception { + + // Given + String mockId = AysRandomUtil.generateUUID(); + AysRoleUpdateRequest mockUpdateRequest = new AysRoleUpdateRequestBuilder() + .withValidValues() + .withPermissionIds(null) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + @Test + void givenValidIdAndInvalidRoleUpdateRequest_whenPermissionIdsAreEmpty_thenReturnValidationError() throws Exception { + + // Given + String mockId = AysRandomUtil.generateUUID(); + AysRoleUpdateRequest mockUpdateRequest = new AysRoleUpdateRequestBuilder() + .withValidValues() + .withPermissionIds(Set.of()) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + @ParameterizedTest + @NullSource + @ValueSource(strings = { + "", + "55aed4c4facb4b66bdb5-309eaaef4453" + }) + void givenValidIdAndInvalidRoleUpdateRequest_whenPermissionIdIsNotValid_thenReturnValidationError(String invalidPermissionId) throws Exception { + + // Given + String mockId = AysRandomUtil.generateUUID(); + + Set mockPermissionIds = new HashSet<>(); + mockPermissionIds.add(invalidPermissionId); + AysRoleUpdateRequest mockUpdateRequest = new AysRoleUpdateRequestBuilder() + .withValidValues() + .withPermissionIds(mockPermissionIds) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysRoleUpdateRequest.class)); + } + + + @Test + void givenValidId_whenRoleActivated_thenReturnSuccess() throws Exception { + + // Given + String mockId = "3ce7dace-e006-459c-b3c0-693bf2a36e26"; + + // When + Mockito.doNothing() + .when(roleUpdateService) + .activate(Mockito.anyString()); + + // Then + String endpoint = BASE_PATH.concat("/role/".concat(mockId).concat("/activate")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockSuperAdminToken.getAccessToken()); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.times(1)) + .activate(Mockito.anyString()); + } + + @Test + void givenValidId_whenUserUnauthorizedForActivation_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "8c19bb92-5f11-4752-a93f-11c440d1725b"; + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId).concat("/activate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .activate(Mockito.anyString()); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenId_whenIdIsNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/role/".concat(invalidId).concat("/activate")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockSuperAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .activate(Mockito.anyString()); + } + + + @Test + void givenValidId_whenRolePassivated_thenReturnSuccess() throws Exception { + + // Given + String mockId = "9a93788e-dfa1-437a-96d7-8fa267401d4e"; + + // When + Mockito.doNothing() + .when(roleUpdateService) + .passivate(Mockito.anyString()); + + // Then + String endpoint = BASE_PATH.concat("/role/".concat(mockId).concat("/passivate")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockSuperAdminToken.getAccessToken()); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.times(1)) + .passivate(Mockito.anyString()); + } + + @Test + void givenValidId_whenUserUnauthorizedForPassivation_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "afb30a1a-baae-44f1-a106-e6cfaf8d1858"; + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId).concat("/passivate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .passivate(Mockito.anyString()); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenId_whenIdIsNotValidForPassivation_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/role/".concat(invalidId).concat("/passivate")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockSuperAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .passivate(Mockito.anyString()); + } + + @Test + void givenValidIdForPassivation_whenRoleUsing_thenReturnConflict() throws Exception { + + // Given + String mockId = "13e8ff0e-8d85-4f4f-8e45-efb04d1d8bf8"; + + // When + Mockito.doThrow(new AysRoleAssignedToUserException(mockId)) + .when(roleUpdateService) + .passivate(mockId); + + // Then + String endpoint = BASE_PATH.concat("/role/".concat(mockId).concat("/passivate")); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockSuperAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.CONFLICT_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isConflict()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.times(1)) + .passivate(mockId); + } + + + @Test + void givenValidId_whenRoleDeleted_thenReturnSuccess() throws Exception { + // Given + String mockId = AysRandomUtil.generateUUID(); + + // When + Mockito.doNothing() + .when(roleUpdateService) + .delete(Mockito.any()); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .delete(endpoint, mockAdminToken.getAccessToken()); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.times(1)) + .delete(mockId); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenId_whenIdDoesNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(invalidId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .delete(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.never()) + .delete(Mockito.anyString()); + } + + @Test + void givenValidId_whenRoleAlreadyDeleted_thenReturnConflict() throws Exception { + // Given + String mockId = AysRandomUtil.generateUUID(); + + // When + AysRole mockRole = new AysRoleBuilder() + .withValidValues() + .withId(mockId) + .withStatus(AysRoleStatus.DELETED) + .build(); + + Mockito.doThrow(new AysRoleAlreadyDeletedException(mockId)) + .when(roleUpdateService) + .delete(mockRole.getId()); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .delete(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.CONFLICT_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isConflict()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.times(1)) + .delete(mockRole.getId()); + } + + @Test + void givenValidId_whenRoleUsing_thenReturnConflict() throws Exception { + // Given + String mockId = AysRandomUtil.generateUUID(); + + // When + Mockito.doThrow(new AysRoleAssignedToUserException(mockId)) + .when(roleUpdateService) + .delete(mockId); + + // Then + String endpoint = BASE_PATH.concat("/role/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .delete(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.CONFLICT_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isConflict()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(roleUpdateService, Mockito.times(1)) + .delete(mockId); + } + +} diff --git a/src/test/java/org/ays/auth/controller/AysRoleControllerTest.java b/src/test/java/org/ays/auth/controller/AysRoleControllerTest.java index 03c6b1782..f62c052d7 100644 --- a/src/test/java/org/ays/auth/controller/AysRoleControllerTest.java +++ b/src/test/java/org/ays/auth/controller/AysRoleControllerTest.java @@ -37,7 +37,7 @@ import org.junit.jupiter.params.provider.NullSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import java.util.Collections; @@ -47,13 +47,13 @@ class AysRoleControllerTest extends AysRestControllerTest { - @MockBean + @MockitoBean private AysRoleReadService roleReadService; - @MockBean + @MockitoBean private AysRoleCreateService roleCreateService; - @MockBean + @MockitoBean private AysRoleUpdateService roleUpdateService; @@ -62,7 +62,7 @@ class AysRoleControllerTest extends AysRestControllerTest { private final AysRoleToResponseMapper roleToRoleResponseMapper = AysRoleToResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; @Test diff --git a/src/test/java/org/ays/auth/controller/AysRoleEndToEndTest.java b/src/test/java/org/ays/auth/controller/AysRoleEndToEndTest.java index bc2e3a51f..a1154499b 100644 --- a/src/test/java/org/ays/auth/controller/AysRoleEndToEndTest.java +++ b/src/test/java/org/ays/auth/controller/AysRoleEndToEndTest.java @@ -62,7 +62,7 @@ class AysRoleEndToEndTest extends AysEndToEndTest { private final AysRoleToResponseMapper roleToResponseMapper = AysRoleToResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; @Test diff --git a/src/test/java/org/ays/auth/controller/AysUserControllerOldTest.java b/src/test/java/org/ays/auth/controller/AysUserControllerOldTest.java new file mode 100644 index 000000000..a325405c6 --- /dev/null +++ b/src/test/java/org/ays/auth/controller/AysUserControllerOldTest.java @@ -0,0 +1,1243 @@ +package org.ays.auth.controller; + +import org.ays.AysRestControllerTest; +import org.ays.auth.model.AysUser; +import org.ays.auth.model.AysUserBuilder; +import org.ays.auth.model.AysUserFilter; +import org.ays.auth.model.mapper.AysUserToResponseMapper; +import org.ays.auth.model.mapper.AysUserToUsersResponseMapper; +import org.ays.auth.model.request.AysUserCreateRequest; +import org.ays.auth.model.request.AysUserCreateRequestBuilder; +import org.ays.auth.model.request.AysUserListRequest; +import org.ays.auth.model.request.AysUserListRequestBuilder; +import org.ays.auth.model.request.AysUserUpdateRequest; +import org.ays.auth.model.request.AysUserUpdateRequestBuilder; +import org.ays.auth.model.response.AysUserResponse; +import org.ays.auth.model.response.AysUsersResponse; +import org.ays.auth.service.AysUserCreateService; +import org.ays.auth.service.AysUserReadService; +import org.ays.auth.service.AysUserUpdateService; +import org.ays.common.model.AysPage; +import org.ays.common.model.AysPageBuilder; +import org.ays.common.model.AysPageableBuilder; +import org.ays.common.model.request.AysPhoneNumberRequest; +import org.ays.common.model.request.AysPhoneNumberRequestBuilder; +import org.ays.common.model.response.AysErrorResponse; +import org.ays.common.model.response.AysErrorResponseBuilder; +import org.ays.common.model.response.AysPageResponse; +import org.ays.common.model.response.AysResponse; +import org.ays.common.model.response.AysResponseBuilder; +import org.ays.common.util.AysRandomUtil; +import org.ays.util.AysMockMvcRequestBuilders; +import org.ays.util.AysMockResultMatchersBuilders; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mockito; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +@Deprecated(since = "1.2.0 - Use or Develop AysUserControllerTest Class", forRemoval = true) +class AysUserControllerOldTest extends AysRestControllerTest { + + @MockitoBean + private AysUserReadService userReadService; + + @MockitoBean + private AysUserCreateService userCreateService; + + @MockitoBean + private AysUserUpdateService userUpdateService; + + + private final AysUserToUsersResponseMapper userToUsersResponseMapper = AysUserToUsersResponseMapper.initialize(); + private final AysUserToResponseMapper userToResponseMapper = AysUserToResponseMapper.initialize(); + + + private static final String BASE_PATH = "/api/v1"; + + + @Test + void givenValidUserListRequest_whenUsersFound_thenReturnAysPageResponseOfUsersResponse() throws Exception { + // Given + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withValidValues() + .build(); + + //When + List mockUsers = List.of( + new AysUserBuilder().withValidValues().build() + ); + + AysPage mockUserPage = AysPageBuilder + .from(mockUsers, mockListRequest.getPageable()); + + Mockito.when(userReadService.findAll(Mockito.any(AysUserListRequest.class))) + .thenReturn(mockUserPage); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + List mockUsersResponse = userToUsersResponseMapper.map(mockUsers); + AysPageResponse pageOfResponse = AysPageResponse.builder() + .of(mockUserPage) + .content(mockUsersResponse) + .build(); + AysResponse> mockResponse = AysResponse + .successOf(pageOfResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.times(1)) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "Lorem ipsum dolor sit amet consectetur adipiscing elit Integer nec odio Praesent libero Sed cursus ante dapibus diam Sed nisi Nulla quis sem at nibh", + "Test user 1234", + "User *^%$#", + " Test", + "? User", + "J", + "J----", + "Martin-Luther--King", + "John Doe" + }) + void givenUserListRequest_whenFirstNameDoesNotValid_thenReturnValidationError(String invalidName) throws Exception { + + // Given + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withValidValues() + .withFirstName(invalidName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "Lorem ipsum dolor sit amet consectetur adipiscing elit Integer nec odio Praesent libero Sed cursus ante dapibus diam Sed nisi Nulla quis sem at nibh", + "Test user 1234", + "User *^%$#", + " Test", + "? User", + "J", + "J----", + "Martin-Luther--King", + "John Doe" + }) + void givenUserListRequest_whenLastNameDoesNotValid_thenReturnValidationError(String invalidName) throws Exception { + + // Given + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withValidValues() + .withLastName(invalidName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + @CsvSource({ + "must be integer, 321.", + "must be integer, 12.34", + "must be integer, '12,34'", + "must be integer, 1 234", + "must be integer, 12a34", + "must be integer, #", + "must be integer, ' '", + "must be positive integer, -321", + "must be positive integer, 0", + "size must be between 1 and 10, ''", + "size must be between 1 and 10, 12345678912367", + "size must be between 1 and 10, 12345678912367564656464858", + }) + @ParameterizedTest + void givenUserListRequest_whenLineNumberIsNotValid_thenReturnValidationError(String mockSubErrorMessage, + String mockLineNumber) throws Exception { + + // Given + AysUserFilter.PhoneNumber mockPhoneNumber = new AysUserFilter.PhoneNumber(); + mockPhoneNumber.setLineNumber(mockLineNumber); + + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withValidValues() + .withPhoneNumber(mockPhoneNumber) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isArray()) + .andExpect(AysMockResultMatchersBuilders.subErrorsSize() + .value(1)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[*].message") + .value(mockSubErrorMessage)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[*].field") + .value("lineNumber")); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "bekeleandreaevelynirenealexandrascottmirasoniamustafahuivladimirmarcoyolandaraymondakhtermichaeldennistatianayuliyagangmargaretthomassumanjeanamymostafasaidrubenchenedithjumasitimeilucasgaryghulamminaxiaohongmarcosrafaelamyantoniamohamadfatmaahmed@aystest.org" + }) + void givenUserListRequest_whenEmailAddressDoesNotValid_thenReturnValidationError(String mockEmailAddress) throws Exception { + + // Given + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withValidValues() + .withEmailAddress(mockEmailAddress) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "City user 1234", + "City *^%$#", + " Test", + "? User", + "J", + "J----", + "City--King", + "John Doe" + }) + void givenUserListRequest_whenCityDoesNotValid_thenReturnValidationError(String invalidName) throws Exception { + + // Given + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withValidValues() + .withCity(invalidName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "1", + "109", + "99999", + "15" + }) + void givenInvalidUserListRequest_whenPageSizeNotTen_thenReturnValidationError(int invalidPageSize) throws Exception { + + // Given + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withPageable(new AysPageableBuilder() + .withPage(1) + .withPageSize(invalidPageSize) + .build() + ) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockSuperAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + @Test + void givenValidUserListRequest_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + // Given + AysUserListRequest mockListRequest = new AysUserListRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/users"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findAll(Mockito.any(AysUserListRequest.class)); + } + + + @Test + void givenValidUserId_whenUserFound_thenReturnAysUserResponse() throws Exception { + + // Given + String mockUserId = AysRandomUtil.generateUUID(); + + // When + AysUser mockUser = new AysUserBuilder() + .withValidValues() + .withId(mockUserId) + .build(); + + Mockito.when(userReadService.findById(mockUserId)) + .thenReturn(mockUser); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockUserId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + AysUserResponse mockUserResponse = userToResponseMapper + .map(mockUser); + AysResponse mockResponse = AysResponse + .successOf(mockUserResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.times(1)) + .findById(mockUserId); + } + + @Test + void givenUserId_whenUnauthorizedForGettingUserById_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockUserId = AysRandomUtil.generateUUID(); + + // Then + String endpoint = BASE_PATH.concat("/user/".concat(mockUserId)); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findById(mockUserId); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenInvalidId_whenIdNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(invalidId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userReadService, Mockito.never()) + .findById(Mockito.anyString()); + } + + + @ParameterizedTest + @ValueSource(strings = { + "a@b.co", + "abcdef@mail.com", + "abc+def@archive.com", + "john.doe123@example.co.uk", + "admin_123@example.org", + "admin-test@ays.com", + "johndoe@gmail.com", + "janedoe123@yahoo.com", + "michael.jordan@nba.com", + "alice.smith@company.co.uk", + "info@mywebsite.org", + "support@helpdesk.net", + "rajeshmehmetjosephanastasiyahamidjianguonalalitachunoscarmanojfelixmichaelhugoaslambeatrizsergeyemmaricardohenrymunnigaryrobertorosehungabdullahramaisaaclijunxinchonadiaqiangyuliyabrendapauljeanlyubovpablogiuseppexuanchaosimakevinminlongperez@aystest.org" + }) + void givenUserCreateRequest_whenUserCreated_thenReturnSuccess(String mockEmailAddress) throws Exception { + + // Given + AysUserCreateRequest mockCreateRequest = new AysUserCreateRequestBuilder() + .withValidValues() + .withEmailAddress(mockEmailAddress) + .build(); + + // When + Mockito.doNothing() + .when(userCreateService) + .create(Mockito.any(AysUserCreateRequest.class)); + + // Then + String endpoint = BASE_PATH.concat("/user"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userCreateService, Mockito.times(1)) + .create(Mockito.any(AysUserCreateRequest.class)); + } + + @Test + void givenValidUserCreateRequest_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + + // Given + AysUserCreateRequest mockCreateRequest = new AysUserCreateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(userCreateService, Mockito.never()) + .create(Mockito.any(AysUserCreateRequest.class)); + } + + @Test + void givenUserCreateRequest_whenRoleIdsAreNull_thenReturnValidationError() throws Exception { + + // Given + AysUserCreateRequest mockCreateRequest = new AysUserCreateRequestBuilder() + .withValidValues() + .withRoleIds(null) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userCreateService, Mockito.never()) + .create(Mockito.any(AysUserCreateRequest.class)); + } + + @Test + void givenUserCreateRequest_whenRoleIdsAreEmpty_thenReturnValidationError() throws Exception { + + // Given + AysUserCreateRequest mockCreateRequest = new AysUserCreateRequestBuilder() + .withValidValues() + .withRoleIds(Set.of()) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userCreateService, Mockito.never()) + .create(Mockito.any(AysUserCreateRequest.class)); + } + + @ParameterizedTest + @NullSource + @ValueSource(strings = { + "", + "55aed4c4facb4b66bdb5-309eaaef4453" + }) + void givenUserCreateRequest_whenRoleIdIsNotValid_thenReturnValidationError(String invalidRoleId) throws Exception { + + // Given + AysUserCreateRequest mockCreateRequest = new AysUserCreateRequestBuilder() + .withValidValues() + .withRoleIds(Collections.singleton(invalidRoleId)) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userCreateService, Mockito.never()) + .create(Mockito.any(AysUserCreateRequest.class)); + } + + @CsvSource({ + "country code must be 90, ABC, ABC", + "country code must be 90, 80, 1234567890", + "country code must be 90, ABC, ABCDEFGHIJ", + "country code must be 90, 456786745645, 6546467456435548676845321346656654", + "line number length must be 10, 90, ABC", + "line number length must be 10, 90, 123456789", + "line number length must be 10, 90, 12345678901", + "must be valid, 90, 1234567890", + "must be valid, 90, 9104567890", + }) + @ParameterizedTest + void givenUserCreateRequest_whenPhoneNumberIsNotValid_thenReturnValidationError(String mockMessage, + String mockCountryCode, + String mockLineNumber) throws Exception { + + // Given + AysPhoneNumberRequest mockPhoneNumberRequest = new AysPhoneNumberRequestBuilder() + .withCountryCode(mockCountryCode) + .withLineNumber(mockLineNumber) + .build(); + AysUserCreateRequest mockCreateRequest = new AysUserCreateRequestBuilder() + .withValidValues() + .withPhoneNumber(mockPhoneNumberRequest) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].message") + .value(mockMessage)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].field") + .value("phoneNumber")) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].value") + .value(mockPhoneNumberRequest.getCountryCode() + mockPhoneNumberRequest.getLineNumber())); + + // Verify + Mockito.verify(userCreateService, Mockito.never()) + .create(Mockito.any(AysUserCreateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "a@b.c", + "plainaddress", + "@missingusername.com", + "username@.com", + "username@gmail", + "username@gmail..com", + "username@gmail.c", + "username@-gmail.com", + "username@gmail-.com", + "username@gmail.com.", + "username@.gmail.com", + "username@gmail@gmail.com", + "username(john.doe)@gmail.com", + "user@domain(comment).com", + "usernamegmail.com", + "username@gmail,com", + "username@gmail space.co", + "username@gmail..co.uk", + "user#gmail.com", + "bekeleandreaevelynirenealexandrascottmirasoniamustafahuivladimirmarcoyolandaraymondakhtermichaeldennistatianayuliyagangmargaretthomassumanjeanamymostafasaidrubenchenedithjumasitimeilucasgaryghulamminaxiaohongmarcosrafaelamyantoniamohamadfatmaahmed@aystest.org" + }) + void givenUserCreateRequest_whenEmailNotValid_thenReturnValidationError(String mockEmailAddress) throws Exception { + + // Given + AysUserCreateRequest mockCreateRequest = new AysUserCreateRequestBuilder() + .withValidValues() + .withEmailAddress(mockEmailAddress) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockCreateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userCreateService, Mockito.never()) + .create(Mockito.any(AysUserCreateRequest.class)); + } + + + @ParameterizedTest + @ValueSource(strings = { + "a@b.co", + "abcdef@mail.com", + "abc+def@archive.com", + "john.doe123@example.co.uk", + "admin_123@example.org", + "admin-test@ays.com", + "johndoe@gmail.com", + "janedoe123@yahoo.com", + "michael.jordan@nba.com", + "alice.smith@company.co.uk", + "info@mywebsite.org", + "support@helpdesk.net", + "rajeshmehmetjosephanastasiyahamidjianguonalalitachunoscarmanojfelixmichaelhugoaslambeatrizsergeyemmaricardohenrymunnigaryrobertorosehungabdullahramaisaaclijunxinchonadiaqiangyuliyabrendapauljeanlyubovpablogiuseppexuanchaosimakevinminlongperez@aystest.org" + }) + void givenValidIdAndUserUpdateRequest_whenUserUpdated_thenReturnSuccess(String mockEmailAddress) throws Exception { + + // Given + String mockId = "2cb9f39b-490f-4035-97ac-9afbb87506df"; + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .withEmailAddress(mockEmailAddress) + .build(); + + // When + Mockito.doNothing() + .when(userUpdateService) + .update(Mockito.any(), Mockito.any(AysUserUpdateRequest.class)); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.times(1)) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + @Test + void givenValidIdAndUserUpdateRequest_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "0deb5f16-479f-4625-9354-7db29c861e85"; + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockUserToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenInvalidIdAndValidUserUpdateRequest_whenIdNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Given + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(invalidId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + @Test + void givenValidIdAndInvalidUserUpdateRequest_whenRoleIdsAreNull_thenReturnValidationError() throws Exception { + + // Given + String mockId = "3b5a65ba-c90e-41ad-97ec-56c7dd4fe708"; + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .withRoleIds(null) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + @CsvSource({ + "country code must be 90, ABC, ABC", + "country code must be 90, 80, 1234567890", + "country code must be 90, ABC, ABCDEFGHIJ", + "country code must be 90, 456786745645, 6546467456435548676845321346656654", + "line number length must be 10, 90, ABC", + "line number length must be 10, 90, 123456789", + "line number length must be 10, 90, 12345678901", + "must be valid, 90, 1234567890", + "must be valid, 90, 9104567890", + }) + @ParameterizedTest + void givenValidIdAndUserUpdateRequest_whenPhoneNumberIsNotValid_thenReturnValidationError(String mockMessage, + String mockCountryCode, + String mockLineNumber) throws Exception { + + // Given + String mockId = "0498acd6-103e-4e72-b6a5-7584bb1c7c93"; + AysPhoneNumberRequest mockPhoneNumberRequest = new AysPhoneNumberRequestBuilder() + .withCountryCode(mockCountryCode) + .withLineNumber(mockLineNumber) + .build(); + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .withPhoneNumber(mockPhoneNumberRequest) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].message") + .value(mockMessage)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].field") + .value("phoneNumber")) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].value") + .value(mockPhoneNumberRequest.getCountryCode() + mockPhoneNumberRequest.getLineNumber())); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + @Test + void givenValidIdAndInvalidUserUpdateRequest_whenRoleIdsAreEmpty_thenReturnValidationError() throws Exception { + + // Given + String mockId = "daaa28f9-f7b3-4f43-a10f-a5fe2b0eb2fa"; + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .withRoleIds(Set.of()) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + @ParameterizedTest + @NullSource + @ValueSource(strings = { + "", + "55aed4c4facb4b66bdb5-309eaaef4453" + }) + void givenValidIdAndInvalidUserUpdateRequest_whenRoleIdIsNotValid_thenReturnValidationError(String invalidRoleId) throws Exception { + + // Given + String mockId = "b8758dce-ad8e-438d-b31c-b440b352068a"; + + Set mockRoleIds = new HashSet<>(); + mockRoleIds.add(invalidRoleId); + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .withRoleIds(mockRoleIds) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "a@b.c", + "plainaddress", + "@missingusername.com", + "username@.com", + "username@gmail", + "username@gmail..com", + "username@gmail.c", + "username@-gmail.com", + "username@gmail-.com", + "username@gmail.com.", + "username@.gmail.com", + "username@gmail@gmail.com", + "username(john.doe)@gmail.com", + "user@domain(comment).com", + "usernamegmail.com", + "username@gmail,com", + "username@gmail space.co", + "username@gmail..co.uk", + "user#gmail.com", + "bekeleandreaevelynirenealexandrascottmirasoniamustafahuivladimirmarcoyolandaraymondakhtermichaeldennistatianayuliyagangmargaretthomassumanjeanamymostafasaidrubenchenedithjumasitimeilucasgaryghulamminaxiaohongmarcosrafaelamyantoniamohamadfatmaahmed@aystest.org" + }) + void givenValidIdAndInvalidUserUpdateRequest_whenEmailNotValid_thenReturnValidationError(String mockEmailAddress) throws Exception { + // Given + String mockId = "b66afcb0-3029-4968-a87b-e1d94fc75642"; + + AysUserUpdateRequest mockUpdateRequest = new AysUserUpdateRequestBuilder() + .withValidValues() + .withEmailAddress(mockEmailAddress) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(AysUserUpdateRequest.class)); + } + + + @Test + void givenValidId_whenActivateUser_thenReturnSuccess() throws Exception { + + // Given + String mockId = "793fcc5d-31cc-4704-9f0a-627ac7da517d"; + + // When + Mockito.doNothing() + .when(userUpdateService) + .activate(Mockito.anyString()); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId).concat("/activate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockAdminToken.getAccessToken()); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.times(1)) + .activate(Mockito.anyString()); + } + + @Test + void givenValidId_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "201aec72-ecd8-49fc-86f5-2b5458871edb"; + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId).concat("/activate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .activate(Mockito.anyString()); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenInvalidUserId_whenIdNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(invalidId).concat("/activate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .activate(Mockito.anyString()); + } + + + @Test + void givenValidId_whenUserDeleted_thenReturnSuccess() throws Exception { + + // Given + String mockId = "2e574ecf-929c-4923-8aea-d061d29934da"; + + // When + Mockito.doNothing() + .when(userUpdateService) + .delete(Mockito.any()); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .delete(endpoint, mockAdminToken.getAccessToken()); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.times(1)) + .delete(mockId); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenId_whenIdDoesNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(invalidId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .delete(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .delete(Mockito.anyString()); + } + + @Test + void givenUserDelete_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "45082f52-011b-41d1-b4bd-6eba4e1f1ea8"; + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .delete(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .delete(Mockito.anyString()); + } + + + @Test + void givenValidId_whenPassivateUser_thenReturnSuccess() throws Exception { + + // Given + String mockId = "894dcc5d-31cc-4704-9f0a-627ac7da517d"; + + // When + Mockito.doNothing() + .when(userUpdateService) + .passivate(Mockito.anyString()); + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId).concat("/passivate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockAdminToken.getAccessToken()); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.times(1)) + .passivate(Mockito.anyString()); + } + + @ParameterizedTest + @ValueSource(strings = { + "A", + "493268349068342" + }) + void givenInvalidUserId_whenIdNotValid_thenReturnValidationErrorForPassivate(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(invalidId).concat("/passivate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .passivate(Mockito.anyString()); + } + + @Test + void givenValidUserId_whenUserUnauthorized_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockId = "333aec72-ecd8-49fc-86f5-2b5458871edb"; + + // Then + String endpoint = BASE_PATH.concat("/user/").concat(mockId).concat("/passivate"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .patch(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(userUpdateService, Mockito.never()) + .passivate(Mockito.anyString()); + } +} diff --git a/src/test/java/org/ays/auth/controller/AysUserControllerTest.java b/src/test/java/org/ays/auth/controller/AysUserControllerTest.java index c4741bcc9..4943e6e18 100644 --- a/src/test/java/org/ays/auth/controller/AysUserControllerTest.java +++ b/src/test/java/org/ays/auth/controller/AysUserControllerTest.java @@ -1,6 +1,5 @@ package org.ays.auth.controller; - import org.ays.AysRestControllerTest; import org.ays.auth.model.AysUser; import org.ays.auth.model.AysUserBuilder; @@ -37,7 +36,7 @@ import org.junit.jupiter.params.provider.NullSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import java.util.Collections; @@ -47,13 +46,13 @@ class AysUserControllerTest extends AysRestControllerTest { - @MockBean + @MockitoBean private AysUserReadService userReadService; - @MockBean + @MockitoBean private AysUserCreateService userCreateService; - @MockBean + @MockitoBean private AysUserUpdateService userUpdateService; @@ -61,7 +60,7 @@ class AysUserControllerTest extends AysRestControllerTest { private final AysUserToResponseMapper userToResponseMapper = AysUserToResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; @Test diff --git a/src/test/java/org/ays/auth/controller/AysUserEndToEndTest.java b/src/test/java/org/ays/auth/controller/AysUserEndToEndTest.java index 51cf5ed06..d7cab11ba 100644 --- a/src/test/java/org/ays/auth/controller/AysUserEndToEndTest.java +++ b/src/test/java/org/ays/auth/controller/AysUserEndToEndTest.java @@ -58,7 +58,7 @@ class AysUserEndToEndTest extends AysEndToEndTest { private final AysUserToResponseMapper userToResponseMapper = AysUserToResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH = "/api/institution/v1"; @Test diff --git a/src/test/java/org/ays/auth/scheduler/InvalidTokenDeletionSchedulerEndToEndTest.java b/src/test/java/org/ays/auth/scheduler/InvalidTokenDeletionSchedulerEndToEndTest.java index b0342cc53..13cbe7b2f 100644 --- a/src/test/java/org/ays/auth/scheduler/InvalidTokenDeletionSchedulerEndToEndTest.java +++ b/src/test/java/org/ays/auth/scheduler/InvalidTokenDeletionSchedulerEndToEndTest.java @@ -12,10 +12,10 @@ import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.scheduling.config.CronTask; import org.springframework.scheduling.config.ScheduledTask; import org.springframework.scheduling.config.ScheduledTaskHolder; +import org.springframework.test.context.bean.override.mockito.MockitoSpyBean; import java.time.LocalDateTime; import java.util.Optional; @@ -29,7 +29,7 @@ class InvalidTokenDeletionSchedulerEndToEndTest extends AysEndToEndTest { @Autowired private ScheduledTaskHolder taskHolder; - @SpyBean + @MockitoSpyBean private AysInvalidTokenDeletionScheduler invalidTokenDeletionScheduler; diff --git a/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationControllerOldTest.java b/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationControllerOldTest.java new file mode 100644 index 000000000..6705f8333 --- /dev/null +++ b/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationControllerOldTest.java @@ -0,0 +1,1216 @@ +package org.ays.emergency_application.controller; + +import org.ays.AysRestControllerTest; +import org.ays.common.model.AysPage; +import org.ays.common.model.AysPageBuilder; +import org.ays.common.model.request.AysPhoneNumberRequest; +import org.ays.common.model.request.AysPhoneNumberRequestBuilder; +import org.ays.common.model.response.AysErrorResponse; +import org.ays.common.model.response.AysErrorResponseBuilder; +import org.ays.common.model.response.AysPageResponse; +import org.ays.common.model.response.AysResponse; +import org.ays.common.model.response.AysResponseBuilder; +import org.ays.common.util.AysRandomUtil; +import org.ays.emergency_application.model.EmergencyEvacuationApplication; +import org.ays.emergency_application.model.EmergencyEvacuationApplicationBuilder; +import org.ays.emergency_application.model.enums.EmergencyEvacuationApplicationStatus; +import org.ays.emergency_application.model.mapper.EmergencyEvacuationApplicationToApplicationResponseMapper; +import org.ays.emergency_application.model.mapper.EmergencyEvacuationApplicationToApplicationsResponseMapper; +import org.ays.emergency_application.model.request.EmergencyEvacuationApplicationListRequest; +import org.ays.emergency_application.model.request.EmergencyEvacuationApplicationListRequestBuilder; +import org.ays.emergency_application.model.request.EmergencyEvacuationApplicationRequest; +import org.ays.emergency_application.model.request.EmergencyEvacuationApplicationUpdateRequest; +import org.ays.emergency_application.model.request.EmergencyEvacuationApplicationUpdateRequestBuilder; +import org.ays.emergency_application.model.request.EmergencyEvacuationRequestBuilder; +import org.ays.emergency_application.model.response.EmergencyEvacuationApplicationResponse; +import org.ays.emergency_application.model.response.EmergencyEvacuationApplicationsResponse; +import org.ays.emergency_application.service.EmergencyEvacuationApplicationService; +import org.ays.util.AysMockMvcRequestBuilders; +import org.ays.util.AysMockResultMatchersBuilders; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; +import org.mockito.Mockito; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import java.util.List; + +@Deprecated(since = "1.2.0 - Use or Develop EmergencyEvacuationApplicationControllerTest Class", forRemoval = true) +class EmergencyEvacuationApplicationControllerOldTest extends AysRestControllerTest { + + @MockitoBean + private EmergencyEvacuationApplicationService emergencyEvacuationApplicationService; + + + private final EmergencyEvacuationApplicationToApplicationsResponseMapper emergencyEvacuationApplicationToApplicationsResponseMapper = EmergencyEvacuationApplicationToApplicationsResponseMapper.initialize(); + private final EmergencyEvacuationApplicationToApplicationResponseMapper emergencyEvacuationApplicationToApplicationResponseMapper = EmergencyEvacuationApplicationToApplicationResponseMapper.initialize(); + + + private static final String BASE_PATH = "/api/v1"; + + + @Test + void givenValidEmergencyEvacuationApplicationListRequest_whenEmergencyEvacuationApplicationsFound_thenReturnAysPageResponseOfEmergencyEvacuationApplicationsResponse() throws Exception { + + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .build(); + + // When + List mockApplications = List.of( + new EmergencyEvacuationApplicationBuilder() + .withValidValues() + .withoutApplicant() + .build() + ); + AysPage mockApplicationsPage = AysPageBuilder + .from(mockApplications, mockListRequest.getPageable()); + + Mockito.when(emergencyEvacuationApplicationService.findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class))) + .thenReturn(mockApplicationsPage); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); + + List mockApplicationsResponse = emergencyEvacuationApplicationToApplicationsResponseMapper.map(mockApplications); + AysPageResponse pageOfResponse = AysPageResponse.builder() + .of(mockApplicationsPage) + .content(mockApplicationsResponse) + .build(); + AysResponse> mockResponse = AysResponse + .successOf(pageOfResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.times(1)) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @CsvSource({ + "must be integer, 321.", + "must be integer, 12.34", + "must be integer, '12,34'", + "must be integer, 1 234", + "must be integer, 12a34", + "must be integer, #", + "must be integer, ' '", + "must be positive integer, -321", + "must be positive integer, 0", + "size must be between 1 and 10, ''", + "size must be between 1 and 10, 12345678912367", + "size must be between 1 and 10, 12345678912367564656464858", + }) + @ParameterizedTest + void givenInvalidEmergencyEvacuationApplicationListRequest_whenReferenceNumberNotValid_thenReturnValidationError(String mockSubErrorMessage, + String mockReferenceNumber) throws Exception { + + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .withReferenceNumber(mockReferenceNumber) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isArray()) + .andExpect(AysMockResultMatchersBuilders.subErrorsSize() + .value(1)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[*].message") + .value(mockSubErrorMessage)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[*].field") + .value("referenceNumber")); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices." + }) + void givenInvalidEmergencyEvacuationApplicationListRequest_whenSourceCityNotValid_thenReturnValidationError(String sourceCity) throws Exception { + + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .withSourceCity(sourceCity) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices." + }) + void givenInvalidEmergencyEvacuationApplicationListRequest_whenSourceDistrictNotValid_thenReturnValidationError(String sourceDistrict) throws Exception { + + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .withSourceDistrict(sourceDistrict) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @ParameterizedTest + @ValueSource(ints = { + -1, + 0, + 1000 + }) + void givenInvalidEmergencyEvacuationApplicationListRequest_whenSeatingCountNotValid_thenReturnValidationError(Integer seatingCount) throws Exception { + + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .withSeatingCount(seatingCount) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices." + }) + void givenInvalidEmergencyEvacuationApplicationListRequest_whenTargetCityNotValid_thenReturnValidationError(String targetCity) throws Exception { + + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .withTargetCity(targetCity) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices." + }) + void givenInvalidEmergencyEvacuationApplicationListRequest_whenTargetDistrictNotValid_thenReturnValidationError(String targetDistrict) throws Exception { + + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .withTargetDistrict(targetDistrict) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @Test + void givenValidEmergencyEvacuationApplicationListRequest_whenUnauthorizedForListing_thenReturnAccessDeniedException() throws Exception { + // Given + EmergencyEvacuationApplicationListRequest mockListRequest = new EmergencyEvacuationApplicationListRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockUserToken.getAccessToken(), mockListRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findAll(Mockito.any(EmergencyEvacuationApplicationListRequest.class)); + } + + @Test + void givenValidEmergencyEvacuationApplicationId_whenEmergencyEvacuationApplicationFound_thenReturnEmergencyEvacuationApplicationResponse() throws Exception { + + // Given + String mockApplicationId = AysRandomUtil.generateUUID(); + + // When + EmergencyEvacuationApplication mockEmergencyEvacuationApplication = new EmergencyEvacuationApplicationBuilder() + .withValidValues() + .withId(mockApplicationId) + .build(); + + Mockito.when(emergencyEvacuationApplicationService.findById(mockApplicationId)) + .thenReturn(mockEmergencyEvacuationApplication); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockApplicationId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + EmergencyEvacuationApplicationResponse mockEmergencyEvacuationApplicationResponse = emergencyEvacuationApplicationToApplicationResponseMapper + .map(mockEmergencyEvacuationApplication); + AysResponse mockResponse = AysResponse + .successOf(mockEmergencyEvacuationApplicationResponse); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.times(1)) + .findById(mockApplicationId); + } + + @Test + void givenEmergencyEvacuationApplicationId_whenUnauthorizedForGettingEmergencyEvacuationApplicationById_thenReturnAccessDeniedException() throws Exception { + + // Given + String mockApplicationId = AysRandomUtil.generateUUID(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/".concat(mockApplicationId)); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findById(mockApplicationId); + } + + @ParameterizedTest + @ValueSource(strings = { + "Invalid with special characters: #$%", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "J----", + "City--King", + "John Doe", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse.", + }) + void givenId_whenIdDoesNotValid_thenReturnValidationError(String invalidId) throws Exception { + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/".concat(invalidId)); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .exists()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findById(invalidId); + } + + + @Test + void givenValidEmergencyEvacuationApplicationRequest_whenApplicationSaved_thenReturnSuccessResponse() throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .build(); + + // When + Mockito.doNothing() + .when(emergencyEvacuationApplicationService) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.times(1)) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @Test + void givenValidEmergencyEvacuationApplicationRequestWithoutApplicant_whenApplicationSaved_thenReturnSuccessResponse() throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withoutApplicant() + .build(); + + // When + Mockito.doNothing() + .when(emergencyEvacuationApplicationService) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.times(1)) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @Test + void givenInvalidEmergencyEvacuationApplicationRequest_whenApplicantAndPersonPhoneNumbersAreSameOne_thenReturnValidationError() throws Exception { + // Given + AysPhoneNumberRequest mockPhoneNumberRequest = new AysPhoneNumberRequestBuilder() + .withValidValues() + .build(); + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withPhoneNumber(mockPhoneNumberRequest) + .withApplicantPhoneNumber(mockPhoneNumberRequest) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @CsvSource({ + "country code must be 90, ABC, ABC", + "country code must be 90, 80, 1234567890", + "country code must be 90, ABC, ABCDEFGHIJ", + "country code must be 90, 456786745645, 6546467456435548676845321346656654", + "line number length must be 10, 90, ABC", + "line number length must be 10, 90, 123456789", + "line number length must be 10, 90, 12345678901", + "must be valid, 90, 1234567890", + "must be valid, 90, 9104567890", + }) + @ParameterizedTest + void givenEmergencyEvacuationApplicationRequest_whenPhoneNumberIsNotValid_thenReturnValidationError(String mockMessage, + String mockCountryCode, + String mockLineNumber) throws Exception { + + // Given + AysPhoneNumberRequest mockPhoneNumberRequest = new AysPhoneNumberRequestBuilder() + .withCountryCode(mockCountryCode) + .withLineNumber(mockLineNumber) + .build(); + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withPhoneNumber(mockPhoneNumberRequest) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].message") + .value(mockMessage)) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].field") + .value("phoneNumber")) + .andExpect(AysMockResultMatchersBuilders.subErrors("[0].value") + .value(mockPhoneNumberRequest.getCountryCode() + mockPhoneNumberRequest.getLineNumber())); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "J----", + "City--King", + "John Doe", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenFirstNameIsNotValid_thenReturnValidationError(String firstName) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withFirstName(firstName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "J----", + "City--King", + "John Doe", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenLastNameIsNotValid_thenReturnValidationError(String lastName) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withLastName(lastName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Mary*land", + "Mary$land", + "CityName$", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenSourceCityIsNotValid_thenReturnValidationError(String sourceCity) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withSourceCity(sourceCity) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Mary*land", + "Mary$land", + "CityName$", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenSourceDistrictIsNotValid_thenReturnValidationError(String sourceDistrict) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withSourceDistrict(sourceDistrict) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Lorem ipsum", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenAddressIsNotValid_thenReturnValidationError(String address) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withAddress(address) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(ints = {-1, 0, 1000,}) + void givenInvalidEmergencyEvacuationApplicationRequest_whenAddressIsNotValid_thenReturnValidationError(Integer seatingCount) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withSeatingCount(seatingCount) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Mary*land", + "Mary$land", + "CityName$", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenTargetCityIsNotValid_thenReturnValidationError(String targetCity) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withTargetCity(targetCity) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + "Mary*land", + "Mary$land", + "CityName$", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenTargetDistrictIsNotValid_thenReturnValidationError(String targetDistrict) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withTargetDistrict(targetDistrict) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + " ", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + "J----", + "City--King", + "John Doe", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenApplicantFirstNameIsNotValid_thenReturnValidationError(String applicantFirstName) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withApplicantFirstName(applicantFirstName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + " ", + "Invalid with special characters: #$%", + "#$½#$£#$£#$$#½#£$£#$#£½#$½#$½$£#$#£$$#½#$$½", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + "J----", + "City--King", + "John Doe", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse platea dictumst. Nullam in turpis at nunc ultrices.", + }) + void givenInvalidEmergencyEvacuationApplicationRequest_whenApplicantLastNameIsNotValid_thenReturnValidationError(String applicantLastName) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withApplicantLastName(applicantLastName) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @Test + void givenInvalidEmergencyEvacuationApplicationRequest_whenAllApplicantFieldsAreNotFilled_thenReturnValidationError() throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withApplicantPhoneNumber(null) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "", + " ", + "İstanbul", + }) + void givenEmergencyEvacuationApplicationRequest_whenSourceAndTargetCityOrDistrictAreBlankOrEmptyOrTheSame_thenReturnValidationError(String name) throws Exception { + // Given + EmergencyEvacuationApplicationRequest mockApplicationRequest = new EmergencyEvacuationRequestBuilder() + .withValidValues() + .withSourceCity(name) + .withSourceDistrict(name) + .withTargetCity(name) + .withTargetDistrict(name) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .post(endpoint, mockApplicationRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); + } + + @Test + void givenValidIdAndValidUpdateRequest_whenApplicationUpdated_thenReturnSuccessResponse() throws Exception { + // Given + String mockId = "dbb3287a-563d-4d85-a978-bcd699294daa"; + EmergencyEvacuationApplicationUpdateRequest mockUpdateRequest = new EmergencyEvacuationApplicationUpdateRequestBuilder() + .withValidValues() + .build(); + + // When + Mockito.doNothing() + .when(emergencyEvacuationApplicationService) + .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysResponse mockResponse = AysResponseBuilder.success(); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(MockMvcResultMatchers.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .doesNotExist()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.times(1)) + .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + "Invalid with special characters: #$%", + ".,..,.,.,.,.,,.,.,.,.,.,.,.,.,..,.,.,,.,.,.,", + "t", + " a", + "151201485621548562154851458614125461254125412", + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam In hac habitasse.", + }) + void givenIdAndValidUpdateRequest_whenIdDoesNotValid_thenReturnValidationError(String mockId) throws Exception { + + // Given + EmergencyEvacuationApplicationUpdateRequest mockUpdateRequest = new EmergencyEvacuationApplicationUpdateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/".concat(mockId)); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .exists()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .findById(Mockito.anyString()); + } + + @ParameterizedTest + @NullSource + @ValueSource(ints = { + -1, + 0, + 1000 + }) + void givenValidIdAndUpdateRequest_whenSeatingCountDoesNotValid_thenReturnValidationError(Integer mockSeatingCount) throws Exception { + // Given + String mockId = "dbb3287a-563d-4d85-a978-bcd699294daa"; + EmergencyEvacuationApplicationUpdateRequest mockUpdateRequest = new EmergencyEvacuationApplicationUpdateRequestBuilder() + .withValidValues() + .withSeatingCount(mockSeatingCount) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); + } + + @ParameterizedTest + @NullSource + void givenValidIdAndUpdateRequest_whenHasObstaclePersonExistDoesNotValid_thenReturnValidationError(Boolean mockHasObstaclePersonExist) throws Exception { + // Given + String mockId = "dbb3287a-563d-4d85-a978-bcd699294daa"; + EmergencyEvacuationApplicationUpdateRequest mockUpdateRequest = new EmergencyEvacuationApplicationUpdateRequestBuilder() + .withValidValues() + .withHasObstaclePersonExist(mockHasObstaclePersonExist) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); + } + + @ParameterizedTest + @NullSource + void givenValidIdAndUpdateRequest_whenStatusDoesNotValid_thenReturnValidationError(EmergencyEvacuationApplicationStatus mockStatus) throws Exception { + // Given + String mockId = "dbb3287a-563d-4d85-a978-bcd699294daa"; + EmergencyEvacuationApplicationUpdateRequest mockUpdateRequest = new EmergencyEvacuationApplicationUpdateRequestBuilder() + .withValidValues() + .withStatus(mockStatus) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); + } + + @ParameterizedTest + @ValueSource(strings = { + """ + Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old. Richard McClintock, a Latin professor at Hampden-Sydney College in Virginia, looked up one of the more obscure Latin words, consectetur, from a Lorem Ipsum passage, and going through the cites of the word in classical literature, discovered the undoubtable source. Lorem Ipsum comes from sections 1.10.32 and 1.10.33 of "de Finibus Bonorum et Malorum" (The Extremes of Good and Evil) by Cicero, written in 45 BC. This book is a treatise on the theory of ethics, very popular during the Renaissance. The first line of Lorem Ipsum, "Lorem ipsum dolor sit amet..", comes from a line in section 1.10.32. + The standard chunk of Lorem Ipsum used since the 1500s is reproduced below for those interested. Sections 1.10.32 and 1.10.33 from "de Finibus Bonorum et Malorum" by Cicero are also reproduced in their exact original form, accompanied by English versions from the 1914 translation by H. Rackham. + """, + " spaceAtTheBeginning", + "spaceAtTheEnd ", + " both ", + " justAString " + }) + void givenValidIdAndUpdateRequest_whenNotesDoesNotValid_thenReturnValidationError(String mockNotes) throws Exception { + // Given + String mockId = "dbb3287a-563d-4d85-a978-bcd699294daa"; + EmergencyEvacuationApplicationUpdateRequest mockUpdateRequest = new EmergencyEvacuationApplicationUpdateRequestBuilder() + .withValidValues() + .withNotes(mockNotes) + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.VALIDATION_ERROR; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isBadRequest()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .isNotEmpty()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); + } + + @Test + void givenValidIdAndUpdateRequest_whenUnauthorizedForUpdating_thenReturnAccessDeniedException() throws Exception { + // Given + String mockId = "dbb3287a-563d-4d85-a978-bcd699294daa"; + EmergencyEvacuationApplicationUpdateRequest mockUpdateRequest = new EmergencyEvacuationApplicationUpdateRequestBuilder() + .withValidValues() + .build(); + + // Then + String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .put(endpoint, mockUserToken.getAccessToken(), mockUpdateRequest); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(emergencyEvacuationApplicationService, Mockito.never()) + .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); + } + +} diff --git a/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationControllerTest.java b/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationControllerTest.java index 9314e6f9b..0d08e08e2 100644 --- a/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationControllerTest.java +++ b/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationControllerTest.java @@ -33,7 +33,7 @@ import org.junit.jupiter.params.provider.NullSource; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import org.springframework.test.web.servlet.result.MockMvcResultMatchers; @@ -41,14 +41,17 @@ class EmergencyEvacuationApplicationControllerTest extends AysRestControllerTest { - @MockBean + @MockitoBean private EmergencyEvacuationApplicationService emergencyEvacuationApplicationService; private final EmergencyEvacuationApplicationToApplicationsResponseMapper emergencyEvacuationApplicationToApplicationsResponseMapper = EmergencyEvacuationApplicationToApplicationsResponseMapper.initialize(); private final EmergencyEvacuationApplicationToApplicationResponseMapper emergencyEvacuationApplicationToApplicationResponseMapper = EmergencyEvacuationApplicationToApplicationResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + + private static final String BASE_PATH_INSTITUTION = "/api/institution/v1"; + private static final String BASE_PATH_LANDING = "/api/landing/v1"; + @Test void givenValidEmergencyEvacuationApplicationListRequest_whenEmergencyEvacuationApplicationsFound_thenReturnAysPageResponseOfEmergencyEvacuationApplicationsResponse() throws Exception { @@ -72,7 +75,7 @@ void givenValidEmergencyEvacuationApplicationListRequest_whenEmergencyEvacuation .thenReturn(mockApplicationsPage); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); @@ -120,7 +123,7 @@ void givenInvalidEmergencyEvacuationApplicationListRequest_whenReferenceNumberNo .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); @@ -162,7 +165,7 @@ void givenInvalidEmergencyEvacuationApplicationListRequest_whenSourceCityNotVali .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); @@ -198,7 +201,7 @@ void givenInvalidEmergencyEvacuationApplicationListRequest_whenSourceDistrictNot .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); @@ -230,7 +233,7 @@ void givenInvalidEmergencyEvacuationApplicationListRequest_whenSeatingCountNotVa .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); @@ -266,7 +269,7 @@ void givenInvalidEmergencyEvacuationApplicationListRequest_whenTargetCityNotVali .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); @@ -302,7 +305,7 @@ void givenInvalidEmergencyEvacuationApplicationListRequest_whenTargetDistrictNot .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockAdminToken.getAccessToken(), mockListRequest); @@ -327,7 +330,7 @@ void givenValidEmergencyEvacuationApplicationListRequest_whenUnauthorizedForList .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockUserToken.getAccessToken(), mockListRequest); @@ -360,7 +363,7 @@ void givenValidEmergencyEvacuationApplicationId_whenEmergencyEvacuationApplicati .thenReturn(mockEmergencyEvacuationApplication); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockApplicationId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(mockApplicationId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .get(endpoint, mockAdminToken.getAccessToken()); @@ -387,7 +390,7 @@ void givenEmergencyEvacuationApplicationId_whenUnauthorizedForGettingEmergencyEv String mockApplicationId = AysRandomUtil.generateUUID(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/".concat(mockApplicationId)); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/".concat(mockApplicationId)); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .get(endpoint, mockUserToken.getAccessToken()); @@ -419,7 +422,7 @@ void givenEmergencyEvacuationApplicationId_whenUnauthorizedForGettingEmergencyEv void givenId_whenIdDoesNotValid_thenReturnValidationError(String invalidId) throws Exception { // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/".concat(invalidId)); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/".concat(invalidId)); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .get(endpoint, mockAdminToken.getAccessToken()); @@ -450,7 +453,7 @@ void givenValidEmergencyEvacuationApplicationRequest_whenApplicationSaved_thenRe .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -480,7 +483,7 @@ void givenValidEmergencyEvacuationApplicationRequestWithoutApplicant_whenApplica .create(Mockito.any(EmergencyEvacuationApplicationRequest.class)); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -509,7 +512,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenApplicantAndPersonPho .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -552,7 +555,7 @@ void givenEmergencyEvacuationApplicationRequest_whenPhoneNumberIsNotValid_thenRe .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -597,7 +600,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenFirstNameIsNotValid_t .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -635,7 +638,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenLastNameIsNotValid_th .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -673,7 +676,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenSourceCityIsNotValid_ .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -711,7 +714,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenSourceDistrictIsNotVa .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -741,7 +744,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenAddressIsNotValid_the .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -767,7 +770,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenAddressIsNotValid_the .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -805,7 +808,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenTargetCityIsNotValid_ .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -843,7 +846,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenTargetDistrictIsNotVa .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -881,7 +884,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenApplicantFirstNameIsN .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -919,7 +922,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenApplicantLastNameIsNo .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -944,7 +947,7 @@ void givenInvalidEmergencyEvacuationApplicationRequest_whenAllApplicantFieldsAre .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -977,7 +980,7 @@ void givenEmergencyEvacuationApplicationRequest_whenSourceAndTargetCityOrDistric .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, mockApplicationRequest); @@ -1007,7 +1010,7 @@ void givenValidIdAndValidUpdateRequest_whenApplicationUpdated_thenReturnSuccessR .update(Mockito.anyString(), Mockito.any(EmergencyEvacuationApplicationUpdateRequest.class)); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(mockId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); @@ -1041,7 +1044,7 @@ void givenIdAndValidUpdateRequest_whenIdDoesNotValid_thenReturnValidationError(S .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/".concat(mockId)); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/".concat(mockId)); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .get(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); @@ -1074,7 +1077,7 @@ void givenValidIdAndUpdateRequest_whenSeatingCountDoesNotValid_thenReturnValidat .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(mockId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); @@ -1102,7 +1105,7 @@ void givenValidIdAndUpdateRequest_whenHasObstaclePersonExistDoesNotValid_thenRet .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(mockId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); @@ -1130,7 +1133,7 @@ void givenValidIdAndUpdateRequest_whenStatusDoesNotValid_thenReturnValidationErr .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(mockId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); @@ -1167,7 +1170,7 @@ void givenValidIdAndUpdateRequest_whenNotesDoesNotValid_thenReturnValidationErro .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(mockId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .put(endpoint, mockAdminToken.getAccessToken(), mockUpdateRequest); @@ -1193,7 +1196,7 @@ void givenValidIdAndUpdateRequest_whenUnauthorizedForUpdating_thenReturnAccessDe .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(mockId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(mockId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .put(endpoint, mockUserToken.getAccessToken(), mockUpdateRequest); diff --git a/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationEndToEndTest.java b/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationEndToEndTest.java index 79fd0efea..a7768a9ae 100644 --- a/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationEndToEndTest.java +++ b/src/test/java/org/ays/emergency_application/controller/EmergencyEvacuationApplicationEndToEndTest.java @@ -51,7 +51,8 @@ class EmergencyEvacuationApplicationEndToEndTest extends AysEndToEndTest { private final EmergencyEvacuationApplicationToApplicationResponseMapper emergencyEvacuationApplicationToApplicationResponseMapper = EmergencyEvacuationApplicationToApplicationResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1"; + private static final String BASE_PATH_INSTITUTION = "/api/institution/v1"; + private static final String BASE_PATH_LANDING = "/api/landing/v1"; @Test @@ -100,7 +101,7 @@ void givenValidEmergencyEvacuationApplicationListRequest_whenApplicationsFound_t .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, adminToken.getAccessToken(), mockListRequest); @@ -178,7 +179,7 @@ void givenValidEmergencyEvacuationApplicationListRequest_whenEmergencyEvacuation .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-applications"); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-applications"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, adminToken.getAccessToken(), mockListRequest); @@ -254,7 +255,7 @@ void givenValidEmergencyEvacuationApplicationId_whenEmergencyEvacuationApplicati String applicationId = application.getId(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(applicationId); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(applicationId); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .get(endpoint, adminToken.getAccessToken()); @@ -322,7 +323,7 @@ void givenValidEmergencyEvacuationApplicationRequest_whenApplicationSaved_thenRe .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, applicationRequest); @@ -380,7 +381,7 @@ void givenValidEmergencyEvacuationApplicationRequestWithoutApplicant_whenApplica .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application"); + String endpoint = BASE_PATH_LANDING.concat("/emergency-evacuation-application"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .post(endpoint, applicationRequest); @@ -453,7 +454,7 @@ void givenValidIdAndValidUpdateRequest_whenApplicationUpdated_thenReturnSuccessR .build(); // Then - String endpoint = BASE_PATH.concat("/emergency-evacuation-application/").concat(id); + String endpoint = BASE_PATH_INSTITUTION.concat("/emergency-evacuation-application/").concat(id); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .put(endpoint, adminToken.getAccessToken(), updateRequest); diff --git a/src/test/java/org/ays/institution/controller/InstitutionControllerOldTest.java b/src/test/java/org/ays/institution/controller/InstitutionControllerOldTest.java new file mode 100644 index 000000000..9f874ff8c --- /dev/null +++ b/src/test/java/org/ays/institution/controller/InstitutionControllerOldTest.java @@ -0,0 +1,87 @@ +package org.ays.institution.controller; + +import org.ays.AysRestControllerTest; +import org.ays.common.model.response.AysErrorResponse; +import org.ays.common.model.response.AysErrorResponseBuilder; +import org.ays.common.model.response.AysResponse; +import org.ays.institution.model.Institution; +import org.ays.institution.model.InstitutionBuilder; +import org.ays.institution.model.mapper.InstitutionToInstitutionsSummaryResponseMapper; +import org.ays.institution.model.response.InstitutionsSummaryResponse; +import org.ays.institution.service.InstitutionService; +import org.ays.util.AysMockMvcRequestBuilders; +import org.ays.util.AysMockResultMatchersBuilders; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; + +import java.util.List; + +@Deprecated(since = "1.2.0 - Use or Develop InstitutionControllerTest Class", forRemoval = true) +class InstitutionControllerOldTest extends AysRestControllerTest { + + @MockitoBean + private InstitutionService institutionService; + + + private final InstitutionToInstitutionsSummaryResponseMapper institutionToInstitutionsSummaryResponseMapper = InstitutionToInstitutionsSummaryResponseMapper.initialize(); + + + private static final String BASE_PATH = "/api/v1"; + + + @Test + void whenInstitutionStatusActive_thenReturnListInstitutionResponse() throws Exception { + + // When + List mockActiveInstitutions = List.of( + new InstitutionBuilder().withValidValues().build(), + new InstitutionBuilder().withValidValues().build() + ); + + Mockito.when(institutionService.getSummaryOfActiveInstitutions()) + .thenReturn(mockActiveInstitutions); + + // Then + String endpoint = BASE_PATH.concat("/institutions/summary"); + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(endpoint, mockSuperAdminToken.getAccessToken()); + + List mockActiveInstitutionsSummaryResponses = institutionToInstitutionsSummaryResponseMapper + .map(mockActiveInstitutions); + AysResponse> mockResponse = AysResponse + .successOf(mockActiveInstitutionsSummaryResponses); + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isOk()) + .andExpect(AysMockResultMatchersBuilders.response() + .isNotEmpty()); + + // Verify + Mockito.verify(institutionService, Mockito.times(1)) + .getSummaryOfActiveInstitutions(); + } + + @Test + void whenUserUnauthorizedForSummary_thenReturnAccessDeniedException() throws Exception { + + // Then + MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders + .get(BASE_PATH.concat("/institutions/summary"), mockUserToken.getAccessToken()); + + AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; + + aysMockMvc.perform(mockHttpServletRequestBuilder, mockErrorResponse) + .andExpect(AysMockResultMatchersBuilders.status() + .isForbidden()) + .andExpect(AysMockResultMatchersBuilders.subErrors() + .doesNotExist()); + + // Verify + Mockito.verify(institutionService, Mockito.never()) + .getSummaryOfActiveInstitutions(); + } + +} diff --git a/src/test/java/org/ays/institution/controller/InstitutionControllerTest.java b/src/test/java/org/ays/institution/controller/InstitutionControllerTest.java index c87dd2d0d..b717f4de6 100644 --- a/src/test/java/org/ays/institution/controller/InstitutionControllerTest.java +++ b/src/test/java/org/ays/institution/controller/InstitutionControllerTest.java @@ -13,21 +13,22 @@ import org.ays.util.AysMockResultMatchersBuilders; import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder; import java.util.List; class InstitutionControllerTest extends AysRestControllerTest { - @MockBean + @MockitoBean private InstitutionService institutionService; private final InstitutionToInstitutionsSummaryResponseMapper institutionToInstitutionsSummaryResponseMapper = InstitutionToInstitutionsSummaryResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1/institutions"; + private static final String BASE_PATH = "/api/institution/v1"; + @Test void whenInstitutionStatusActive_thenReturnListInstitutionResponse() throws Exception { @@ -42,7 +43,7 @@ void whenInstitutionStatusActive_thenReturnListInstitutionResponse() throws Exce .thenReturn(mockActiveInstitutions); // Then - String endpoint = BASE_PATH.concat("/summary"); + String endpoint = BASE_PATH.concat("/institutions/summary"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .get(endpoint, mockSuperAdminToken.getAccessToken()); @@ -67,7 +68,7 @@ void whenUserUnauthorizedForSummary_thenReturnAccessDeniedException() throws Exc // Then MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders - .get(BASE_PATH.concat("/summary"), mockUserToken.getAccessToken()); + .get(BASE_PATH.concat("/institutions/summary"), mockUserToken.getAccessToken()); AysErrorResponse mockErrorResponse = AysErrorResponseBuilder.FORBIDDEN; diff --git a/src/test/java/org/ays/institution/controller/InstitutionEndToEndTest.java b/src/test/java/org/ays/institution/controller/InstitutionEndToEndTest.java index cdcf47b67..5fc5e5d3c 100644 --- a/src/test/java/org/ays/institution/controller/InstitutionEndToEndTest.java +++ b/src/test/java/org/ays/institution/controller/InstitutionEndToEndTest.java @@ -20,7 +20,8 @@ class InstitutionEndToEndTest extends AysEndToEndTest { private final InstitutionToInstitutionsSummaryResponseMapper institutionToInstitutionsSummaryResponseMapper = InstitutionToInstitutionsSummaryResponseMapper.initialize(); - private static final String BASE_PATH = "/api/v1/institutions"; + private static final String BASE_PATH = "/api/institution/v1"; + @Test void whenActiveInstitutionsExist_thenReturnInstitutionSummaryResponses() throws Exception { @@ -32,7 +33,7 @@ void whenActiveInstitutionsExist_thenReturnInstitutionSummaryResponses() throws ); // Then - String endpoint = BASE_PATH.concat("/summary"); + String endpoint = BASE_PATH.concat("/institutions/summary"); MockHttpServletRequestBuilder mockHttpServletRequestBuilder = AysMockMvcRequestBuilders .get(endpoint, superAdminToken.getAccessToken());