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 @@ -68,7 +68,7 @@ public boolean submitScore(String email, ScoreRequest scoreRequest) {
* */
@Transactional
public boolean submitUniversityChoice(String email, UniversityChoiceRequest universityChoiceRequest) {
validateNoDuplicateUniversityChoices(universityChoiceRequest);
validateUniversityChoices(universityChoiceRequest);

// 성적 제출한 적이 한번도 없는 경우
Application existingApplication = applicationRepository.findTop1BySiteUser_EmailOrderByTermDesc(email)
Expand All @@ -83,14 +83,16 @@ public boolean submitUniversityChoice(String email, UniversityChoiceRequest univ
})
.orElse(existingApplication); // 금학기에 이미 성적 제출한 경우 기존 객체 사용

validateUpdateLimitNotExceed(application);

UniversityInfoForApply firstChoiceUniversity = universityInfoForApplyRepository
.getUniversityInfoForApplyByIdAndTerm(universityChoiceRequest.firstChoiceUniversityId(), term);
UniversityInfoForApply secondChoiceUniversity = universityInfoForApplyRepository
.getUniversityInfoForApplyByIdAndTerm(universityChoiceRequest.secondChoiceUniversityId(), term);
UniversityInfoForApply thirdChoiceUniversity = universityInfoForApplyRepository
.getUniversityInfoForApplyByIdAndTerm(universityChoiceRequest.thirdChoiceUniversityId(), term);

validateUpdateLimitNotExceed(application);
UniversityInfoForApply secondChoiceUniversity = Optional.ofNullable(universityChoiceRequest.secondChoiceUniversityId())
.map(id -> universityInfoForApplyRepository.getUniversityInfoForApplyByIdAndTerm(id, term))
.orElse(null);
UniversityInfoForApply thirdChoiceUniversity = Optional.ofNullable(universityChoiceRequest.thirdChoiceUniversityId())
.map(id -> universityInfoForApplyRepository.getUniversityInfoForApplyByIdAndTerm(id, term))
.orElse(null);
application.updateUniversityChoice(firstChoiceUniversity, secondChoiceUniversity, thirdChoiceUniversity, getRandomNickname());
return true;
}
Expand All @@ -109,14 +111,21 @@ private void validateUpdateLimitNotExceed(Application application) {
}
}

private void validateNoDuplicateUniversityChoices(UniversityChoiceRequest universityChoiceRequest) {
// 입력값 유효성 검증
private void validateUniversityChoices(UniversityChoiceRequest universityChoiceRequest) {
Set<Long> uniqueUniversityIds = new HashSet<>();

uniqueUniversityIds.add(universityChoiceRequest.firstChoiceUniversityId());
uniqueUniversityIds.add(universityChoiceRequest.secondChoiceUniversityId());
uniqueUniversityIds.add(universityChoiceRequest.thirdChoiceUniversityId());
if (universityChoiceRequest.secondChoiceUniversityId() != null) {
addUniversityChoice(uniqueUniversityIds, universityChoiceRequest.secondChoiceUniversityId());
}
if (universityChoiceRequest.thirdChoiceUniversityId() != null) {
addUniversityChoice(uniqueUniversityIds, universityChoiceRequest.thirdChoiceUniversityId());
}
}

if (uniqueUniversityIds.size() < 3) {
private void addUniversityChoice(Set<Long> uniqueUniversityIds, Long universityId) {
boolean notAdded = !uniqueUniversityIds.add(universityId);
if (notAdded) {
throw new CustomException(CANT_APPLY_FOR_SAME_UNIVERSITY);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,16 @@
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.test.util.ReflectionTestUtils;

import java.util.Optional;

import static com.example.solidconnection.custom.exception.ErrorCode.CANT_APPLY_FOR_SAME_UNIVERSITY;
import static com.example.solidconnection.custom.exception.ErrorCode.SCORE_SHOULD_SUBMITTED_FIRST;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
Expand Down Expand Up @@ -116,7 +119,9 @@ private Application createApplication(String term) {
verify(applicationRepository, times(0)).save(any(Application.class));
}

// 예외테스트
/**
* 지망대학 제출
*/
@Test
void 지망대학_제출할_때_성적_제출이력이_없다면_예외_응답을_반환한다() {
// given
Expand Down Expand Up @@ -171,4 +176,48 @@ private Application createApplication(String term) {
verify(siteUserRepository, times(0)).getByEmail(siteUser.getEmail());
verify(applicationRepository, times(0)).save(any(Application.class));
}

@ParameterizedTest
@CsvSource({
"1, 2, 3",
"1, , 3",
"1, 2, ",
"1, , "
})
void 지망대학_제출할_때_2지망과_3지망은_NULL_허용한다(Long firstChoice, Long secondChoice, Long thirdChoice) {
// Given
UniversityChoiceRequest universityChoiceRequest = new UniversityChoiceRequest(firstChoice, secondChoice, thirdChoice);
when(applicationRepository.findTop1BySiteUser_EmailOrderByTermDesc(siteUser.getEmail()))
.thenReturn(Optional.of(application));

// When
applicationSubmissionService.submitUniversityChoice(siteUser.getEmail(), universityChoiceRequest);

// Then
verify(applicationRepository, times(1)).findTop1BySiteUser_EmailOrderByTermDesc(siteUser.getEmail());
verify(siteUserRepository, times(0)).getByEmail(siteUser.getEmail());
verify(applicationRepository, times(0)).save(any(Application.class));
}

@ParameterizedTest
@CsvSource({
"1, 1, 1",
"1, 2, 1",
"1, 1, 2",
"1, , 1",
"1, 1, "
})
void 지망대학_제출할_때_선택지가_중복된다면_예외_응답을_반환한다(Long firstChoice, Long secondChoice, Long thirdChoice) {
// given
UniversityChoiceRequest universityChoiceRequest = new UniversityChoiceRequest(firstChoice, secondChoice, thirdChoice);

// when, then
CustomException exception = assertThrows(CustomException.class, () -> {
applicationSubmissionService.submitUniversityChoice(siteUser.getEmail(), universityChoiceRequest);
});
assertThat(exception.getMessage())
.isEqualTo(CANT_APPLY_FOR_SAME_UNIVERSITY.getMessage());
assertThat(exception.getCode())
.isEqualTo(CANT_APPLY_FOR_SAME_UNIVERSITY.getCode());
}
}