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 fff928f05..66ae84918 100644 --- a/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java +++ b/src/main/java/com/example/solidconnection/application/service/ApplicationQueryService.java @@ -19,9 +19,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.function.Function; +import java.util.stream.Collectors; import static com.example.solidconnection.custom.exception.ErrorCode.APPLICATION_NOT_APPROVED; @@ -64,12 +67,19 @@ public ApplicationsResponse getApplicantsByUserApplications(String email) { SiteUser siteUser = siteUserRepository.getByEmail(email); Application userLatestApplication = applicationRepository.getApplicationBySiteUserAndTerm(siteUser, term); - List userAppliedUniversities = List.of( - userLatestApplication.getFirstChoiceUniversity().getUniversity(), - userLatestApplication.getSecondChoiceUniversity().getUniversity(), - userLatestApplication.getThirdChoiceUniversity().getUniversity() - ); - + List userAppliedUniversities = Arrays.asList( + Optional.ofNullable(userLatestApplication.getFirstChoiceUniversity()) + .map(UniversityInfoForApply::getUniversity) + .orElse(null), + Optional.ofNullable(userLatestApplication.getSecondChoiceUniversity()) + .map(UniversityInfoForApply::getUniversity) + .orElse(null), + Optional.ofNullable(userLatestApplication.getThirdChoiceUniversity()) + .map(UniversityInfoForApply::getUniversity) + .orElse(null) + ).stream() + .filter(Objects::nonNull) + .collect(Collectors.toList()); List firstChoiceApplicants = getFirstChoiceApplicants(userAppliedUniversities, siteUser, term); List secondChoiceApplicants = getSecondChoiceApplicants(userAppliedUniversities, siteUser, term); diff --git a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java index 7dd8b63f9..2f69d6cf7 100644 --- a/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java +++ b/src/test/java/com/example/solidconnection/e2e/ApplicantsQueryTest.java @@ -39,11 +39,15 @@ class ApplicantsQueryTest extends UniversityDataSetUpEndToEndTest { TokenService tokenService; private String accessToken; + private String adminAccessToken; + private String user6AccessToken; private Application 나의_지원정보; private Application 사용자1_지원정보; private Application 사용자2_지원정보; private Application 사용자3_지원정보; private Application 사용자4_이전학기_지원정보; + private Application 사용자5_관리자_지원정보; + private Application 사용자6_지원정보; @Value("${university.term}") private String term; @@ -60,11 +64,21 @@ public void setUpUserAndToken() { String refreshToken = tokenService.generateToken(email, TokenType.REFRESH); tokenService.saveToken(refreshToken, TokenType.REFRESH); + adminAccessToken = tokenService.generateToken("email5", TokenType.ACCESS); + String adminRefreshToken = tokenService.generateToken("email5", TokenType.REFRESH); + tokenService.saveToken(adminRefreshToken, TokenType.REFRESH); + + user6AccessToken = tokenService.generateToken("email6", TokenType.ACCESS); + String user6RefreshToken = tokenService.generateToken("email6", TokenType.REFRESH); + tokenService.saveToken(user6RefreshToken, TokenType.REFRESH); + // setUp - 사용자 정보 저장 SiteUser 사용자1 = siteUserRepository.save(createSiteUserByEmail("email1")); SiteUser 사용자2 = siteUserRepository.save(createSiteUserByEmail("email2")); SiteUser 사용자3 = siteUserRepository.save(createSiteUserByEmail("email3")); SiteUser 사용자4_이전학기_지원자 = siteUserRepository.save(createSiteUserByEmail("email4")); + SiteUser 사용자5_관리자 = siteUserRepository.save(createSiteUserByEmail("email5")); + SiteUser 사용자6 = siteUserRepository.save(createSiteUserByEmail("email6")); // setUp - 지원 정보 저장 Gpa gpa = createDummyGpa(); @@ -74,17 +88,22 @@ public void setUpUserAndToken() { 사용자2_지원정보 = new Application(사용자2, gpa, languageTest, term); 사용자3_지원정보 = new Application(사용자3, gpa, languageTest, term); 사용자4_이전학기_지원정보 = new Application(사용자4_이전학기_지원자, gpa, languageTest, beforeTerm); + 사용자5_관리자_지원정보 = new Application(사용자5_관리자, gpa, languageTest, term); + 사용자6_지원정보 = new Application(사용자6, gpa, languageTest, term); 나의_지원정보.updateUniversityChoice(괌대학_B_지원_정보, 괌대학_A_지원_정보, 린츠_카톨릭대학_지원_정보, "0"); 사용자1_지원정보.updateUniversityChoice(괌대학_A_지원_정보, 괌대학_B_지원_정보, 그라츠공과대학_지원_정보, "1"); 사용자2_지원정보.updateUniversityChoice(메이지대학_지원_정보, 그라츠대학_지원_정보, 서던덴마크대학교_지원_정보, "2"); 사용자3_지원정보.updateUniversityChoice(네바다주립대학_라스베이거스_지원_정보, 그라츠공과대학_지원_정보, 메이지대학_지원_정보, "3"); 사용자4_이전학기_지원정보.updateUniversityChoice(네바다주립대학_라스베이거스_지원_정보, 그라츠공과대학_지원_정보, 메이지대학_지원_정보, "4"); + 사용자6_지원정보.updateUniversityChoice(코펜하겐IT대학_지원_정보, null, null, "6"); 나의_지원정보.setVerifyStatus(VerifyStatus.APPROVED); 사용자1_지원정보.setVerifyStatus(VerifyStatus.APPROVED); 사용자2_지원정보.setVerifyStatus(VerifyStatus.APPROVED); 사용자3_지원정보.setVerifyStatus(VerifyStatus.APPROVED); 사용자4_이전학기_지원정보.setVerifyStatus(VerifyStatus.APPROVED); - applicationRepository.saveAll(List.of(나의_지원정보, 사용자1_지원정보, 사용자2_지원정보, 사용자3_지원정보, 사용자4_이전학기_지원정보)); + 사용자5_관리자_지원정보.setVerifyStatus(VerifyStatus.APPROVED); + 사용자6_지원정보.setVerifyStatus(VerifyStatus.APPROVED); + applicationRepository.saveAll(List.of(나의_지원정보, 사용자1_지원정보, 사용자2_지원정보, 사용자3_지원정보, 사용자4_이전학기_지원정보, 사용자5_관리자_지원정보, 사용자6_지원정보)); } @Test @@ -236,7 +255,7 @@ public void setUpUserAndToken() { } @Test - void 내가_지원한_대학의_지원자를_조회한다() { + void 경쟁자를_조회한다() { ApplicationsResponse response = RestAssured.given().log().all() .header("Authorization", "Bearer " + accessToken) .when().log().all() @@ -245,6 +264,8 @@ public void setUpUserAndToken() { .statusCode(200) .extract().as(ApplicationsResponse.class); + Integer choicedUniversityCount = 3; + List firstChoiceApplicants = response.firstChoice(); List secondChoiceApplicants = response.secondChoice(); List thirdChoiceApplicants = response.thirdChoice(); @@ -269,9 +290,52 @@ public void setUpUserAndToken() { List.of()), UniversityApplicantsResponse.of(린츠_카톨릭대학_지원_정보, List.of(ApplicantResponse.of(나의_지원정보, true)))); - - assertThat(firstChoiceApplicants.size()).isEqualTo(3); - assertThat(secondChoiceApplicants.size()).isEqualTo(3); - assertThat(thirdChoiceApplicants.size()).isEqualTo(3); + + assertThat(firstChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + assertThat(secondChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + assertThat(thirdChoiceApplicants.size()).isEqualTo(choicedUniversityCount); } + + @Test + void 지원_대학중_미선택이_있을_떄_경쟁자를_조회한다() { + ApplicationsResponse response = RestAssured.given().log().all() + .header("Authorization", "Bearer " + user6AccessToken) + .when().log().all() + .get("/application/competitors") + .then().log().all() + .statusCode(200) + .extract().as(ApplicationsResponse.class); + + Integer choicedUniversityCount = 1; + + List firstChoiceApplicants = response.firstChoice(); + List secondChoiceApplicants = response.secondChoice(); + List thirdChoiceApplicants = response.thirdChoice(); + + assertThat(firstChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + assertThat(secondChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + assertThat(thirdChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + } + + @Test + void 지원_대학이_모두_미선택일_때_경쟁자를_조회한다() { + ApplicationsResponse response = RestAssured.given().log().all() + .header("Authorization", "Bearer " + adminAccessToken) + .when().log().all() + .get("/application/competitors") + .then().log().all() + .statusCode(200) + .extract().as(ApplicationsResponse.class); + + Integer choicedUniversityCount = 0; + + List firstChoiceApplicants = response.firstChoice(); + List secondChoiceApplicants = response.secondChoice(); + List thirdChoiceApplicants = response.thirdChoice(); + + assertThat(firstChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + assertThat(secondChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + assertThat(thirdChoiceApplicants.size()).isEqualTo(choicedUniversityCount); + } + }