diff --git a/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java b/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java index 753bc89cc..0f22be85f 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java @@ -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) @@ -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; } @@ -109,14 +111,21 @@ private void validateUpdateLimitNotExceed(Application application) { } } - private void validateNoDuplicateUniversityChoices(UniversityChoiceRequest universityChoiceRequest) { + // 입력값 유효성 검증 + private void validateUniversityChoices(UniversityChoiceRequest universityChoiceRequest) { Set 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 uniqueUniversityIds, Long universityId) { + boolean notAdded = !uniqueUniversityIds.add(universityId); + if (notAdded) { throw new CustomException(CANT_APPLY_FOR_SAME_UNIVERSITY); } } diff --git a/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java index d967c90bf..7688478fc 100644 --- a/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java +++ b/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java @@ -16,6 +16,8 @@ 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; @@ -23,6 +25,7 @@ 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; @@ -116,7 +119,9 @@ private Application createApplication(String term) { verify(applicationRepository, times(0)).save(any(Application.class)); } - // 예외테스트 + /** + * 지망대학 제출 + */ @Test void 지망대학_제출할_때_성적_제출이력이_없다면_예외_응답을_반환한다() { // given @@ -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()); + } }