From ad785f05b142fe440b8a0ff3dbd5e90322f59ab9 Mon Sep 17 00:00:00 2001 From: Art Date: Tue, 7 Sep 2021 21:56:18 +0300 Subject: [PATCH] 55. User logging in test (#5) --- .../backend/service/UserServiceImpl.java | 2 +- .../backend/controller/UserResourceTest.java | 107 ++++++++++++++++++ .../backend/service/UserServiceTest.java | 4 +- 3 files changed, 110 insertions(+), 3 deletions(-) diff --git a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceImpl.java b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceImpl.java index 1777767..f2b1c16 100644 --- a/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceImpl.java +++ b/support-portal-backend/src/main/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceImpl.java @@ -42,7 +42,7 @@ public class UserServiceImpl implements UserService { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository .findByUsername(username) - .orElseThrow(() -> new UserNotFoundException(String.format(USERNAME_NOT_FOUND_MSG, username))); + .orElseThrow(() -> new UsernameNotFoundException(String.format(USERNAME_NOT_FOUND_MSG, username))); user.setLastLoginDateDisplay(user.getLastLoginDate()); user.setLastLoginDate(LocalDateTime.now()); return new UserPrincipal(user); diff --git a/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceTest.java b/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceTest.java index 72972aa..2f192eb 100644 --- a/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceTest.java +++ b/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/controller/UserResourceTest.java @@ -1,5 +1,6 @@ package net.shyshkin.study.fullstack.supportportal.backend.controller; +import com.auth0.jwt.interfaces.JWTVerifier; import lombok.extern.slf4j.Slf4j; import net.shyshkin.study.fullstack.supportportal.backend.common.BaseUserTest; import net.shyshkin.study.fullstack.supportportal.backend.domain.HttpResponse; @@ -17,6 +18,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; +import static net.shyshkin.study.fullstack.supportportal.backend.constant.SecurityConstants.JWT_TOKEN_HEADER; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import static org.springframework.http.HttpStatus.*; @@ -32,6 +34,9 @@ class UserResourceTest extends BaseUserTest { @Autowired JwtTokenProvider jwtTokenProvider; + @Autowired + JWTVerifier jwtVerifier; + @Test @Order(10) void showUserHome_forbidden() { @@ -159,4 +164,106 @@ class UserResourceTest extends BaseUserTest { () -> assertThat(httpResponse.getMessage()).isEqualTo(expectedMessage) )); } + + @Test + @Order(50) + void loginUser_existingUser() { + + //given + User fakeUser = createRandomUser(); + String password = fakeUser.getPassword().replace("{noop}", ""); + String username = fakeUser.getUsername(); + userRepository.save(fakeUser); + String expectedMessage = "User logged in successfully"; + + //when + User userLogin = User.builder() + .username(username) + .password(password) + .build(); + var responseEntity = restTemplate.postForEntity("/user/login", userLogin, HttpResponse.class); + + //then + log.debug("Response Entity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(OK); + assertThat(responseEntity.getBody()) + .isNotNull() + .hasNoNullFieldsOrProperties() + .satisfies(httpResponse -> assertAll( + () -> assertThat(httpResponse.getHttpStatusCode()).isEqualTo(200), + () -> assertThat(httpResponse.getHttpStatus()).isEqualTo(OK), + () -> assertThat(httpResponse.getReason()).isEqualTo("OK"), + () -> assertThat(httpResponse.getMessage()).isEqualTo(expectedMessage) + )); + String token = responseEntity.getHeaders().getFirst(JWT_TOKEN_HEADER); + log.debug("Token: {}", token); + assertThat(token).isNotBlank(); + assertThat(jwtVerifier.verify(token).getSubject()).isEqualTo(username); + } + + @Test + @Order(51) + void loginUser_absentUser() { + + //given + String password = "absentUserPass"; + String username = FAKER.name().username(); + String expectedMessage = "USERNAME / PASSWORD INCORRECT. PLEASE TRY AGAIN"; + + //when + User userLogin = User.builder() + .username(username) + .password(password) + .build(); + var responseEntity = restTemplate.postForEntity("/user/login", userLogin, HttpResponse.class); + + //then + log.debug("Response Entity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(BAD_REQUEST); + assertThat(responseEntity.getBody()) + .isNotNull() + .hasNoNullFieldsOrProperties() + .satisfies(httpResponse -> assertAll( + () -> assertThat(httpResponse.getHttpStatusCode()).isEqualTo(400), + () -> assertThat(httpResponse.getHttpStatus()).isEqualTo(BAD_REQUEST), + () -> assertThat(httpResponse.getReason()).isEqualTo("BAD REQUEST"), + () -> assertThat(httpResponse.getMessage()).isEqualTo(expectedMessage) + )); + String token = responseEntity.getHeaders().getFirst(JWT_TOKEN_HEADER); + log.debug("Token: {}", token); + assertThat(token).isNull(); + } + + @Test + @Order(52) + void loginUser_wrongPassword() { + + //given + String password = "wrongPass"; + String username = user.getUsername(); + String expectedMessage = "USERNAME / PASSWORD INCORRECT. PLEASE TRY AGAIN"; + + //when + User userLogin = User.builder() + .username(username) + .password(password) + .build(); + var responseEntity = restTemplate.postForEntity("/user/login", userLogin, HttpResponse.class); + + //then + log.debug("Response Entity: {}", responseEntity); + assertThat(responseEntity.getStatusCode()).isEqualTo(BAD_REQUEST); + assertThat(responseEntity.getBody()) + .isNotNull() + .hasNoNullFieldsOrProperties() + .satisfies(httpResponse -> assertAll( + () -> assertThat(httpResponse.getHttpStatusCode()).isEqualTo(400), + () -> assertThat(httpResponse.getHttpStatus()).isEqualTo(BAD_REQUEST), + () -> assertThat(httpResponse.getReason()).isEqualTo("BAD REQUEST"), + () -> assertThat(httpResponse.getMessage()).isEqualTo(expectedMessage) + )); + String token = responseEntity.getHeaders().getFirst(JWT_TOKEN_HEADER); + log.debug("Token: {}", token); + assertThat(token).isNull(); + } } \ No newline at end of file diff --git a/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceTest.java b/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceTest.java index 16d7ecd..2789a9b 100644 --- a/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceTest.java +++ b/support-portal-backend/src/test/java/net/shyshkin/study/fullstack/supportportal/backend/service/UserServiceTest.java @@ -3,11 +3,11 @@ package net.shyshkin.study.fullstack.supportportal.backend.service; import lombok.extern.slf4j.Slf4j; import net.shyshkin.study.fullstack.supportportal.backend.common.BaseUserTest; import net.shyshkin.study.fullstack.supportportal.backend.domain.User; -import net.shyshkin.study.fullstack.supportportal.backend.exception.domain.UserNotFoundException; import org.assertj.core.api.ThrowableAssert; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; import java.time.temporal.ChronoUnit; import java.util.Optional; @@ -58,7 +58,7 @@ class UserServiceTest extends BaseUserTest { //then assertThatThrownBy(execution) - .isInstanceOf(UserNotFoundException.class) + .isInstanceOf(UsernameNotFoundException.class) .hasMessage("User with username `" + username + "` not found"); } } \ No newline at end of file