diff --git a/src/main/java/com/example/solidconnection/application/domain/Application.java b/src/main/java/com/example/solidconnection/application/domain/Application.java index 44dcc52f1..085141f22 100644 --- a/src/main/java/com/example/solidconnection/application/domain/Application.java +++ b/src/main/java/com/example/solidconnection/application/domain/Application.java @@ -48,6 +48,9 @@ public class Application { @Column(columnDefinition = "int not null default 0") private Integer updateCount; + @Column(length = 50, nullable = false) + private String term; + @ManyToOne private UniversityInfoForApply firstChoiceUniversity; @@ -63,10 +66,14 @@ public class Application { public Application( SiteUser siteUser, Gpa gpa, - LanguageTest languageTest) { + LanguageTest languageTest, + String term) { this.siteUser = siteUser; this.gpa = gpa; this.languageTest = languageTest; + this.term = term; + this.updateCount = 0; + this.verifyStatus = PENDING; } public void updateGpaAndLanguageTest( diff --git a/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java b/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java index a78c98c20..84751786b 100644 --- a/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java +++ b/src/main/java/com/example/solidconnection/application/dto/UniversityApplicantsResponse.java @@ -25,7 +25,7 @@ public record UniversityApplicantsResponse( public static UniversityApplicantsResponse of(UniversityInfoForApply universityInfoForApply, List applicant) { return new UniversityApplicantsResponse( - universityInfoForApply.getUniversity().getKoreanName(), + universityInfoForApply.getKoreanName(), universityInfoForApply.getStudentCapacity(), universityInfoForApply.getUniversity().getRegion().getKoreanName(), universityInfoForApply.getUniversity().getCountry().getKoreanName(), diff --git a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java index 34b714438..8f30c196c 100644 --- a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java @@ -18,18 +18,18 @@ public interface ApplicationRepository extends JpaRepository boolean existsByNicknameForApply(String nicknameForApply); - Optional findBySiteUser_Email(String email); + Optional findTop1BySiteUser_EmailOrderByTermDesc(String email); - Optional findBySiteUser(SiteUser siteUser); + Optional findBySiteUserAndTerm(SiteUser siteUser, String term); - List findAllByFirstChoiceUniversityAndVerifyStatus(UniversityInfoForApply firstChoiceUniversity, VerifyStatus verifyStatus); + List findAllByFirstChoiceUniversityAndVerifyStatusAndTerm(UniversityInfoForApply firstChoiceUniversity, VerifyStatus verifyStatus, String term); - List findAllBySecondChoiceUniversityAndVerifyStatus(UniversityInfoForApply secondChoiceUniversity, VerifyStatus verifyStatus); + List findAllBySecondChoiceUniversityAndVerifyStatusAndTerm(UniversityInfoForApply secondChoiceUniversity, VerifyStatus verifyStatus, String term); - List findAllByThirdChoiceUniversityAndVerifyStatus(UniversityInfoForApply thirdChoiceUniversity, VerifyStatus verifyStatus); + List findAllByThirdChoiceUniversityAndVerifyStatusAndTerm(UniversityInfoForApply thirdChoiceUniversity, VerifyStatus verifyStatus, String term); - default Application getApplicationBySiteUser(SiteUser siteUser) { - return findBySiteUser(siteUser) + default Application getApplicationBySiteUserAndTerm(SiteUser siteUser, String term) { + return findBySiteUserAndTerm(siteUser, term) .orElseThrow(() -> new CustomException(APPLICATION_NOT_FOUND)); } } diff --git a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java index 793cf28ca..2e481023d 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java @@ -52,41 +52,43 @@ public ApplicationsResponse getApplicants(String email, String regionCode, Strin List universities = universityFilterRepository.findByRegionCodeAndKeywords(regionCode, List.of(keyword)); - // 1지망, 2지망 지원자들을 조회한다. - List firstChoiceApplicants = getFirstChoiceApplicants(universities, siteUser); - List secondChoiceApplicants = getSecondChoiceApplicants(universities, siteUser); - List thirdChoiceApplicants = getThirdChoiceApplicants(universities, siteUser); + // 1지망, 2지망, 3지망 지원자들을 조회한다. + List firstChoiceApplicants = getFirstChoiceApplicants(universities, siteUser, term); + List secondChoiceApplicants = getSecondChoiceApplicants(universities, siteUser, term); + List thirdChoiceApplicants = getThirdChoiceApplicants(universities, siteUser, term); return new ApplicationsResponse(firstChoiceApplicants, secondChoiceApplicants, thirdChoiceApplicants); } + // 학기별로 상태가 관리된다. + // 금학기에 지원이력이 있는 사용자만 지원정보를 확인할 수 있도록 한다. private void validateSiteUserCanViewApplicants(SiteUser siteUser) { - VerifyStatus verifyStatus = applicationRepository.getApplicationBySiteUser(siteUser).getVerifyStatus(); + VerifyStatus verifyStatus = applicationRepository.getApplicationBySiteUserAndTerm(siteUser,term).getVerifyStatus(); if (verifyStatus != VerifyStatus.APPROVED) { throw new CustomException(APPLICATION_NOT_APPROVED); } } - private List getFirstChoiceApplicants(List universities, SiteUser siteUser) { + private List getFirstChoiceApplicants(List universities, SiteUser siteUser, String term) { return getApplicantsByChoice( universities, siteUser, - uia -> applicationRepository.findAllByFirstChoiceUniversityAndVerifyStatus(uia, VerifyStatus.APPROVED) + uia -> applicationRepository.findAllByFirstChoiceUniversityAndVerifyStatusAndTerm(uia, VerifyStatus.APPROVED, term) ); } - private List getSecondChoiceApplicants(List universities, SiteUser siteUser) { + private List getSecondChoiceApplicants(List universities, SiteUser siteUser, String term) { return getApplicantsByChoice( universities, siteUser, - uia -> applicationRepository.findAllBySecondChoiceUniversityAndVerifyStatus(uia, VerifyStatus.APPROVED) + uia -> applicationRepository.findAllBySecondChoiceUniversityAndVerifyStatusAndTerm(uia, VerifyStatus.APPROVED, term) ); } - private List getThirdChoiceApplicants(List universities, SiteUser siteUser) { + private List getThirdChoiceApplicants(List universities, SiteUser siteUser, String term) { return getApplicantsByChoice( universities, siteUser, - uia -> applicationRepository.findAllByThirdChoiceUniversityAndVerifyStatus(uia, VerifyStatus.APPROVED) + uia -> applicationRepository.findAllByThirdChoiceUniversityAndVerifyStatusAndTerm(uia, VerifyStatus.APPROVED, term) ); } 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 beec76a05..753bc89cc 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationSubmissionService.java @@ -16,13 +16,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; +import java.util.*; -import static com.example.solidconnection.custom.exception.ErrorCode.APPLY_UPDATE_LIMIT_EXCEED; -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 com.example.solidconnection.custom.exception.ErrorCode.*; @RequiredArgsConstructor @Service @@ -35,11 +31,12 @@ public class ApplicationSubmissionService { private final SiteUserRepository siteUserRepository; @Value("${university.term}") - public String term; + private String term; /* * 학점과 영어 성적을 제출한다. - * - 기존에 제출한 적이 있다면, 수정한다. + * - 금학기에 제출한 적이 있다면, 수정한다. + * - 성적을 제출한적이 한번도 없거나 제출한적이 있지만 금학기에 제출한 적이 없다면 새로 등록한다. * - 수정을 하고 나면, 성적 승인 상태(verifyStatus)를 PENDING 상태로 변경한다. * */ @Transactional @@ -48,15 +45,14 @@ public boolean submitScore(String email, ScoreRequest scoreRequest) { Gpa gpa = scoreRequest.toGpa(); LanguageTest languageTest = scoreRequest.toLanguageTest(); - applicationRepository.findBySiteUser_Email(email) + applicationRepository.findBySiteUserAndTerm(siteUser, term) .ifPresentOrElse( - // 수정 + // 금학기에 성적 제출 이력이 있는 경우 application -> application.updateGpaAndLanguageTest(gpa, languageTest), - - // 최초 등록 - () -> applicationRepository.save( - new Application(siteUser, gpa, languageTest) - ) + () -> { + // 성적 제출한적이 한번도 없는 경우 && 성적 제출한적이 있지만 금학기에 없는 경우 + applicationRepository.save(new Application(siteUser, gpa, languageTest, term)); + } ); return true; } @@ -73,9 +69,20 @@ public boolean submitScore(String email, ScoreRequest scoreRequest) { @Transactional public boolean submitUniversityChoice(String email, UniversityChoiceRequest universityChoiceRequest) { validateNoDuplicateUniversityChoices(universityChoiceRequest); - Application application = applicationRepository.findBySiteUser_Email(email) + + // 성적 제출한 적이 한번도 없는 경우 + Application existingApplication = applicationRepository.findTop1BySiteUser_EmailOrderByTermDesc(email) .orElseThrow(() -> new CustomException(SCORE_SHOULD_SUBMITTED_FIRST)); + Application application = Optional.of(existingApplication) + .filter(app -> !app.getTerm().equals(term)) + .map(app -> { + // 성적 제출한 적이 있지만 금학기에 없는 경우, 이전 성적으로 새 Application 객체를 등록 + SiteUser siteUser = siteUserRepository.getByEmail(email); + return applicationRepository.save(new Application(siteUser, app.getGpa(), app.getLanguageTest(), term)); + }) + .orElse(existingApplication); // 금학기에 이미 성적 제출한 경우 기존 객체 사용 + UniversityInfoForApply firstChoiceUniversity = universityInfoForApplyRepository .getUniversityInfoForApplyByIdAndTerm(universityChoiceRequest.firstChoiceUniversityId(), term); UniversityInfoForApply secondChoiceUniversity = universityInfoForApplyRepository diff --git a/src/main/java/com/example/solidconnection/application/service/VerifyStatusQueryService.java b/src/main/java/com/example/solidconnection/application/service/VerifyStatusQueryService.java index a5f7bf752..33bb340d9 100644 --- a/src/main/java/com/example/solidconnection/application/service/VerifyStatusQueryService.java +++ b/src/main/java/com/example/solidconnection/application/service/VerifyStatusQueryService.java @@ -7,6 +7,7 @@ import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.type.VerifyStatus; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,13 +26,17 @@ public class VerifyStatusQueryService { private final ApplicationRepository applicationRepository; private final SiteUserRepository siteUserRepository; + @Value("${university.term}") + private String term; + /* * 지원 상태를 조회한다. + * 학기별로 상태가 관리된다. * */ @Transactional(readOnly = true) public VerifyStatusResponse getVerifyStatus(String email) { SiteUser siteUser = siteUserRepository.getByEmail(email); - Optional application = applicationRepository.findBySiteUser_Email(siteUser.getEmail()); + Optional application = applicationRepository.findBySiteUserAndTerm(siteUser,term); // 아무것도 제출 안함 if (application.isEmpty()) { diff --git a/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java b/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java index bb704faea..88a7a222f 100644 --- a/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java +++ b/src/main/java/com/example/solidconnection/university/service/UniversityRecommendService.java @@ -26,7 +26,7 @@ public class UniversityRecommendService { private final SiteUserRepository siteUserRepository; @Value("${university.term}") - public String term; + private String term; /* * 사용자 맞춤 추천 대학교를 불러온다. diff --git a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java index d609aa121..cb5fbfe52 100644 --- a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java +++ b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java @@ -17,6 +17,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import java.util.List; @@ -42,6 +43,11 @@ class ApplicantsQueryTest extends UniversityDataSetUpEndToEndTest { private Application 사용자1_지원정보; private Application 사용자2_지원정보; private Application 사용자3_지원정보; + private Application 사용자4_이전학기_지원정보; + + @Value("${university.term}") + private String term; + private String beforeTerm = "1988-1"; @BeforeEach public void setUpUserAndToken() { @@ -58,23 +64,27 @@ public void setUpUserAndToken() { SiteUser 사용자1 = siteUserRepository.save(createSiteUserByEmail("email1")); SiteUser 사용자2 = siteUserRepository.save(createSiteUserByEmail("email2")); SiteUser 사용자3 = siteUserRepository.save(createSiteUserByEmail("email3")); + SiteUser 사용자4_이전학기_지원자 = siteUserRepository.save(createSiteUserByEmail("email4")); // setUp - 지원 정보 저장 Gpa gpa = createDummyGpa(); LanguageTest languageTest = createDummyLanguageTest(); - 나의_지원정보 = new Application(siteUser, gpa, languageTest); - 사용자1_지원정보 = new Application(사용자1, gpa, languageTest); - 사용자2_지원정보 = new Application(사용자2, gpa, languageTest); - 사용자3_지원정보 = new Application(사용자3, gpa, languageTest); + 나의_지원정보 = new Application(siteUser, gpa, languageTest, term); + 사용자1_지원정보 = new Application(사용자1, gpa, languageTest, term); + 사용자2_지원정보 = new Application(사용자2, gpa, languageTest, term); + 사용자3_지원정보 = new Application(사용자3, gpa, languageTest, term); + 사용자4_이전학기_지원정보 = new Application(사용자4_이전학기_지원자, gpa, languageTest, beforeTerm); 나의_지원정보.updateUniversityChoice(괌대학_B_지원_정보, 괌대학_A_지원_정보, 린츠_카톨릭대학_지원_정보, "0"); 사용자1_지원정보.updateUniversityChoice(괌대학_A_지원_정보, 괌대학_B_지원_정보, 그라츠공과대학_지원_정보, "1"); 사용자2_지원정보.updateUniversityChoice(메이지대학_지원_정보, 그라츠대학_지원_정보, 서던덴마크대학교_지원_정보, "2"); 사용자3_지원정보.updateUniversityChoice(네바다주립대학_라스베이거스_지원_정보, 그라츠공과대학_지원_정보, 메이지대학_지원_정보, "3"); + 사용자4_이전학기_지원정보.updateUniversityChoice(네바다주립대학_라스베이거스_지원_정보, 그라츠공과대학_지원_정보, 메이지대학_지원_정보, "4"); 나의_지원정보.setVerifyStatus(VerifyStatus.APPROVED); 사용자1_지원정보.setVerifyStatus(VerifyStatus.APPROVED); 사용자2_지원정보.setVerifyStatus(VerifyStatus.APPROVED); 사용자3_지원정보.setVerifyStatus(VerifyStatus.APPROVED); - applicationRepository.saveAll(List.of(나의_지원정보, 사용자1_지원정보, 사용자2_지원정보, 사용자3_지원정보)); + 사용자4_이전학기_지원정보.setVerifyStatus(VerifyStatus.APPROVED); + applicationRepository.saveAll(List.of(나의_지원정보, 사용자1_지원정보, 사용자2_지원정보, 사용자3_지원정보, 사용자4_이전학기_지원정보)); } @Test @@ -195,4 +205,33 @@ public void setUpUserAndToken() { assertThat(secondChoiceApplicants).containsExactlyInAnyOrder( UniversityApplicantsResponse.of(메이지대학_지원_정보, List.of())); } + + @Test + void 지원자를_조회할_때_이전학기_지원자는_조회되지_않는다() { + ApplicationsResponse response = RestAssured.given().log().all() + .header("Authorization", "Bearer " + accessToken) + .when().log().all() + .get("/application") + .then().log().all() + .statusCode(200) + .extract().as(ApplicationsResponse.class); + + List firstChoiceApplicants = response.firstChoice(); + List secondChoiceApplicants = response.secondChoice(); + List thirdChoiceApplicants = response.thirdChoice(); + + + assertThat(firstChoiceApplicants).doesNotContainAnyElementsOf(List.of( + UniversityApplicantsResponse.of(네바다주립대학_라스베이거스_지원_정보, + List.of(ApplicantResponse.of(사용자4_이전학기_지원정보, false))) + )); + assertThat(secondChoiceApplicants).doesNotContainAnyElementsOf(List.of( + UniversityApplicantsResponse.of(네바다주립대학_라스베이거스_지원_정보, + List.of(ApplicantResponse.of(사용자4_이전학기_지원정보, false))) + )); + assertThat(thirdChoiceApplicants).doesNotContainAnyElementsOf(List.of( + UniversityApplicantsResponse.of(네바다주립대학_라스베이거스_지원_정보, + List.of(ApplicantResponse.of(사용자4_이전학기_지원정보, false))) + )); + } } diff --git a/src/test/java/com/example/solidconnection/e2e/ApplicationSubmissionTest.java b/src/test/java/com/example/solidconnection/e2e/ApplicationSubmissionTest.java index 0cbe37f35..a12612071 100644 --- a/src/test/java/com/example/solidconnection/e2e/ApplicationSubmissionTest.java +++ b/src/test/java/com/example/solidconnection/e2e/ApplicationSubmissionTest.java @@ -66,7 +66,7 @@ public void setUpUserAndToken() { .then().log().all() .statusCode(HttpStatus.OK.value()); - Application application = applicationRepository.getApplicationBySiteUser(siteUser); + Application application = applicationRepository.getApplicationBySiteUserAndTerm(siteUser,term); assertAll("대학교 성적과 어학 성적을 저장한다.", () -> assertThat(application.getId()).isNotNull(), () -> assertThat(application.getSiteUser().getId()).isEqualTo(siteUser.getId()), @@ -84,7 +84,7 @@ public void setUpUserAndToken() { // setUp - 성적 정보 저장 ScoreRequest firstRequest = new ScoreRequest(LanguageTestType.TOEFL_IBT, "80", "languageTestReportUrl", 4.0, 4.5, "gpaReportUrl"); - applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest())); + applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest(),term)); // request - body 생성 및 요청 ScoreRequest secondRequest = new ScoreRequest(LanguageTestType.TOEFL_IBT, "90", @@ -98,7 +98,7 @@ public void setUpUserAndToken() { .then().log().all() .statusCode(HttpStatus.OK.value()); - Application updatedApplication = applicationRepository.getApplicationBySiteUser(siteUser); + Application updatedApplication = applicationRepository.getApplicationBySiteUserAndTerm(siteUser,term); assertAll("대학교 성적과 어학 성적을 수정한다. 이때 수정 횟수는 증가하지 않고, 성적 승인 상태는 PENDING 으로 바뀐다.", () -> assertThat(updatedApplication.getId()).isNotNull(), () -> assertThat(updatedApplication.getSiteUser().getId()).isEqualTo(siteUser.getId()), @@ -116,7 +116,7 @@ public void setUpUserAndToken() { // setUp - 성적 정보 저장 ScoreRequest firstRequest = new ScoreRequest(LanguageTestType.TOEFL_IBT, "80", "languageTestReportUrl", 4.0, 4.5, "gpaReportUrl"); - applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest())); + applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest(),term)); // request - body 생성 및 요청 UniversityChoiceRequest request = new UniversityChoiceRequest(그라츠대학_지원_정보.getId(), 코펜하겐IT대학_지원_정보.getId(), 메이지대학_지원_정보.getId()); @@ -129,7 +129,7 @@ public void setUpUserAndToken() { .then().log().all() .statusCode(HttpStatus.OK.value()); - Application application = applicationRepository.getApplicationBySiteUser(siteUser); + Application application = applicationRepository.getApplicationBySiteUserAndTerm(siteUser,term); assertAll("지망 대학교를 저장한다.", () -> assertThat(application.getId()).isNotNull(), () -> assertThat(application.getSiteUser().getId()).isEqualTo(siteUser.getId()), @@ -146,9 +146,9 @@ public void setUpUserAndToken() { // setUp - 성적 정보와 지망 대학 저장 ScoreRequest firstRequest = new ScoreRequest(LanguageTestType.TOEFL_IBT, "80", "languageTestReportUrl", 4.0, 4.5, "gpaReportUrl"); - applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest())) + applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest(),term)) .updateUniversityChoice(괌대학_A_지원_정보, 괌대학_B_지원_정보, 네바다주립대학_라스베이거스_지원_정보, "nickname"); - Application initialApplication = applicationRepository.getApplicationBySiteUser(siteUser); + Application initialApplication = applicationRepository.getApplicationBySiteUserAndTerm(siteUser,term); // request - body 생성 및 요청 UniversityChoiceRequest request = new UniversityChoiceRequest(그라츠대학_지원_정보.getId(), 코펜하겐IT대학_지원_정보.getId(), 메이지대학_지원_정보.getId()); @@ -161,7 +161,7 @@ public void setUpUserAndToken() { .then().log().all() .statusCode(HttpStatus.OK.value()); - Application updatedApplication = applicationRepository.getApplicationBySiteUser(siteUser); + Application updatedApplication = applicationRepository.getApplicationBySiteUserAndTerm(siteUser,term); assertAll("지망 대학교를 수정한다. 이때 수정 횟수는 증가하고, 성적 승인 상태는 바뀌지 않는다.", () -> assertThat(updatedApplication.getId()).isNotNull(), () -> assertThat(updatedApplication.getSiteUser().getId()).isEqualTo(siteUser.getId()), @@ -178,8 +178,8 @@ public void setUpUserAndToken() { // setUp - 성적 정보와 지망 대학 저장 ScoreRequest firstRequest = new ScoreRequest(LanguageTestType.TOEFL_IBT, "80", "languageTestReportUrl", 4.0, 4.5, "gpaReportUrl"); - applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest())); - Application initialApplication = applicationRepository.getApplicationBySiteUser(siteUser); + applicationRepository.save(new Application(siteUser, firstRequest.toGpa(), firstRequest.toLanguageTest(),term)); + Application initialApplication = applicationRepository.getApplicationBySiteUserAndTerm(siteUser,term); // setUp - 지망 대학을 한계까지 수정 for (int i = 0; i <= APPLICATION_UPDATE_COUNT_LIMIT; i++) { diff --git a/src/test/java/com/example/solidconnection/e2e/VerifyStatusQueryTest.java b/src/test/java/com/example/solidconnection/e2e/VerifyStatusQueryTest.java index b4447247a..856c4cdca 100644 --- a/src/test/java/com/example/solidconnection/e2e/VerifyStatusQueryTest.java +++ b/src/test/java/com/example/solidconnection/e2e/VerifyStatusQueryTest.java @@ -66,7 +66,7 @@ public void setUpUserAndToken() { @Test void 성적만_제출한_상태를_반환한다() { // setUp - 성적만 제출한 상태 - Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest()); + Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest(),term); applicationRepository.save(application); // request - 요청 @@ -86,7 +86,7 @@ public void setUpUserAndToken() { @Test void 성적과_대학을_모두_제출하고_승인을_기대라는_상태를_반환한다() { // setUp - 성적과 대학을 모두 제출한 상태 - Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest()); + Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest(),term); application.updateUniversityChoice(괌대학_B_지원_정보, 괌대학_A_지원_정보, 네바다주립대학_라스베이거스_지원_정보, "닉네임"); applicationRepository.save(application); @@ -107,7 +107,7 @@ public void setUpUserAndToken() { @Test void 성적과_대학을_모두_제출했지만_승인이_반려된_상태를_반환한다() { // setUp - 성적과 대학을 모두 제출했지만, 승인 거절 - Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest()); + Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest(),term); application.updateUniversityChoice(괌대학_B_지원_정보, 괌대학_A_지원_정보, 네바다주립대학_라스베이거스_지원_정보,"닉네임"); application.setVerifyStatus(VerifyStatus.REJECTED); applicationRepository.save(application); @@ -129,7 +129,7 @@ public void setUpUserAndToken() { @Test void 성적과_대학을_모두_제출했으며_승인이_된_상태를_반환한다() { // setUp - 성적과 대학을 모두 제출했으며, 승인이 된 상태 - Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest()); + Application application = new Application(siteUser, createDummyGpa(), createDummyLanguageTest(),term); application.updateUniversityChoice(괌대학_B_지원_정보, 괌대학_A_지원_정보, 네바다주립대학_라스베이거스_지원_정보, "닉네임"); application.setVerifyStatus(VerifyStatus.APPROVED); applicationRepository.save(application); diff --git a/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java b/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java new file mode 100644 index 000000000..d967c90bf --- /dev/null +++ b/src/test/java/com/example/solidconnection/unit/service/ApplicationServiceTest.java @@ -0,0 +1,174 @@ +package com.example.solidconnection.unit.service; + +import com.example.solidconnection.application.domain.Application; +import com.example.solidconnection.application.domain.Gpa; +import com.example.solidconnection.application.domain.LanguageTest; +import com.example.solidconnection.application.dto.ScoreRequest; +import com.example.solidconnection.application.dto.UniversityChoiceRequest; +import com.example.solidconnection.application.repository.ApplicationRepository; +import com.example.solidconnection.application.service.ApplicationSubmissionService; +import com.example.solidconnection.custom.exception.CustomException; +import com.example.solidconnection.siteuser.domain.SiteUser; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; +import com.example.solidconnection.type.*; +import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.SCORE_SHOULD_SUBMITTED_FIRST; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +@ExtendWith(MockitoExtension.class) +@DisplayName("지원 서비스 테스트") +public class ApplicationServiceTest { + @InjectMocks + ApplicationSubmissionService applicationSubmissionService; + @Mock + ApplicationRepository applicationRepository; + @Mock + SiteUserRepository siteUserRepository; + @Mock + UniversityInfoForApplyRepository universityInfoForApplyRepository; + + private SiteUser siteUser; + private Application application; + private Application applicationBeforeTerm; + + private String term = "2024-1"; + private String beforeTerm = "1999-1"; + + @BeforeEach + void setUp() { + ReflectionTestUtils.setField(applicationSubmissionService, "term", term); // 테스트시 @value값 주입위함 + siteUser = createSiteUser(); + application = createApplication(term); + applicationBeforeTerm = createApplication(beforeTerm); + } + + private SiteUser createSiteUser() { + return new SiteUser( + "test@example.com", + "nickname", + "profileImageUrl", + "1999-01-01", + PreparationStatus.CONSIDERING, + Role.MENTEE, + Gender.MALE + ); + } + + private Application createApplication(String term) { + return new Application( + siteUser, + new Gpa(4.0, 4.5, "url"), + new LanguageTest(LanguageTestType.TOEIC, "900", "url"), + term + ); + } + + @Test + void 성적을_제출한다_금학기_제출이력_없음() { + // Given + ScoreRequest scoreRequest = new ScoreRequest( + LanguageTestType.TOEIC, "990", "url", 4.5, 4.5, "url" + ); + when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); + when(applicationRepository.findBySiteUserAndTerm(siteUser, term)).thenReturn(Optional.empty()); + + // When + applicationSubmissionService.submitScore(siteUser.getEmail(), scoreRequest); + + // Then + verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); + verify(applicationRepository, times(1)).findBySiteUserAndTerm(siteUser, term); + verify(applicationRepository, times(1)).save(any(Application.class)); + } + + @Test + void 성적을_제출한다_금학기_제출이력_있음() { + // Given + ScoreRequest scoreRequest = new ScoreRequest( + LanguageTestType.TOEIC, "990", "url", 4.5, 4.5, "url" + ); + when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); + when(applicationRepository.findBySiteUserAndTerm(siteUser, term)).thenReturn(Optional.of(application)); + + // When + applicationSubmissionService.submitScore(siteUser.getEmail(), scoreRequest); + + // Then + assertEquals(application.getGpa().getGpa(), scoreRequest.gpa()); + assertEquals(application.getLanguageTest().getLanguageTestScore(), scoreRequest.languageTestScore()); + verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); + verify(applicationRepository, times(1)).findBySiteUserAndTerm(siteUser, term); + verify(applicationRepository, times(0)).save(any(Application.class)); + } + + // 예외테스트 + @Test + void 지망대학_제출할_때_성적_제출이력이_없다면_예외_응답을_반환한다() { + // given + UniversityChoiceRequest universityChoiceRequest = new UniversityChoiceRequest( + 1L, 2L, 3L + ); + when(applicationRepository.findTop1BySiteUser_EmailOrderByTermDesc(siteUser.getEmail())) + .thenReturn(Optional.empty()); + // when, then + CustomException exception = assertThrows(CustomException.class, () -> { + applicationSubmissionService.submitUniversityChoice(siteUser.getEmail(), universityChoiceRequest); + }); + assertThat(exception.getMessage()) + .isEqualTo(SCORE_SHOULD_SUBMITTED_FIRST.getMessage()); + assertThat(exception.getCode()) + .isEqualTo(SCORE_SHOULD_SUBMITTED_FIRST.getCode()); + } + + @Test + void 지망대학_제출한다_이전학기_성적_제출이력_있음() { + // Given + UniversityChoiceRequest universityChoiceRequest = new UniversityChoiceRequest( + 1L, 2L, 3L + ); + when(applicationRepository.findTop1BySiteUser_EmailOrderByTermDesc(siteUser.getEmail())) + .thenReturn(Optional.of(applicationBeforeTerm)); + when(siteUserRepository.getByEmail(siteUser.getEmail())).thenReturn(siteUser); + + // When + applicationSubmissionService.submitUniversityChoice(siteUser.getEmail(), universityChoiceRequest); + + // Then + verify(applicationRepository, times(1)).findTop1BySiteUser_EmailOrderByTermDesc(siteUser.getEmail()); + verify(siteUserRepository, times(1)).getByEmail(siteUser.getEmail()); + verify(applicationRepository, times(1)).save(any(Application.class)); + } + + @Test + void 지망대학_제출한다_금학기_성적_제출이력_있음() { + // Given + UniversityChoiceRequest universityChoiceRequest = new UniversityChoiceRequest( + 1L, 2L, 3L + ); + 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)); + } +}