From c1f3d53793c2c6110b6562e4afa7cebb7ee2f588 Mon Sep 17 00:00:00 2001 From: Art Date: Thu, 9 Sep 2021 22:34:38 +0300 Subject: [PATCH] 78.1 Update user (#9) --- .../backend/controller/UserResource.java | 6 + .../controller/UserResourceUnSecureTest.java | 195 ++++++++++++++++++ 2 files changed, 201 insertions(+) diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java index e0e8707..3fdad08 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResource.java @@ -63,6 +63,12 @@ public class UserResource { return userService.addNewUser(userDto); } + @PutMapping("{currentUsername}") + public User updateUser(@PathVariable String currentUsername, @Valid UserDto userDto) { + log.debug("User DTO: {}", userDto); + return userService.updateUser(currentUsername, userDto); + } + private void authenticate(String username, String password) { Authentication auth = new UsernamePasswordAuthenticationToken(username, password); authenticationManager.authenticate(auth); diff --git a/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceUnSecureTest.java b/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceUnSecureTest.java index 8fc2d5d..769ee3d 100644 --- a/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceUnSecureTest.java +++ b/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceUnSecureTest.java @@ -3,13 +3,16 @@ package net.shyshkin.study.fullstack.supportportal.backend.controller; import lombok.extern.slf4j.Slf4j; import net.shyshkin.study.fullstack.supportportal.backend.common.BaseUserTest; import net.shyshkin.study.fullstack.supportportal.backend.domain.HttpResponse; +import net.shyshkin.study.fullstack.supportportal.backend.domain.Role; import net.shyshkin.study.fullstack.supportportal.backend.domain.User; import net.shyshkin.study.fullstack.supportportal.backend.domain.dto.UserDto; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.test.context.TestPropertySource; @@ -216,4 +219,196 @@ class UserResourceUnSecureTest extends BaseUserTest { .hasFieldOrPropertyWithValue("message", "ERROR(S) IN PARAMETERS: [NONLOCKED:FAILED TO CONVERT PROPERTY VALUE OF TYPE 'JAVA.LANG.STRING' TO REQUIRED TYPE 'BOOLEAN' FOR PROPERTY 'NONLOCKED'; NESTED EXCEPTION IS JAVA.LANG.ILLEGALARGUMENTEXCEPTION: INVALID BOOLEAN VALUE [NOT_A_BOOLEAN]]"); } } + + @Nested + class UpdateUserTests { + + @BeforeEach + void setUp() { + user = userRepository + .findAll() + .stream() + .findAny() + .orElseGet(() -> userRepository.save(createRandomUser())); + } + + @Test + void updateUser_correct_LeaveUsername() { + + //given + UserDto userDto = createRandomUserDto(); + String currentUsername = user.getUsername(); + userDto.setUsername(currentUsername); + userDto.setRole(Role.ROLE_MANAGER); + + Map paramMap = Map.of( + "currentUsername", currentUsername, + "firstName", userDto.getFirstName(), + "lastName", userDto.getLastName(), + "username", userDto.getUsername(), + "email", userDto.getEmail(), + "role", userDto.getRole().name(), + "isActive", String.valueOf(userDto.isActive()), + "isNonLocked", String.valueOf(userDto.isNonLocked()) + ); + + //when + ResponseEntity responseEntity = restTemplate + .exchange( + "/user/{currentUsername}?username={username}&email={email}" + + "&firstName={firstName}&lastName={lastName}" + + "&role={role}&active={isActive}&nonLocked={isNonLocked}", + HttpMethod.PUT, + null, + User.class, + paramMap + ); + + //then + log.debug("Response Entity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(OK); + assertThat(responseEntity.getBody()) + .isNotNull() + .hasNoNullFieldsOrPropertiesExcept("lastLoginDate", "lastLoginDateDisplay") + .hasFieldOrPropertyWithValue("username", userDto.getUsername()) + .hasFieldOrPropertyWithValue("email", userDto.getEmail()) + .hasFieldOrPropertyWithValue("firstName", userDto.getFirstName()) + .hasFieldOrPropertyWithValue("lastName", userDto.getLastName()) + .hasFieldOrPropertyWithValue("isActive", true) + .hasFieldOrPropertyWithValue("isNotLocked", true) + .hasFieldOrPropertyWithValue("role", "ROLE_MANAGER"); + } + + @Test + void updateUser_correct_ChangeUsername() { + + //given + UserDto userDto = createRandomUserDto(); + String currentUsername = user.getUsername(); + + userDto.setRole(Role.ROLE_HR); + + Map paramMap = Map.of( + "currentUsername", currentUsername, + "firstName", userDto.getFirstName(), + "lastName", userDto.getLastName(), + "username", userDto.getUsername(), + "email", userDto.getEmail(), + "role", userDto.getRole().name(), + "isActive", userDto.isActive(), + "isNonLocked", userDto.isNonLocked() + ); + + //when + ResponseEntity responseEntity = restTemplate + .exchange( + "/user/{currentUsername}?username={username}&email={email}" + + "&firstName={firstName}&lastName={lastName}" + + "&role={role}&active={isActive}&nonLocked={isNonLocked}", + HttpMethod.PUT, + null, + User.class, + paramMap + ); + + //then + log.debug("Response Entity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(OK); + assertThat(responseEntity.getBody()) + .isNotNull() + .hasNoNullFieldsOrPropertiesExcept("lastLoginDate", "lastLoginDateDisplay") + .hasFieldOrPropertyWithValue("username", userDto.getUsername()) + .hasFieldOrPropertyWithValue("email", userDto.getEmail()) + .hasFieldOrPropertyWithValue("firstName", userDto.getFirstName()) + .hasFieldOrPropertyWithValue("lastName", userDto.getLastName()) + .hasFieldOrPropertyWithValue("isActive", true) + .hasFieldOrPropertyWithValue("isNotLocked", true) + .hasFieldOrPropertyWithValue("role", "ROLE_HR") + .satisfies(u -> assertThat(u.getAuthorities()).hasSize(2)); + } + + @Test + void updateUser_missedLastName() { + + //given + UserDto userDto = createRandomUserDto(); + String currentUsername = user.getUsername(); + + userDto.setRole(Role.ROLE_USER); + + Map paramMap = Map.of( + "currentUsername", currentUsername, + "firstName", userDto.getFirstName(), + "username", userDto.getUsername(), + "email", userDto.getEmail(), + "role", userDto.getRole().name(), + "isActive", userDto.isActive(), + "isNonLocked", userDto.isNonLocked() + ); + + //when + var responseEntity = restTemplate + .exchange( + "/user/{currentUsername}?username={username}&email={email}" + + "&firstName={firstName}" + + "&role={role}&active={isActive}&nonLocked={isNonLocked}", + HttpMethod.PUT, + null, + HttpResponse.class, + paramMap + ); + + //then + log.debug("Response Entity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(BAD_REQUEST); + assertThat(responseEntity.getBody()) + .isNotNull() + .hasNoNullFieldsOrProperties() + .hasFieldOrPropertyWithValue("httpStatus", BAD_REQUEST) + .hasFieldOrPropertyWithValue("message", "ERROR(S) IN PARAMETERS: [LASTNAME:SHOULD NOT BE EMPTY]"); + } + + @Test + void updateUser_absentUser() { + + //given + UserDto userDto = createRandomUserDto(); + String currentUsername = FAKER.name().username(); + userDto.setUsername(currentUsername); + userDto.setRole(Role.ROLE_MANAGER); + + Map paramMap = Map.of( + "currentUsername", currentUsername, + "firstName", userDto.getFirstName(), + "lastName", userDto.getLastName(), + "username", userDto.getUsername(), + "email", userDto.getEmail(), + "role", userDto.getRole().name(), + "isActive", String.valueOf(userDto.isActive()), + "isNonLocked", String.valueOf(userDto.isNonLocked()) + ); + + //when + var responseEntity = restTemplate + .exchange( + "/user/{currentUsername}?username={username}&email={email}" + + "&firstName={firstName}&lastName={lastName}" + + "&role={role}&active={isActive}&nonLocked={isNonLocked}", + HttpMethod.PUT, + null, + HttpResponse.class, + paramMap + ); + + //then + log.debug("Response Entity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(BAD_REQUEST); + assertThat(responseEntity.getBody()) + .isNotNull() + .hasNoNullFieldsOrProperties() + .hasFieldOrPropertyWithValue("httpStatus", BAD_REQUEST) + .hasFieldOrPropertyWithValue("message", String.format("User with username `%s` not found", currentUsername).toUpperCase()); + } + + } } \ No newline at end of file