💡 .java를 클릭시 관련 커밋으로 이동💡
/auth/info
@AuthenticationPrincipal 사용하여 인증된 사용자의 정보 → 역할 확인(UNAUNTH 면 예외 처리)→ platformId + platformType 으로 DB에 저장된 값 조회 → 없으면 예외처리 → 사용자 정보 조회
@ApiResponse(responseCode = "200", description = "회원 정보 조회 성공", content = @Content(schema = @Schema(implementation = UserInfoResponse.class)))
@GetMapping("/info")
public JsonResult<UserInfoResponse> userInfo(@AuthenticationPrincipal User user) {
if (user.getRole() == UNAUTH) {
return JsonResult.failOf(ExceptionMessage.UNAUTHORIZED_AUTHORITY.getText());
}
UserInfoResponse userInfoResponse = authService.getUserByInfo(user.getPlatformId(), user.getPlatformType());
return JsonResult.successOf(userInfoResponse);
}
회원 정보 조회 api Controller 구현
@Getter
public class UserInfoResponse {
private UserRole role;
private String githubId;
private String name;
private String profileImageUrl;
private boolean pushAlarmYn;
private boolean profilePublicYn;
private int score;
private int point;
@Builder
public UserInfoResponse(UserRole role, String githubId, String name, String profileImageUrl, boolean pushAlarmYn, boolean profilePublicYn, int score, int point) {
this.role = role;
this.githubId = githubId;
this.name = name;
this.profileImageUrl = profileImageUrl;
this.pushAlarmYn = pushAlarmYn;
this.profilePublicYn = profilePublicYn;
this.score = score;
this.point = point;
}
public static UserInfoResponse of(User user){
return UserInfoResponse.builder()
.role(user.getRole())
.githubId(user.getGithubId())
.name(user.getName())
.profileImageUrl(user.getProfileImageUrl())
.pushAlarmYn(user.isPushAlarmYn())
.profilePublicYn(user.isProfilePublicYn())
.score(user.getScore())
.point(user.getPoint())
.build();
}
}
유저에게 보여줄 정보 DTO 추가
public UserInfoResponse getUserByInfo(String platformId, UserPlatformType platformType) {
User userInfoResponse = userRepository.findByPlatformIdAndPlatformType(platformId, platformType)
.orElseThrow(() -> {
log.warn(">>>> User not found with platformId: {} platformType: {}", platformId, platformType);
throw new UserException(ExceptionMessage.USER_NOT_FOUND);
});
return UserInfoResponse.of(userInfoResponse);
}
회원 정보 조회 Service 구현
테스트
@Test
@DisplayName("유저정보 조회 성공 테스트")
void userInfoSuccessTest() throws Exception {
//given
User user = User.builder()
.name(expectedName)
.role(UserRole.USER)
.platformId(expectedPlatformId)
.platformType(UserPlatformType.GOOGLE)
.githubId("j-ra1n")
.profileImageUrl(expectedProfileImageUrl)
.pushAlarmYn(true)
.score(0)
.point(0)
.build();
UserInfoResponse savedUser = UserInfoResponse.of(userRepository.save(user));
when(authService.getUserByInfo(expectedPlatformId, UserPlatformType.GOOGLE)).thenReturn(savedUser);
HashMap<String, String> map = new HashMap<>();
map.put("role", user.getRole().name());
map.put("platformId", user.getPlatformId());
map.put("platformType", String.valueOf(user.getPlatformType()));
String accessToken = jwtService.generateAccessToken(map, user);
String refreshToken = jwtService.generateRefreshToken(map, user);
// when
mockMvc.perform(get("/auth/info")
.contentType(MediaType.APPLICATION_JSON)
.header(AUTHORIZATION, createAuthorizationHeader(accessToken, refreshToken)))
// then
.andExpect(status().isOk())
.andExpect(jsonPath("$.res_code").value(200))
.andExpect(jsonPath("$.res_obj.role").value(String.valueOf(UserRole.USER)))
.andExpect(jsonPath("$.res_obj.name").value(expectedName))
.andExpect(jsonPath("$.res_obj.profile_image_url").value(expectedProfileImageUrl))
.andExpect(jsonPath("$.res_obj.github_id").value("j-ra1n"))
.andExpect(jsonPath("$.res_obj.push_alarm_yn").value(true))
.andExpect(jsonPath("$.res_obj.score").value(0))
.andExpect(jsonPath("$.res_obj.point").value(0));
}
@Test
@DisplayName("유저정보 조회 실패 테스트 - 잘못된 Token")
void userInfoWhenInvalidToken() throws Exception {
// given
String accessToken = "strangeToken";
String refreshToken = "strangeToken";
// when
mockMvc.perform(get("/auth/info")
.contentType(MediaType.APPLICATION_JSON)
.header(AUTHORIZATION, createAuthorizationHeader(accessToken, refreshToken)))
// then
.andExpect(status().isOk())
.andExpect(jsonPath("$.res_code").value(400))
.andExpect(jsonPath("$.res_msg").value(ExceptionMessage.JWT_MALFORMED.getText()));
}
@Test
@DisplayName("유저정보 조회 실패 테스트 - 잘못된 권한")
void userInfoWhenInvalidAuthority() throws Exception {
User user = User.builder()
.name(expectedName)
.role(UserRole.UNAUTH) // 잘못된 권한(미인증)
.platformId(expectedPlatformId)
.platformType(UserPlatformType.GOOGLE)
.githubId("j-ra1n")
.profileImageUrl(expectedProfileImageUrl)
.pushAlarmYn(true)
.score(0)
.point(0)
.build();
User savedUser = userRepository.save(user);
HashMap<String, String> map = new HashMap<>();
map.put("role", savedUser.getRole().name());
map.put("platformId", savedUser.getPlatformId());
map.put("platformType", String.valueOf(savedUser.getPlatformType()));
String accessToken = jwtService.generateAccessToken(map, user);
String refreshToken = jwtService.generateRefreshToken(map, user);
// when
mockMvc.perform(get("/auth/info")
.contentType(MediaType.APPLICATION_JSON)
.header(AUTHORIZATION, createAuthorizationHeader(accessToken, refreshToken)))
// then
.andExpect(status().isOk())
.andExpect(jsonPath("$.res_code").value(400));
}
유저 정보 조회 성공 테스트
잘못된 Token → 유저 정보 조회 실패 테스트
잘못된 권한 → 유저 정보 조회 실패 테스
@Test
@DisplayName("유저 정보가 가져와지는지 확인")
void getUserByInfoTest() {
// given
String expectedProfileUrl = "https://google.com";
String expectedGithubId = "j_ra1n";
User savedUser = userRepository.save(generateUser());
// when
UserInfoResponse expectedUser = authService.getUserByInfo(savedUser.getPlatformId(), savedUser.getPlatformType());
// then
assertThat(expectedUser).isNotNull();
assertEquals(expectedUser.getRole(), USER);
assertEquals(expectedUser.getProfileImageUrl(), expectedProfileUrl);
assertEquals(expectedUser.getGithubId(), expectedGithubId);
}
회원 정보 조회 Service 테스트
'Project > 깃터디 (gitudy)' 카테고리의 다른 글
[깃터디/Todo] Todo 등록 api 구현 (0) | 2024.05.11 |
---|---|
[깃터디/Auth] 닉네임 중복검사 api 구현 (0) | 2024.05.10 |
[깃터디/Auth] 로그아웃 요청 구현 (0) | 2024.05.10 |
[깃터디/Auth] 로그인 페이지 요청 구현 (0) | 2024.05.10 |
[깃터디/Auth] OAuth2 Login 구현 (0) | 2024.05.10 |
댓글