Skip to content
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.ezcode.codetest.application.usermanagement.user.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class UserReviewTokenResponse {
private final int reviewToken;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import org.ezcode.codetest.application.usermanagement.user.dto.response.GrantAdminRoleResponse;
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserProfileImageResponse;
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserReviewTokenResponse;
import org.ezcode.codetest.application.usermanagement.user.model.UsersByWeek;
import org.ezcode.codetest.domain.submission.dto.WeeklySolveCount;
import org.ezcode.codetest.application.usermanagement.user.dto.request.ChangeUserPasswordRequest;
Expand Down Expand Up @@ -176,4 +177,10 @@ public UserProfileImageResponse deleteUserProfileImage(AuthUser authUser) {

return new UserProfileImageResponse(null);
}

public UserReviewTokenResponse getReivewToken(AuthUser authUser) {
User user = userDomainService.getUserById(authUser.getId());

return new UserReviewTokenResponse(user.getReviewToken());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import org.ezcode.codetest.application.usermanagement.user.dto.response.GrantAdminRoleResponse;
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserInfoResponse;
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserProfileImageResponse;
import org.ezcode.codetest.application.usermanagement.user.dto.response.UserReviewTokenResponse;
import org.ezcode.codetest.application.usermanagement.user.dto.response.WithdrawUserResponse;
import org.ezcode.codetest.application.usermanagement.user.service.UserService;
import org.ezcode.codetest.domain.user.model.entity.AuthUser;
Expand Down Expand Up @@ -94,4 +95,12 @@ public ResponseEntity<WithdrawUserResponse> withdraw(
return ResponseEntity.status(HttpStatus.OK).body(userService.withdrawUser(authUser));
}

@Operation(summary = "회원 AI 리뷰 토큰 조회", description = "회원의 남은 AI리뷰용 토큰의 개수를 조회합니다.")
@GetMapping("/users/review-token")
public ResponseEntity<UserReviewTokenResponse> getReviewToken(
@AuthenticationPrincipal AuthUser authUser
){
return ResponseEntity.status(HttpStatus.OK).body(userService.getReivewToken(authUser));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
import org.ezcode.codetest.domain.user.repository.UserAuthTypeRepository;
import org.ezcode.codetest.domain.user.repository.UserRepository;
import org.ezcode.codetest.domain.user.service.UserDomainService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
Expand Down Expand Up @@ -58,7 +57,6 @@ public class UserDomainServiceTest {
) {
public Long getId() { return 1L; }
public int getReviewToken() { return 5; }
public int getZeroReviewToken() { return 0; }
};
private final UserAuthType testAuthType = new UserAuthType(testUser, AuthType.EMAIL);

Expand Down Expand Up @@ -173,4 +171,51 @@ void isDeletedUser_shouldPassWhenActive() {
assertDoesNotThrow(() -> userDomainService.isDeletedUser(testUser));
}

// 9. 닉네임 자동 생성 테스트
@Test
void generateUniqueNickname_shouldReturnNonExistingNickname() {
when(userRepository.existsByNickname(any())).thenReturn(false);
String nickname = userDomainService.generateUniqueNickname();
assertNotNull(nickname);
}

@Test
void generateUniqueNickname_shouldThrowWhenMaxAttempts() {
when(userRepository.existsByNickname(any())).thenReturn(true);
assertThrows(IllegalStateException.class, () -> userDomainService.generateUniqueNickname());
}

// 10. 리뷰 토큰 테스트
@Test
void decreaseReviewToken_shouldUpdateWhenTokensAvailable() {
testUser.setReviewToken(5);
assertDoesNotThrow(() -> userDomainService.decreaseReviewToken(testUser));
verify(userRepository).decreaseReviewToken(testUser);
}

@Test
void decreaseReviewToken_shouldThrowWhenNoTokens() {
User zeroTokenUser = new User(
"[email protected]", "pwd", "user", "nick",
28, Tier.NEWBIE, UserRole.USER,
false, true, "https://github.com", false
) {
public int getReviewToken() {
return 0;
}
};

UserException exception = assertThrows(UserException.class,
() -> userDomainService.decreaseReviewToken(zeroTokenUser));

assertEquals(UserExceptionCode.NOT_ENOUGH_TOKEN, exception.getResponseCode());
}


// 12. 이메일로 유저 찾기
@Test
void getUserByEmail_shouldReturnUser() {
when(userRepository.getUserByEmail("[email protected]")).thenReturn(testUser);
assertEquals(testUser, userDomainService.getUserByEmail("[email protected]"));
}
}
Loading