From d6b98553a63c7f453d260d713d5e613d21c451c9 Mon Sep 17 00:00:00 2001 From: "tmdqja0705@naver.com" Date: Tue, 8 Aug 2023 17:13:35 +0900 Subject: [PATCH 1/5] =?UTF-8?q?#15=20refactor=20:=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=EC=9D=B8=20=ED=83=80=EC=9E=85=EB=8F=84=20entity=20=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EA=B2=80=EC=A6=9D=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/codesquad/issueTracker/user/domain/User.java | 2 +- .../java/codesquad/issueTracker/user/service/UserService.java | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/be/issue/src/main/java/codesquad/issueTracker/user/domain/User.java b/be/issue/src/main/java/codesquad/issueTracker/user/domain/User.java index 0aa94bd62..060e8bb5c 100644 --- a/be/issue/src/main/java/codesquad/issueTracker/user/domain/User.java +++ b/be/issue/src/main/java/codesquad/issueTracker/user/domain/User.java @@ -30,7 +30,7 @@ public User(Long id, String email, String password, String profileImg, String na } public void validateLoginUser(LoginRequestDto loginRequestDto) { - if (password == null) { + if (password == null || !loginType.equals(LoginType.LOCAL)) { throw new CustomException(ErrorCode.GITHUB_LOGIN_USER); } if (!loginRequestDto.getEmail().equals(email) diff --git a/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java b/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java index 92ebdc67d..5f92c7d02 100644 --- a/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java +++ b/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java @@ -51,8 +51,6 @@ public LoginResponseDto login(LoginRequestDto loginRequestDto) { .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_USER)); user.validateLoginUser(loginRequestDto); - userValidator.validateLoginType(LoginType.LOCAL, user.getLoginType()); - Jwt jwt = jwtProvider.createJwt(Map.of("userId", user.getId())); insertOrUpdateToken(user.getId(), jwt); From 56439aeb2b77e9280779ffba7fe5ac72229196b0 Mon Sep 17 00:00:00 2001 From: "tmdqja0705@naver.com" Date: Tue, 8 Aug 2023 17:14:08 +0900 Subject: [PATCH 2/5] =?UTF-8?q?#15=20refactor=20:=20enum=20=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=EB=B9=84=EA=B5=90=20=EC=8B=9C=20=EB=93=B1=ED=98=B8?= =?UTF-8?q?=20->=20equals=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/codesquad/issueTracker/user/service/UserValidator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be/issue/src/main/java/codesquad/issueTracker/user/service/UserValidator.java b/be/issue/src/main/java/codesquad/issueTracker/user/service/UserValidator.java index 7c8927af6..b2c12e4f4 100644 --- a/be/issue/src/main/java/codesquad/issueTracker/user/service/UserValidator.java +++ b/be/issue/src/main/java/codesquad/issueTracker/user/service/UserValidator.java @@ -15,7 +15,7 @@ public class UserValidator { private final UserRepository userRepository; public void validateLoginType(LoginType inputLoginType, LoginType existLoginType) { - if (inputLoginType != existLoginType) { + if (!inputLoginType.equals(existLoginType)) { throw new CustomException(ErrorCode.FAILED_LOGIN_USER); } } From beff0e7ea3b3c5c212343041c7748f7574c68e65 Mon Sep 17 00:00:00 2001 From: "tmdqja0705@naver.com" Date: Tue, 8 Aug 2023 17:14:16 +0900 Subject: [PATCH 3/5] =?UTF-8?q?#15=20test=20:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/service/UserServiceTest.java | 153 ++++++++++++++++++ .../user/service/UserValidatorTest.java | 13 +- 2 files changed, 160 insertions(+), 6 deletions(-) create mode 100644 be/issue/src/test/java/codesquad/issueTracker/user/service/UserServiceTest.java diff --git a/be/issue/src/test/java/codesquad/issueTracker/user/service/UserServiceTest.java b/be/issue/src/test/java/codesquad/issueTracker/user/service/UserServiceTest.java new file mode 100644 index 000000000..f49901e2e --- /dev/null +++ b/be/issue/src/test/java/codesquad/issueTracker/user/service/UserServiceTest.java @@ -0,0 +1,153 @@ +package codesquad.issueTracker.user.service; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.BDDMockito.*; + +import java.util.Optional; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.mindrot.jbcrypt.BCrypt; +import org.mockito.InjectMocks; +import org.mockito.Mock; + +import annotation.ServiceTest; +import codesquad.issueTracker.global.exception.CustomException; +import codesquad.issueTracker.jwt.domain.Jwt; +import codesquad.issueTracker.jwt.domain.Token; +import codesquad.issueTracker.jwt.util.JwtProvider; +import codesquad.issueTracker.user.domain.LoginType; +import codesquad.issueTracker.user.domain.User; +import codesquad.issueTracker.user.dto.LoginRequestDto; +import codesquad.issueTracker.user.dto.LoginResponseDto; +import codesquad.issueTracker.user.repository.UserRepository; + +@ServiceTest +public class UserServiceTest { + + @InjectMocks + UserService userService; + @Mock + UserRepository userRepository; + @Mock + UserValidator userValidator; + @Mock + JwtProvider jwtProvider; + + @DisplayName("로그인 성공") + @Test + void loginSuccess() { + //given + User mockUser = User.builder() + .id(1L) + .email("rkarbf@gmail.com") + .password(BCrypt.hashpw("password", BCrypt.gensalt())) + .loginType(LoginType.LOCAL) + .build(); + + Jwt mockJwt = new Jwt("accessToken", "refreshToken"); + + given(userRepository.findByEmail(mockUser.getEmail())).willReturn(Optional.of(mockUser)); + given(jwtProvider.createJwt(anyMap())).willReturn(mockJwt); + + LoginRequestDto loginRequestDto = new LoginRequestDto("rkarbf@gmail.com", "password"); + + //when + LoginResponseDto response = userService.login(loginRequestDto); + + //then + assertAll( + () -> assertEquals(mockUser.getId(), response.getUserId()), + () -> assertEquals("accessToken", response.getAccessToken()), + () -> assertEquals("refreshToken", response.getRefreshToken()) + ); + } + + @DisplayName("존재하지 않는 유저 로그인 실패") + @Test + void loginFailedByNotFoundUser() { + given(userRepository.findByEmail(any())).willReturn(Optional.empty()); + LoginRequestDto loginRequestDto = new LoginRequestDto("rkarbf@gmail.com", "password"); + + //when + assertThrows(CustomException.class, () -> userService.login(loginRequestDto)); + } + + @DisplayName("비밀번호 불일치 로그인 실패") + @Test + void loginFailedByWrongPassword() { + User mockUser = User.builder() + .id(1L) + .email("rkarbf@gmail.com") + .password(BCrypt.hashpw("password", BCrypt.gensalt())) + .loginType(LoginType.LOCAL) + .build(); + + given(userRepository.findByEmail(mockUser.getEmail())).willReturn(Optional.of(mockUser)); + LoginRequestDto loginRequestDto = new LoginRequestDto("rkarbf@gmail.com", "passwor"); + + //when + assertThrows(CustomException.class, () -> userService.login(loginRequestDto)); + } + + @DisplayName("로그인타입 불일치 로그인 실패") + @Test + void loginFailedByLoginTypeDiff() { + User mockUser = User.builder() + .id(1L) + .email("rkarbf@gmail.com") + .password(BCrypt.hashpw("password", BCrypt.gensalt())) + .loginType(LoginType.GITHUB) + .build(); + + given(userRepository.findByEmail(mockUser.getEmail())).willReturn(Optional.of(mockUser)); + LoginRequestDto loginRequestDto = new LoginRequestDto("rkarbf@gmail.com", "password"); + + //when + assertThrows(CustomException.class, () -> userService.login(loginRequestDto)); + } + + @DisplayName("로그인 시 리프레쉬 토큰이 존재하지 않을 때 토큰을 생성하는지 테스트") + @Test + void loginWhenRefreshTokenIsNull() { + User mockUser = User.builder() + .id(1L) + .email("rkarbf@gmail.com") + .password(BCrypt.hashpw("password", BCrypt.gensalt())) + .loginType(LoginType.LOCAL) + .build(); + + Jwt mockJwt = new Jwt("accessToken", "refreshToken"); + + given(userRepository.findByEmail(mockUser.getEmail())).willReturn(Optional.of(mockUser)); + given(jwtProvider.createJwt(anyMap())).willReturn(mockJwt); + given(userRepository.findTokenByUserId(1L)).willReturn(Optional.empty()); + + LoginRequestDto loginRequestDto = new LoginRequestDto("rkarbf@gmail.com", "password"); + userService.login(loginRequestDto); + verify(userRepository, times(1)).insertRefreshToken(1L, mockJwt.getRefreshToken()); + verify(userRepository, times(0)).updateRefreshToken(1L, mockJwt.getRefreshToken()); + } + + @DisplayName("로그인 시 리프레쉬 토큰이 존재할 때 토큰을 업데이트하는지 테스트") + @Test + void loginWhenRefreshTokenIsExist() { + User mockUser = User.builder() + .id(1L) + .email("rkarbf@gmail.com") + .password(BCrypt.hashpw("password", BCrypt.gensalt())) + .loginType(LoginType.LOCAL) + .build(); + + Jwt mockJwt = new Jwt("accessToken", "refreshToken"); + + given(userRepository.findByEmail(mockUser.getEmail())).willReturn(Optional.of(mockUser)); + given(jwtProvider.createJwt(anyMap())).willReturn(mockJwt); + given(userRepository.findTokenByUserId(1L)).willReturn(Optional.of(new Token(1L, 1L, "dummy"))); + + LoginRequestDto loginRequestDto = new LoginRequestDto("rkarbf@gmail.com", "password"); + userService.login(loginRequestDto); + verify(userRepository, times(0)).insertRefreshToken(1L, mockJwt.getRefreshToken()); + verify(userRepository, times(1)).updateRefreshToken(1L, mockJwt.getRefreshToken()); + } +} diff --git a/be/issue/src/test/java/codesquad/issueTracker/user/service/UserValidatorTest.java b/be/issue/src/test/java/codesquad/issueTracker/user/service/UserValidatorTest.java index 7d3ddcc56..510570c2b 100644 --- a/be/issue/src/test/java/codesquad/issueTracker/user/service/UserValidatorTest.java +++ b/be/issue/src/test/java/codesquad/issueTracker/user/service/UserValidatorTest.java @@ -52,10 +52,11 @@ void validateLoginUserFailed() { .id(1L) .email("asdfff123@ddd.com") .password(BCrypt.hashpw("12345678", BCrypt.gensalt())) + .loginType(LoginType.LOCAL) .build(); - given(userRepository.findByEmail("asd123@ddd.com")).willReturn(Optional.of(user)); - User findUser = userRepository.findByEmail("asd123@ddd.com").orElseThrow(); + given(userRepository.findByEmail("asd123@dddd.com")).willReturn(Optional.of(user)); + User findUser = userRepository.findByEmail("asd123@dddd.com").orElseThrow(); LoginRequestDto loginRequestDto = new LoginRequestDto("asd123@dddd.com", "123dd45678"); assertThrows(CustomException.class, () -> { @@ -77,7 +78,7 @@ public void validateLoginTypeSuccess() { given(userRepository.findByEmail(any())).willReturn(Optional.ofNullable(existUser)); LoginType existUserLoginType = userRepository.findByEmail(existUser.getEmail()).get().getLoginType(); assertDoesNotThrow(() -> { - // userValidator.validateLoginType(input, existUserLoginType); + userValidator.validateLoginType(input, existUserLoginType); }); } @@ -96,7 +97,7 @@ public void validateLoginTypeFailed() { given(userRepository.findByEmail(any())).willReturn(Optional.ofNullable(existUser)); LoginType existUserLoginType = userRepository.findByEmail(existUser.getEmail()).get().getLoginType(); assertThrows(CustomException.class, () -> { - // userValidator.validateLoginType(input, existUserLoginType); + userValidator.validateLoginType(input, existUserLoginType); }); } @@ -113,7 +114,7 @@ public void validateDuplicatedEmailSuccess() { given(userRepository.findByEmail(any())).willReturn(Optional.empty()); assertDoesNotThrow(() -> { - // userValidator.validateDuplicatedEmail(signUpRequestDto); + userValidator.validateDuplicatedEmail(signUpRequestDto); }); } @@ -129,7 +130,7 @@ public void validateDuplicatedEmailFailed() { given(userRepository.findByEmail(any())).willReturn(Optional.ofNullable(existUser)); assertThrows(CustomException.class, () -> { - // userValidator.validateDuplicatedEmail(signUpRequestDto); + userValidator.validateDuplicatedEmail(signUpRequestDto); }); } From bf09c13b85283731bfcf4eb3fd057b4eb5d7626f Mon Sep 17 00:00:00 2001 From: "tmdqja0705@naver.com" Date: Wed, 9 Aug 2023 14:54:35 +0900 Subject: [PATCH 4/5] =?UTF-8?q?#15=20chore=20:=20=EC=9C=A0=EC=A0=80=20name?= =?UTF-8?q?=20=EA=B8=B8=EC=9D=B4=20=EC=A0=9C=ED=95=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 8 ++++++++ .../codesquad/issueTracker/user/dto/SignUpRequestDto.java | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .idea/.gitignore diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/be/issue/src/main/java/codesquad/issueTracker/user/dto/SignUpRequestDto.java b/be/issue/src/main/java/codesquad/issueTracker/user/dto/SignUpRequestDto.java index b67b36921..cb2029418 100644 --- a/be/issue/src/main/java/codesquad/issueTracker/user/dto/SignUpRequestDto.java +++ b/be/issue/src/main/java/codesquad/issueTracker/user/dto/SignUpRequestDto.java @@ -18,7 +18,7 @@ public class SignUpRequestDto { @Size(min = 6, max = 12, message = "비밀번호는 6자리에서 12자리까지 입력할 수 있습니다.") private final String password; - @Size(min = 6, max = 16, message = "아이디는 최소 6자리에서 16자리까지 입력할 수 있다.") + @Size(min = 2, max = 12, message = "이름은 최소 6자리에서 16자리까지 입력할 수 있다.") private final String name; public static User toEntity(SignUpRequestDto signUpRequestDto, String encodedPassword, String profileImg) { From 31c4fa0b307b91273d10b2e38176541e87664073 Mon Sep 17 00:00:00 2001 From: "tmdqja0705@naver.com" Date: Wed, 9 Aug 2023 14:55:12 +0900 Subject: [PATCH 5/5] =?UTF-8?q?#15=20refactor=20:=20reissue=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20=EC=8B=9C=20=EB=B0=98=ED=99=98=20=ED=83=80=EC=9E=85?= =?UTF-8?q?=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../issueTracker/user/controller/UserController.java | 5 +++-- .../codesquad/issueTracker/user/service/UserService.java | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/be/issue/src/main/java/codesquad/issueTracker/user/controller/UserController.java b/be/issue/src/main/java/codesquad/issueTracker/user/controller/UserController.java index 5a4b6a950..45eefcd26 100644 --- a/be/issue/src/main/java/codesquad/issueTracker/user/controller/UserController.java +++ b/be/issue/src/main/java/codesquad/issueTracker/user/controller/UserController.java @@ -15,6 +15,7 @@ import codesquad.issueTracker.global.ApiResponse; import codesquad.issueTracker.jwt.dto.RequestRefreshTokenDto; +import codesquad.issueTracker.jwt.dto.ResponseAccessToken; import codesquad.issueTracker.oauth.service.OAuthService; import codesquad.issueTracker.user.dto.LoginRequestDto; import codesquad.issueTracker.user.dto.LoginResponseDto; @@ -44,8 +45,8 @@ public ApiResponse login(@Valid @RequestBody LoginRequestDto l } @PostMapping("/reissue/token") - public ApiResponse reissueToken(@RequestBody RequestRefreshTokenDto requestRefreshTokenDto) { - String accessToken = userService.reissueAccessToken(requestRefreshTokenDto); + public ApiResponse reissueToken(@RequestBody RequestRefreshTokenDto requestRefreshTokenDto) { + ResponseAccessToken accessToken = userService.reissueAccessToken(requestRefreshTokenDto); return ApiResponse.success(SUCCESS.getStatus(), accessToken); } diff --git a/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java b/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java index 5f92c7d02..3282f427e 100644 --- a/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java +++ b/be/issue/src/main/java/codesquad/issueTracker/user/service/UserService.java @@ -13,8 +13,8 @@ import codesquad.issueTracker.jwt.domain.Jwt; import codesquad.issueTracker.jwt.domain.Token; import codesquad.issueTracker.jwt.dto.RequestRefreshTokenDto; +import codesquad.issueTracker.jwt.dto.ResponseAccessToken; import codesquad.issueTracker.jwt.util.JwtProvider; -import codesquad.issueTracker.user.domain.LoginType; import codesquad.issueTracker.user.domain.User; import codesquad.issueTracker.user.dto.LoginRequestDto; import codesquad.issueTracker.user.dto.LoginResponseDto; @@ -87,12 +87,13 @@ public User findExistedOrInsertedUser(User user) { * 2. DB에 없는 리프레시 토큰이면 예외처리 */ @Transactional(readOnly = true) - public String reissueAccessToken(RequestRefreshTokenDto refreshTokenDto) { + public ResponseAccessToken reissueAccessToken(RequestRefreshTokenDto refreshTokenDto) { jwtProvider.getClaims(refreshTokenDto.getRefreshToken()); Token token = userRepository.findTokenByUserToken(refreshTokenDto.getRefreshToken()) .orElseThrow(() -> new CustomException(ErrorCode.NOT_FOUND_REFRESH_TOKEN)); - return jwtProvider.reissueAccessToken(Map.of("userId", token.getUserId())); + return new ResponseAccessToken(jwtProvider.reissueAccessToken(Map.of("userId", token.getUserId()))); + } public void logout(HttpServletRequest request) {