Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -639,9 +639,8 @@ private void validateJoinRequest(Challenge challenge, User user, String inputPas
throw new GlobalException(ErrorCode.MAX_CHALLENGE_EXCEEDED);
}

// 모집 상태 검증 (UPCOMING 이거나 RECRUITING 상태여야 함)
if (challenge.getStatus() != ChallengeStatus.UPCOMING &&
challenge.getStatus() != ChallengeStatus.RECRUITING) {
// 상태 검증 (종료만 아니면 모두 참여 가능)
if (challenge.getStatus() == ChallengeStatus.FINISHED) {
throw new GlobalException(ErrorCode.CHALLENGE_NOT_RECRUITING);
}

Expand Down Expand Up @@ -760,14 +759,8 @@ private ActionButtonStatus resolveButtonStatus(Challenge challenge, boolean isPa
return ActionButtonStatus.WAITLIST;
}

// 미참여자 + 모집 중 -> 참가하기
if (challenge.getStatus() == ChallengeStatus.UPCOMING
|| challenge.getStatus() == ChallengeStatus.RECRUITING) {
return ActionButtonStatus.JOIN;
}

// 그 외 -> 비활성화
return ActionButtonStatus.DISABLED;
// 그 외 -> 참가하기
return ActionButtonStatus.JOIN;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ void participant_upcoming_beforeStart_returns_CERTIFIED() {
// 조건: 상태는 UPCOMING
setChallengeStatus(challenge, ChallengeStatus.UPCOMING, 10, 30);
// 조건: 인증 시간대 내 (시간은 맞지만 날짜가 안 맞음)
setVerificationTime(challenge, LocalTime.now().minusHours(1), LocalTime.now().plusHours(1));
setVerificationTime(challenge, LocalTime.of(9, 0), LocalTime.of(18, 0));

// Mocking
mockFetchingChallenge(challengeId, challenge);
Expand Down Expand Up @@ -92,7 +92,7 @@ void participant_notVerificationDay_returns_CERTIFIED() {

// 조건: 라운드 시작됨, 시간 맞음
setRoundDate(challenge, LocalDate.now().minusDays(1));
setVerificationTime(challenge, LocalTime.now().minusHours(1), LocalTime.now().plusHours(1));
setVerificationTime(challenge, LocalTime.of(9, 0), LocalTime.of(18, 0));
setChallengeStatus(challenge, ChallengeStatus.ONGOING, 10, 30);

// Mocking
Expand All @@ -117,8 +117,8 @@ void participant_notVerificationTime_returns_CERTIFIED() {

setRoundDate(challenge, LocalDate.now().minusDays(1));

// 조건: 인증 시간이 현재 시간보다 미래임 (아직 안 옴)
setVerificationTime(challenge, LocalTime.now().plusHours(1), LocalTime.now().plusHours(2));
// 현재 시간과 겹치지 않도록 이른 시간대 고정
setVerificationTime(challenge, LocalTime.of(0, 0), LocalTime.of(0, 1));

// Mocking
mockFetchingChallenge(challengeId, challenge);
Expand All @@ -142,7 +142,7 @@ void participant_readyToVerify_returns_AVAILABLE() {

setRoundDate(challenge, LocalDate.now().minusDays(1));
// 조건: 현재 시간이 인증 시간 내에 포함됨
setVerificationTime(challenge, LocalTime.now().minusHours(1), LocalTime.now().plusHours(1));
setVerificationTime(challenge, LocalTime.MIN, LocalTime.MAX);

// Mocking
mockFetchingChallenge(challengeId, challenge);
Expand All @@ -169,7 +169,7 @@ void participant_alreadyVerified_returns_CERTIFIED() {
Challenge challenge = createChallengeBase();

setRoundDate(challenge, LocalDate.now().minusDays(1));
setVerificationTime(challenge, LocalTime.now().minusHours(1), LocalTime.now().plusHours(1));
setVerificationTime(challenge, LocalTime.MIN, LocalTime.MAX);

// Mocking
mockFetchingChallenge(challengeId, challenge);
Expand Down Expand Up @@ -272,6 +272,31 @@ void challenge_finished_returns_DISABLED() {
assertThat(result.getActionButtonStatus()).isEqualTo(ActionButtonStatus.DISABLED);
}

@Test
@DisplayName("상황 9: 미참여자 + 진행중(ONGOING) + 자리 있음 -> JOIN (중도 참여 허용 확인)")
void guest_ongoing_hasSpace_returns_JOIN() {
// Given
Long challengeId = 1L;
User user = mock(User.class);
Challenge challenge = mock(Challenge.class);

// 조건: 진행 중(ONGOING), 인원 여유 있음
setChallengeStatus(challenge, ChallengeStatus.ONGOING, 5, 10);
setRoundDate(challenge, LocalDate.now().minusDays(5)); // 이미 시작된지 5일 지남

// Mocking
mockFetchingChallenge(challengeId, challenge);
mockParticipant(user, challenge, false);

mockConverter(ActionButtonStatus.JOIN);

// When
ChallengeResponseDto.HeaderInfoDto result = challengeService.getChallengeHeaderInfo(challengeId, user);

// Then
assertThat(result.getActionButtonStatus()).isEqualTo(ActionButtonStatus.JOIN);
}

/**
* Helper Methods (테스트 설정을 쉽게 하기 위한 도구들)
*/
Expand Down