From d7e44a71c2ae161044f60f0ed45ff0c505286543 Mon Sep 17 00:00:00 2001 From: manNomi Date: Thu, 30 Jul 2026 13:30:52 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EC=A7=80=EC=9B=90=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ApplicationController.java | 9 +++ .../dto/ApplicationPreviewResponse.java | 8 +++ .../ApplicationUniversityPreviewResponse.java | 25 ++++++++ .../repository/ApplicationRepository.java | 27 +++++++++ .../service/ApplicationQueryService.java | 15 +++++ .../repository/UnivApplyInfoRepository.java | 2 + .../service/ApplicationQueryServiceTest.java | 59 +++++++++++++++++++ 7 files changed, 145 insertions(+) create mode 100644 src/main/java/com/example/solidconnection/application/dto/ApplicationPreviewResponse.java create mode 100644 src/main/java/com/example/solidconnection/application/dto/ApplicationUniversityPreviewResponse.java diff --git a/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java b/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java index c388f8b25..97002f8b9 100644 --- a/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java +++ b/src/main/java/com/example/solidconnection/application/controller/ApplicationController.java @@ -1,5 +1,6 @@ package com.example.solidconnection.application.controller; +import com.example.solidconnection.application.dto.ApplicationPreviewResponse; import com.example.solidconnection.application.dto.ApplicationSubmissionResponse; import com.example.solidconnection.application.dto.ApplicationsResponse; import com.example.solidconnection.application.dto.ApplyRequest; @@ -37,6 +38,14 @@ public ResponseEntity apply( .body(applicationSubmissionResponse); } + @GetMapping("/preview") + public ResponseEntity getApplicationPreview( + @AuthorizedUser long siteUserId + ) { + ApplicationPreviewResponse result = applicationQueryService.getApplicantUniversityPreviews(siteUserId); + return ResponseEntity.ok(result); + } + // @RequireRoleAccess(roles = {Role.ADMIN}) // todo : 추후 어드민 페이지에서 권한 변경 기능 추가 필요 @GetMapping public ResponseEntity getApplicants( diff --git a/src/main/java/com/example/solidconnection/application/dto/ApplicationPreviewResponse.java b/src/main/java/com/example/solidconnection/application/dto/ApplicationPreviewResponse.java new file mode 100644 index 000000000..fc739808b --- /dev/null +++ b/src/main/java/com/example/solidconnection/application/dto/ApplicationPreviewResponse.java @@ -0,0 +1,8 @@ +package com.example.solidconnection.application.dto; + +import java.util.List; + +public record ApplicationPreviewResponse( + long totalUniversityCount, + List universities) { +} diff --git a/src/main/java/com/example/solidconnection/application/dto/ApplicationUniversityPreviewResponse.java b/src/main/java/com/example/solidconnection/application/dto/ApplicationUniversityPreviewResponse.java new file mode 100644 index 000000000..54fa56a32 --- /dev/null +++ b/src/main/java/com/example/solidconnection/application/dto/ApplicationUniversityPreviewResponse.java @@ -0,0 +1,25 @@ +package com.example.solidconnection.application.dto; + +import com.example.solidconnection.university.domain.UnivApplyInfo; + +public record ApplicationUniversityPreviewResponse( + long id, + String koreanName, + Integer studentCapacity, + String region, + String country, + String logoImageUrl, + String backgroundImageUrl) { + + public static ApplicationUniversityPreviewResponse from(UnivApplyInfo univApplyInfo) { + return new ApplicationUniversityPreviewResponse( + univApplyInfo.getId(), + univApplyInfo.getKoreanName(), + univApplyInfo.getStudentCapacity(), + univApplyInfo.getUniversity().getRegion().getKoreanName(), + univApplyInfo.getUniversity().getCountry().getKoreanName(), + univApplyInfo.getUniversity().getLogoImageUrl(), + univApplyInfo.getUniversity().getBackgroundImageUrl() + ); + } +} 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 306158fc2..af96f9247 100644 --- a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java @@ -3,6 +3,7 @@ import static com.example.solidconnection.common.exception.ErrorCode.APPLICATION_NOT_FOUND; import com.example.solidconnection.application.domain.Application; +import com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse; import com.example.solidconnection.common.VerifyStatus; import com.example.solidconnection.common.exception.CustomException; import java.util.List; @@ -29,6 +30,32 @@ List findAllByUnivApplyInfoIds( @Param("status") VerifyStatus status, @Param("termId") long termId); + @Query(""" + SELECT DISTINCT new com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse( + uai.id, + uai.koreanName, + uai.studentCapacity, + region.koreanName, + country.koreanName, + university.logoImageUrl, + university.backgroundImageUrl + ) + FROM Application application + JOIN application.choices choice + JOIN UnivApplyInfo uai ON uai.id = choice.univApplyInfoId + JOIN uai.university university + JOIN university.region region + JOIN university.country country + WHERE application.verifyStatus = :status + AND application.termId = :termId + AND application.isDelete = false + AND uai.termId = :termId + ORDER BY uai.koreanName + """) + List findApplicantUniversityPreviews( + @Param("status") VerifyStatus status, + @Param("termId") long termId); + Optional findTopBySiteUserIdAndTermIdAndIsDeleteFalseOrderByIdDesc(long siteUserId, long termId); default Application getApplicationBySiteUserIdAndTermId(long siteUserId, long termId) { 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 d69d59395..44f648e85 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java @@ -7,6 +7,7 @@ import com.example.solidconnection.application.domain.Application; import com.example.solidconnection.application.domain.ApplicationChoice; import com.example.solidconnection.application.dto.ApplicantsResponse; +import com.example.solidconnection.application.dto.ApplicationPreviewResponse; import com.example.solidconnection.application.dto.ApplicationsResponse; import com.example.solidconnection.application.repository.ApplicationRepository; import com.example.solidconnection.common.VerifyStatus; @@ -41,6 +42,20 @@ public class ApplicationQueryService { private final TermRepository termRepository; private final HomeUniversityRepository homeUniversityRepository; + @Transactional(readOnly = true) + public ApplicationPreviewResponse getApplicantUniversityPreviews(long siteUserId) { + siteUserRepository.findById(siteUserId) + .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + + Term term = termRepository.findByIsCurrentTrue() + .orElseThrow(() -> new CustomException(CURRENT_TERM_NOT_FOUND)); + + return new ApplicationPreviewResponse( + univApplyInfoRepository.countByTermId(term.getId()), + applicationRepository.findApplicantUniversityPreviews(VerifyStatus.APPROVED, term.getId()) + ); + } + @Transactional(readOnly = true) public ApplicationsResponse getApplicants(long siteUserId, String regionCode, String keyword) { SiteUser siteUser = siteUserRepository.findById(siteUserId) diff --git a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java index 4c2b6578e..6182ec5fb 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java @@ -71,6 +71,8 @@ default UnivApplyInfo getUnivApplyInfoById(Long id) { boolean existsByHomeUniversityId(Long homeUniversityId); + long countByTermId(long termId); + @Query(""" SELECT uai.id FROM UnivApplyInfo uai diff --git a/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java b/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java index a897284cb..a81eb409a 100644 --- a/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java @@ -5,6 +5,8 @@ import com.example.solidconnection.application.domain.Application; import com.example.solidconnection.application.dto.ApplicantResponse; import com.example.solidconnection.application.dto.ApplicantsResponse; +import com.example.solidconnection.application.dto.ApplicationPreviewResponse; +import com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse; import com.example.solidconnection.application.dto.ApplicationsResponse; import com.example.solidconnection.application.fixture.ApplicationFixture; import com.example.solidconnection.application.repository.ApplicationRepository; @@ -98,6 +100,63 @@ void setUp() { 서던덴마크대학교_지원_정보 = univApplyInfoFixture.서던덴마크대학교_지원_정보(term.getId()); } + @Nested + class 지원_현황_미리보기_조회_테스트 { + + @Test + void 현재_학기에_승인되고_삭제되지_않은_지원서의_대학만_중복_없이_조회한다() { + // given + applicationFixture.지원서( + user1, "nickname1", term.getId(), + gpaScore1.getGpa(), languageTestScore1.getLanguageTest(), + List.of(괌대학_A_지원_정보.getId(), 버지니아공과대학_지원_정보.getId()) + ); + applicationFixture.지원서( + user2, "nickname2", term.getId(), + gpaScore2.getGpa(), languageTestScore2.getLanguageTest(), + List.of(괌대학_A_지원_정보.getId()) + ); + Application deletedApplication = applicationFixture.지원서( + user3, "nickname3", term.getId(), + gpaScore3.getGpa(), languageTestScore3.getLanguageTest(), + List.of(서던덴마크대학교_지원_정보.getId()) + ); + deletedApplication.setIsDeleteTrue(); + applicationRepository.save(deletedApplication); + + // when + ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews(user1.getId()); + + // then + assertThat(response.totalUniversityCount()).isEqualTo(3); + assertThat(response.universities()).containsExactly( + ApplicationUniversityPreviewResponse.from(괌대학_A_지원_정보), + ApplicationUniversityPreviewResponse.from(버지니아공과대학_지원_정보) + ); + } + + @Test + void 성적과_지원서를_제출하지_않은_로그인_사용자도_미리보기를_조회할_수_있다() { + // given + SiteUser signedInUserWithoutScores = siteUserFixture.사용자(4, "signed-in-only"); + applicationFixture.지원서( + user2, "nickname2", term.getId(), + gpaScore2.getGpa(), languageTestScore2.getLanguageTest(), + List.of(괌대학_A_지원_정보.getId()) + ); + + // when + ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews( + signedInUserWithoutScores.getId()); + + // then + assertThat(response.totalUniversityCount()).isEqualTo(3); + assertThat(response.universities()).containsExactly( + ApplicationUniversityPreviewResponse.from(괌대학_A_지원_정보) + ); + } + } + @Nested class 지원자_목록_조회_테스트 { From 0e19d08b141f62071a4ff054b0973a7e45ab661d Mon Sep 17 00:00:00 2001 From: manNomi Date: Thu, 30 Jul 2026 13:55:19 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=EC=A7=80=EC=9B=90=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=EB=A5=BC=20?= =?UTF-8?q?=EB=AA=A8=EA=B5=90=EB=B3=84=EB=A1=9C=20=EC=A0=9C=ED=95=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ApplicationRepository.java | 4 +- .../service/ApplicationQueryService.java | 13 +++++-- .../repository/UnivApplyInfoRepository.java | 2 +- .../service/ApplicationQueryServiceTest.java | 39 +++++++++++++++++-- 4 files changed, 50 insertions(+), 8 deletions(-) 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 af96f9247..ee58c856c 100644 --- a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java @@ -50,11 +50,13 @@ List findAllByUnivApplyInfoIds( AND application.termId = :termId AND application.isDelete = false AND uai.termId = :termId + AND uai.homeUniversity.id = :homeUniversityId ORDER BY uai.koreanName """) List findApplicantUniversityPreviews( @Param("status") VerifyStatus status, - @Param("termId") long termId); + @Param("termId") long termId, + @Param("homeUniversityId") long homeUniversityId); Optional findTopBySiteUserIdAndTermIdAndIsDeleteFalseOrderByIdDesc(long siteUserId, long termId); 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 44f648e85..36ddaf96e 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java @@ -44,15 +44,22 @@ public class ApplicationQueryService { @Transactional(readOnly = true) public ApplicationPreviewResponse getApplicantUniversityPreviews(long siteUserId) { - siteUserRepository.findById(siteUserId) + SiteUser siteUser = siteUserRepository.findById(siteUserId) .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + if (siteUser.getHomeUniversityId() == null) { + return new ApplicationPreviewResponse(0, List.of()); + } + Term term = termRepository.findByIsCurrentTrue() .orElseThrow(() -> new CustomException(CURRENT_TERM_NOT_FOUND)); return new ApplicationPreviewResponse( - univApplyInfoRepository.countByTermId(term.getId()), - applicationRepository.findApplicantUniversityPreviews(VerifyStatus.APPROVED, term.getId()) + univApplyInfoRepository.countByTermIdAndHomeUniversityId(term.getId(), siteUser.getHomeUniversityId()), + applicationRepository.findApplicantUniversityPreviews( + VerifyStatus.APPROVED, + term.getId(), + siteUser.getHomeUniversityId()) ); } diff --git a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java index 6182ec5fb..bd9911536 100644 --- a/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java +++ b/src/main/java/com/example/solidconnection/university/repository/UnivApplyInfoRepository.java @@ -71,7 +71,7 @@ default UnivApplyInfo getUnivApplyInfoById(Long id) { boolean existsByHomeUniversityId(Long homeUniversityId); - long countByTermId(long termId); + long countByTermIdAndHomeUniversityId(long termId, long homeUniversityId); @Query(""" SELECT uai.id diff --git a/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java b/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java index a81eb409a..1bd1e2a3d 100644 --- a/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java @@ -22,7 +22,9 @@ import com.example.solidconnection.term.domain.Term; import com.example.solidconnection.term.fixture.TermFixture; import com.example.solidconnection.university.domain.UnivApplyInfo; +import com.example.solidconnection.university.fixture.HomeUniversityFixture; import com.example.solidconnection.university.fixture.UnivApplyInfoFixture; +import com.example.solidconnection.university.fixture.UnivApplyInfoFixtureBuilder; import java.util.List; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -49,6 +51,12 @@ class ApplicationQueryServiceTest { @Autowired private UnivApplyInfoFixture univApplyInfoFixture; + @Autowired + private UnivApplyInfoFixtureBuilder univApplyInfoFixtureBuilder; + + @Autowired + private HomeUniversityFixture homeUniversityFixture; + @Autowired private GpaScoreFixture gpaScoreFixture; @@ -104,8 +112,10 @@ void setUp() { class 지원_현황_미리보기_조회_테스트 { @Test - void 현재_학기에_승인되고_삭제되지_않은_지원서의_대학만_중복_없이_조회한다() { + void 자신의_모교에_속한_지원_대학만_중복_없이_조회한다() { // given + SiteUser inhaUniversityUser = siteUserFixture.국내_대학_정보_소지_사용자( + 괌대학_A_지원_정보.getHomeUniversity().getId()); applicationFixture.지원서( user1, "nickname1", term.getId(), gpaScore1.getGpa(), languageTestScore1.getLanguageTest(), @@ -116,6 +126,17 @@ class 지원_현황_미리보기_조회_테스트 { gpaScore2.getGpa(), languageTestScore2.getLanguageTest(), List.of(괌대학_A_지원_정보.getId()) ); + UnivApplyInfo 인천대학교_전용_지원_정보 = univApplyInfoFixtureBuilder.univApplyInfo() + .termId(term.getId()) + .koreanName("인천대학교 전용 교환 대학") + .university(서던덴마크대학교_지원_정보.getUniversity()) + .homeUniversity(homeUniversityFixture.인천대학교()) + .create(); + applicationFixture.지원서( + user3, "nickname3", term.getId(), + gpaScore3.getGpa(), languageTestScore3.getLanguageTest(), + List.of(인천대학교_전용_지원_정보.getId()) + ); Application deletedApplication = applicationFixture.지원서( user3, "nickname3", term.getId(), gpaScore3.getGpa(), languageTestScore3.getLanguageTest(), @@ -125,7 +146,8 @@ class 지원_현황_미리보기_조회_테스트 { applicationRepository.save(deletedApplication); // when - ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews(user1.getId()); + ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews( + inhaUniversityUser.getId()); // then assertThat(response.totalUniversityCount()).isEqualTo(3); @@ -138,7 +160,8 @@ class 지원_현황_미리보기_조회_테스트 { @Test void 성적과_지원서를_제출하지_않은_로그인_사용자도_미리보기를_조회할_수_있다() { // given - SiteUser signedInUserWithoutScores = siteUserFixture.사용자(4, "signed-in-only"); + SiteUser signedInUserWithoutScores = siteUserFixture.국내_대학_정보_소지_사용자( + 괌대학_A_지원_정보.getHomeUniversity().getId()); applicationFixture.지원서( user2, "nickname2", term.getId(), gpaScore2.getGpa(), languageTestScore2.getLanguageTest(), @@ -155,6 +178,16 @@ class 지원_현황_미리보기_조회_테스트 { ApplicationUniversityPreviewResponse.from(괌대학_A_지원_정보) ); } + + @Test + void 모교가_등록되지_않은_사용자에게는_빈_미리보기를_반환한다() { + // when + ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews(user1.getId()); + + // then + assertThat(response.totalUniversityCount()).isZero(); + assertThat(response.universities()).isEmpty(); + } } @Nested From 99fe568581b74403f2a16e3fe1cdf3f857a9f267 Mon Sep 17 00:00:00 2001 From: manNomi Date: Thu, 30 Jul 2026 15:01:56 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EC=A7=80=EC=9B=90=20=ED=98=84?= =?UTF-8?q?=ED=99=A9=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/ApplicationRepository.java | 20 +++++---- .../service/ApplicationQueryService.java | 3 +- .../service/ApplicationQueryServiceTest.java | 41 ++++++++++++++++--- 3 files changed, 49 insertions(+), 15 deletions(-) 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 ee58c856c..f155b7e75 100644 --- a/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java +++ b/src/main/java/com/example/solidconnection/application/repository/ApplicationRepository.java @@ -31,7 +31,7 @@ List findAllByUnivApplyInfoIds( @Param("termId") long termId); @Query(""" - SELECT DISTINCT new com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse( + SELECT new com.example.solidconnection.application.dto.ApplicationUniversityPreviewResponse( uai.id, uai.koreanName, uai.studentCapacity, @@ -40,17 +40,21 @@ List findAllByUnivApplyInfoIds( university.logoImageUrl, university.backgroundImageUrl ) - FROM Application application - JOIN application.choices choice - JOIN UnivApplyInfo uai ON uai.id = choice.univApplyInfoId + FROM UnivApplyInfo uai JOIN uai.university university JOIN university.region region JOIN university.country country - WHERE application.verifyStatus = :status - AND application.termId = :termId - AND application.isDelete = false - AND uai.termId = :termId + WHERE uai.termId = :termId AND uai.homeUniversity.id = :homeUniversityId + AND EXISTS ( + SELECT application.id + FROM Application application + JOIN application.choices choice + WHERE choice.univApplyInfoId = uai.id + AND application.verifyStatus = :status + AND application.termId = :termId + AND application.isDelete = false + ) ORDER BY uai.koreanName """) List findApplicantUniversityPreviews( 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 36ddaf96e..a1d1a9661 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java @@ -2,6 +2,7 @@ import static com.example.solidconnection.common.exception.ErrorCode.APPLICATION_NOT_APPROVED; import static com.example.solidconnection.common.exception.ErrorCode.CURRENT_TERM_NOT_FOUND; +import static com.example.solidconnection.common.exception.ErrorCode.SCHOOL_EMAIL_NOT_VERIFIED; import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; import com.example.solidconnection.application.domain.Application; @@ -48,7 +49,7 @@ public ApplicationPreviewResponse getApplicantUniversityPreviews(long siteUserId .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); if (siteUser.getHomeUniversityId() == null) { - return new ApplicationPreviewResponse(0, List.of()); + throw new CustomException(SCHOOL_EMAIL_NOT_VERIFIED); } Term term = termRepository.findByIsCurrentTrue() diff --git a/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java b/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java index 1bd1e2a3d..bee562261 100644 --- a/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/application/service/ApplicationQueryServiceTest.java @@ -1,6 +1,8 @@ package com.example.solidconnection.application.service; +import static com.example.solidconnection.common.exception.ErrorCode.SCHOOL_EMAIL_NOT_VERIFIED; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import com.example.solidconnection.application.domain.Application; import com.example.solidconnection.application.dto.ApplicantResponse; @@ -11,6 +13,7 @@ import com.example.solidconnection.application.fixture.ApplicationFixture; import com.example.solidconnection.application.repository.ApplicationRepository; import com.example.solidconnection.common.VerifyStatus; +import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.location.region.fixture.RegionFixture; import com.example.solidconnection.score.domain.GpaScore; import com.example.solidconnection.score.domain.LanguageTestScore; @@ -109,6 +112,7 @@ void setUp() { } @Nested + @DisplayName("지원 현황 미리보기 조회") class 지원_현황_미리보기_조회_테스트 { @Test @@ -144,13 +148,39 @@ class 지원_현황_미리보기_조회_테스트 { ); deletedApplication.setIsDeleteTrue(); applicationRepository.save(deletedApplication); + UnivApplyInfo 승인_대기_지원_정보 = univApplyInfoFixtureBuilder.univApplyInfo() + .termId(term.getId()) + .koreanName("승인 대기 교환 대학") + .university(서던덴마크대학교_지원_정보.getUniversity()) + .homeUniversity(괌대학_A_지원_정보.getHomeUniversity()) + .create(); + Application pendingApplication = applicationFixture.지원서( + user1, "pending-nickname", term.getId(), + gpaScore1.getGpa(), languageTestScore1.getLanguageTest(), + List.of(승인_대기_지원_정보.getId()) + ); + pendingApplication.setVerifyStatus(VerifyStatus.PENDING); + applicationRepository.save(pendingApplication); + UnivApplyInfo 승인_거절_지원_정보 = univApplyInfoFixtureBuilder.univApplyInfo() + .termId(term.getId()) + .koreanName("승인 거절 교환 대학") + .university(서던덴마크대학교_지원_정보.getUniversity()) + .homeUniversity(괌대학_A_지원_정보.getHomeUniversity()) + .create(); + Application rejectedApplication = applicationFixture.지원서( + user2, "rejected-nickname", term.getId(), + gpaScore2.getGpa(), languageTestScore2.getLanguageTest(), + List.of(승인_거절_지원_정보.getId()) + ); + rejectedApplication.setVerifyStatus(VerifyStatus.REJECTED); + applicationRepository.save(rejectedApplication); // when ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews( inhaUniversityUser.getId()); // then - assertThat(response.totalUniversityCount()).isEqualTo(3); + assertThat(response.totalUniversityCount()).isEqualTo(5); assertThat(response.universities()).containsExactly( ApplicationUniversityPreviewResponse.from(괌대학_A_지원_정보), ApplicationUniversityPreviewResponse.from(버지니아공과대학_지원_정보) @@ -180,13 +210,12 @@ class 지원_현황_미리보기_조회_테스트 { } @Test - void 모교가_등록되지_않은_사용자에게는_빈_미리보기를_반환한다() { + void 모교가_등록되지_않은_사용자는_미리보기를_조회할_수_없다() { // when - ApplicationPreviewResponse response = applicationQueryService.getApplicantUniversityPreviews(user1.getId()); - // then - assertThat(response.totalUniversityCount()).isZero(); - assertThat(response.universities()).isEmpty(); + assertThatThrownBy(() -> applicationQueryService.getApplicantUniversityPreviews(user1.getId())) + .isInstanceOf(CustomException.class) + .hasMessage(SCHOOL_EMAIL_NOT_VERIFIED.getMessage()); } }