Skip to content

Commit

Permalink
Merge pull request #45 from codesquad-issue-team-05/dev-be/feature/#15
Browse files Browse the repository at this point in the history
Dev be/feature/#15
  • Loading branch information
swinb committed Aug 9, 2023
2 parents 26755b5 + 31c4fa0 commit 6c7780a
Show file tree
Hide file tree
Showing 8 changed files with 178 additions and 16 deletions.
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -44,8 +45,8 @@ public ApiResponse<LoginResponseDto> login(@Valid @RequestBody LoginRequestDto l
}

@PostMapping("/reissue/token")
public ApiResponse<String> reissueToken(@RequestBody RequestRefreshTokenDto requestRefreshTokenDto) {
String accessToken = userService.reissueAccessToken(requestRefreshTokenDto);
public ApiResponse<ResponseAccessToken> reissueToken(@RequestBody RequestRefreshTokenDto requestRefreshTokenDto) {
ResponseAccessToken accessToken = userService.reissueAccessToken(requestRefreshTokenDto);
return ApiResponse.success(SUCCESS.getStatus(), accessToken);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -89,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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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("[email protected]")
.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("[email protected]", "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("[email protected]", "password");

//when
assertThrows(CustomException.class, () -> userService.login(loginRequestDto));
}

@DisplayName("비밀번호 불일치 로그인 실패")
@Test
void loginFailedByWrongPassword() {
User mockUser = User.builder()
.id(1L)
.email("[email protected]")
.password(BCrypt.hashpw("password", BCrypt.gensalt()))
.loginType(LoginType.LOCAL)
.build();

given(userRepository.findByEmail(mockUser.getEmail())).willReturn(Optional.of(mockUser));
LoginRequestDto loginRequestDto = new LoginRequestDto("[email protected]", "passwor");

//when
assertThrows(CustomException.class, () -> userService.login(loginRequestDto));
}

@DisplayName("로그인타입 불일치 로그인 실패")
@Test
void loginFailedByLoginTypeDiff() {
User mockUser = User.builder()
.id(1L)
.email("[email protected]")
.password(BCrypt.hashpw("password", BCrypt.gensalt()))
.loginType(LoginType.GITHUB)
.build();

given(userRepository.findByEmail(mockUser.getEmail())).willReturn(Optional.of(mockUser));
LoginRequestDto loginRequestDto = new LoginRequestDto("[email protected]", "password");

//when
assertThrows(CustomException.class, () -> userService.login(loginRequestDto));
}

@DisplayName("로그인 시 리프레쉬 토큰이 존재하지 않을 때 토큰을 생성하는지 테스트")
@Test
void loginWhenRefreshTokenIsNull() {
User mockUser = User.builder()
.id(1L)
.email("[email protected]")
.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("[email protected]", "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("[email protected]")
.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("[email protected]", "password");
userService.login(loginRequestDto);
verify(userRepository, times(0)).insertRefreshToken(1L, mockJwt.getRefreshToken());
verify(userRepository, times(1)).updateRefreshToken(1L, mockJwt.getRefreshToken());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,11 @@ void validateLoginUserFailed() {
.id(1L)
.email("[email protected]")
.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("[email protected]", "123dd45678");

assertThrows(CustomException.class, () -> {
Expand All @@ -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);
});

}
Expand All @@ -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);
});

}
Expand All @@ -113,7 +114,7 @@ public void validateDuplicatedEmailSuccess() {
given(userRepository.findByEmail(any())).willReturn(Optional.empty());

assertDoesNotThrow(() -> {
// userValidator.validateDuplicatedEmail(signUpRequestDto);
userValidator.validateDuplicatedEmail(signUpRequestDto);
});
}

Expand All @@ -129,7 +130,7 @@ public void validateDuplicatedEmailFailed() {
given(userRepository.findByEmail(any())).willReturn(Optional.ofNullable(existUser));

assertThrows(CustomException.class, () -> {
// userValidator.validateDuplicatedEmail(signUpRequestDto);
userValidator.validateDuplicatedEmail(signUpRequestDto);
});
}

Expand Down

0 comments on commit 6c7780a

Please sign in to comment.