diff --git a/src/main/java/com/projects/aeroplannerrestapi/controller/UserController.java b/src/main/java/com/projects/aeroplannerrestapi/controller/UserController.java index a3918ee..9afc947 100644 --- a/src/main/java/com/projects/aeroplannerrestapi/controller/UserController.java +++ b/src/main/java/com/projects/aeroplannerrestapi/controller/UserController.java @@ -36,7 +36,7 @@ public class UserController { @PreAuthorize(SUPER_ADMIN_OR_ADMIN_ROLE_AUTHORIZATION) @Operation(summary = GET_ALL_ADMINISTRATORS) @ApiResponses(@ApiResponse(responseCode = OK, description = FOUND_ALL_THE_ADMINISTRATORS)) - public ResponseEntity getAllAdministrators( + public ResponseEntity getAllUsers( @RequestParam(name = PAGE_NUM, defaultValue = DEFAULT_PAGE_NUM, required = false) int pageNumber, @RequestParam(name = PAGE_SIZE, defaultValue = DEFAULT_PAGE_SIZE, required = false) int pageSize, @RequestParam(name = SORT_BY, defaultValue = DEFAULT_SORT_BY, required = false) String sortBy, @@ -53,4 +53,4 @@ public ResponseEntity getAuthenticatedUser() { LOG.debug("getAuthenticatedUser()"); return ResponseEntity.ok(userService.getAuthenticatedUser()); } -} +} \ No newline at end of file diff --git a/src/main/java/com/projects/aeroplannerrestapi/service/impl/UserServiceImpl.java b/src/main/java/com/projects/aeroplannerrestapi/service/impl/UserServiceImpl.java index e83a79c..5034429 100644 --- a/src/main/java/com/projects/aeroplannerrestapi/service/impl/UserServiceImpl.java +++ b/src/main/java/com/projects/aeroplannerrestapi/service/impl/UserServiceImpl.java @@ -1,8 +1,10 @@ package com.projects.aeroplannerrestapi.service.impl; +import com.projects.aeroplannerrestapi.constants.ErrorMessage; import com.projects.aeroplannerrestapi.dto.response.PaginatedAndSortedUserResponse; import com.projects.aeroplannerrestapi.dto.response.UserResponse; import com.projects.aeroplannerrestapi.entity.User; +import com.projects.aeroplannerrestapi.exception.ResourceNotFoundException; import com.projects.aeroplannerrestapi.mapper.UserMapper; import com.projects.aeroplannerrestapi.repository.UserRepository; import com.projects.aeroplannerrestapi.service.UserService; @@ -33,9 +35,11 @@ public class UserServiceImpl implements UserService { @Transactional(readOnly = true) public UserResponse getAuthenticatedUser() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); - User currentUser = (User) authentication.getPrincipal(); - LOG.info(String.format("Current authenticated user : %s", currentUser.getEmail())); - return UserMapper.INSTANCE.userToUserResponse(currentUser); + String email = authentication.getName(); + User user = userRepository.findByEmail(email).orElseThrow(() -> new ResourceNotFoundException(ErrorMessage.USER, + ErrorMessage.EMAIL, email)); + LOG.info(String.format("Current authenticated user : %s", user.getUsername())); + return UserMapper.INSTANCE.userToUserResponse(user); } @Override diff --git a/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerIT.java b/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerIT.java index f9d1bd7..abe68a1 100644 --- a/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerIT.java +++ b/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerIT.java @@ -1,4 +1,137 @@ package com.projects.aeroplannerrestapi.controller; -public class UserControllerIT { +import com.fasterxml.jackson.databind.ObjectMapper; +import com.projects.aeroplannerrestapi.entity.Role; +import com.projects.aeroplannerrestapi.entity.User; +import com.projects.aeroplannerrestapi.enums.RoleEnum; +import com.projects.aeroplannerrestapi.repository.RoleRepository; +import com.projects.aeroplannerrestapi.repository.UserRepository; +import com.projects.aeroplannerrestapi.service.JwtService; +import com.projects.aeroplannerrestapi.util.AbstractContainerBaseTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +import java.util.List; +import java.util.Set; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +@AutoConfigureMockMvc +@ActiveProfiles("integration") +@WithMockUser(roles = {"SUPER_ADMIN", "ADMIN"}) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class UserControllerIT extends AbstractContainerBaseTest { + + @Autowired + private MockMvc mockMvc; + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private PasswordEncoder passwordEncoder; + + @Autowired + private UserRepository userRepository; + + @Autowired + private RoleRepository roleRepository; + + @Autowired + private JwtService jwtService; + + @Autowired + private AuthenticationManager authenticationManager; + + private Role savedRole; + + @BeforeEach + public void setup() { + userRepository.deleteAll(); + roleRepository.deleteAll(); + + Role role = new Role(); + role.setName(RoleEnum.USER); + role.setDescription("Default user role"); + savedRole = roleRepository.save(role); + } + + @Test + public void givenListOfAllUsers_whenGetAllUsers_thenReturnPaginatedAndSortedUsers() throws Exception { + // given + User user1 = new User(); + user1.setFullName("Full Name 1"); + user1.setEmail("sample1@email.com"); + user1.setPassword(passwordEncoder.encode("password1")); + user1.setRoles(Set.of(savedRole)); + + User user2 = new User(); + user2.setFullName("Full Name 2"); + user2.setEmail("sample2@email.com"); + user2.setPassword(passwordEncoder.encode("password 2")); + user2.setRoles(Set.of(savedRole)); + + List savedUsers = userRepository.saveAll(List.of(user1, user2)); + + // when + ResultActions resultActions = mockMvc.perform(get("/api/v1/users") + .param("pageNum", "1") + .param("pageSize", "10") + .param("sortBy", "id") + .param("sortDir", "asc")); + + // then + resultActions.andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.content[0][0].id").value(savedUsers.get(0).getId())) + .andExpect(jsonPath("$.content[0][0].fullName").value(savedUsers.get(0).getFullName())) + .andExpect(jsonPath("$.content[0][0].email").value(savedUsers.get(0).getEmail())) + .andExpect(jsonPath("$.content[0][1].id").value(savedUsers.get(1).getId())) + .andExpect(jsonPath("$.content[0][1].fullName").value(savedUsers.get(1).getFullName())) + .andExpect(jsonPath("$.content[0][1].email").value(savedUsers.get(1).getEmail())); + } + + @Test + @WithMockUser(username = "sample@email.com") + public void givenAuthenticatedUser_whenGetAuthenticatedUser_thenReturnAuthenticatedUser() throws Exception { + // given + String email = "sample@email.com"; + String password = "password"; + + User authenticatedUser = new User(); + authenticatedUser.setFullName("Full Name"); + authenticatedUser.setEmail(email); + authenticatedUser.setPassword(passwordEncoder.encode(password)); + authenticatedUser.setRoles(Set.of(savedRole)); + User savedUser = userRepository.save(authenticatedUser); + + authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(email, password)); + String token = jwtService.generateToken(savedUser); + + // when + ResultActions resultActions = mockMvc.perform(get("/api/v1/users/me") + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", "Bearer " + token)); + + // then + resultActions.andDo(print()) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.email").value(savedUser.getEmail())) + .andExpect(jsonPath("$.fullName").value(savedUser.getFullName())); + } } diff --git a/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerTest.java b/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerTest.java index b917f73..9fbc59f 100644 --- a/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerTest.java +++ b/src/test/java/com/projects/aeroplannerrestapi/controller/UserControllerTest.java @@ -30,7 +30,7 @@ void testConstructor() { @Test void testGetAllAdministrators() { - ResponseEntity response = userController.getAllAdministrators(0, 1, "sort by", "sort dir"); + ResponseEntity response = userController.getAllUsers(0, 1, "sort by", "sort dir"); AssertionsUtil.assertNullBodyStatusCode(HttpStatus.OK, response); }