diff --git a/build.gradle b/build.gradle index b4267f41e..6f6a01f61 100644 --- a/build.gradle +++ b/build.gradle @@ -58,6 +58,8 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.testcontainers:mysql' + testImplementation 'org.projectlombok:lombok' + testAnnotationProcessor 'org.projectlombok:lombok' // Etc implementation 'org.hibernate.validator:hibernate-validator' diff --git a/src/test/java/com/example/solidconnection/country/fixture/CountryFixture.java b/src/test/java/com/example/solidconnection/country/fixture/CountryFixture.java new file mode 100644 index 000000000..53f394eae --- /dev/null +++ b/src/test/java/com/example/solidconnection/country/fixture/CountryFixture.java @@ -0,0 +1,54 @@ +package com.example.solidconnection.country.fixture; + +import com.example.solidconnection.entity.Country; +import com.example.solidconnection.region.fixture.RegionFixture; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class CountryFixture { + + private final RegionFixture regionFixture; + private final CountryFixtureBuilder countryFixtureBuilder; + + public Country 미국() { + return countryFixtureBuilder.country() + .code("US") + .koreanName("미국") + .region(regionFixture.영미권()) + .findOrCreate(); + } + + public Country 캐나다() { + return countryFixtureBuilder.country() + .code("CA") + .koreanName("캐나다") + .region(regionFixture.영미권()) + .findOrCreate(); + } + + public Country 덴마크() { + return countryFixtureBuilder.country() + .code("DK") + .koreanName("덴마크") + .region(regionFixture.유럽()) + .findOrCreate(); + } + + public Country 오스트리아() { + return countryFixtureBuilder.country() + .code("AT") + .koreanName("오스트리아") + .region(regionFixture.유럽()) + .findOrCreate(); + } + + public Country 일본() { + return countryFixtureBuilder.country() + .code("JP") + .koreanName("일본") + .region(regionFixture.아시아()) + .findOrCreate(); + } +} diff --git a/src/test/java/com/example/solidconnection/country/fixture/CountryFixtureBuilder.java b/src/test/java/com/example/solidconnection/country/fixture/CountryFixtureBuilder.java new file mode 100644 index 000000000..e3ea004c5 --- /dev/null +++ b/src/test/java/com/example/solidconnection/country/fixture/CountryFixtureBuilder.java @@ -0,0 +1,42 @@ +package com.example.solidconnection.country.fixture; + +import com.example.solidconnection.entity.Country; +import com.example.solidconnection.entity.Region; +import com.example.solidconnection.country.repository.CountryRepositoryForTest; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class CountryFixtureBuilder { + + private final CountryRepositoryForTest countryRepositoryForTest; + + private String code; + private String koreanName; + private Region region; + + public CountryFixtureBuilder country() { + return new CountryFixtureBuilder(countryRepositoryForTest); + } + + public CountryFixtureBuilder code(String code) { + this.code = code; + return this; + } + + public CountryFixtureBuilder koreanName(String koreanName) { + this.koreanName = koreanName; + return this; + } + + public CountryFixtureBuilder region(Region region) { + this.region = region; + return this; + } + + public Country findOrCreate() { + return countryRepositoryForTest.findByCode(code) + .orElseGet(() -> countryRepositoryForTest.save(new Country(code, koreanName, region))); + } +} diff --git a/src/test/java/com/example/solidconnection/country/repository/CountryRepositoryForTest.java b/src/test/java/com/example/solidconnection/country/repository/CountryRepositoryForTest.java new file mode 100644 index 000000000..fc5dab0f9 --- /dev/null +++ b/src/test/java/com/example/solidconnection/country/repository/CountryRepositoryForTest.java @@ -0,0 +1,11 @@ +package com.example.solidconnection.country.repository; + +import com.example.solidconnection.entity.Country; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface CountryRepositoryForTest extends JpaRepository { + + Optional findByCode(String code); +} diff --git a/src/test/java/com/example/solidconnection/region/fixture/RegionFixture.java b/src/test/java/com/example/solidconnection/region/fixture/RegionFixture.java new file mode 100644 index 000000000..a1cd97e56 --- /dev/null +++ b/src/test/java/com/example/solidconnection/region/fixture/RegionFixture.java @@ -0,0 +1,33 @@ +package com.example.solidconnection.region.fixture; + +import com.example.solidconnection.entity.Region; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class RegionFixture { + + private final RegionFixtureBuilder regionFixtureBuilder; + + public Region 영미권() { + return regionFixtureBuilder.region() + .code("AMERICAS") + .koreanName("영미권") + .findOrCreate(); + } + + public Region 유럽() { + return regionFixtureBuilder.region() + .code("EUROPE") + .koreanName("유럽") + .findOrCreate(); + } + + public Region 아시아() { + return regionFixtureBuilder.region() + .code("ASIA") + .koreanName("아시아") + .findOrCreate(); + } +} diff --git a/src/test/java/com/example/solidconnection/region/fixture/RegionFixtureBuilder.java b/src/test/java/com/example/solidconnection/region/fixture/RegionFixtureBuilder.java new file mode 100644 index 000000000..a385a53f8 --- /dev/null +++ b/src/test/java/com/example/solidconnection/region/fixture/RegionFixtureBuilder.java @@ -0,0 +1,35 @@ +package com.example.solidconnection.region.fixture; + +import com.example.solidconnection.entity.Region; +import com.example.solidconnection.region.repository.RegionRepositoryForTest; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class RegionFixtureBuilder { + + private final RegionRepositoryForTest regionRepositoryForTest; + + private String code; + private String koreanName; + + public RegionFixtureBuilder region() { + return new RegionFixtureBuilder(regionRepositoryForTest); + } + + public RegionFixtureBuilder code(String code) { + this.code = code; + return this; + } + + public RegionFixtureBuilder koreanName(String koreanName) { + this.koreanName = koreanName; + return this; + } + + public Region findOrCreate() { + return regionRepositoryForTest.findByCode(code) + .orElseGet(() -> regionRepositoryForTest.save(new Region(code, koreanName))); + } +} diff --git a/src/test/java/com/example/solidconnection/region/repository/RegionRepositoryForTest.java b/src/test/java/com/example/solidconnection/region/repository/RegionRepositoryForTest.java new file mode 100644 index 000000000..00c35c02d --- /dev/null +++ b/src/test/java/com/example/solidconnection/region/repository/RegionRepositoryForTest.java @@ -0,0 +1,11 @@ +package com.example.solidconnection.region.repository; + +import com.example.solidconnection.entity.Region; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface RegionRepositoryForTest extends JpaRepository { + + Optional findByCode(String code); +} diff --git a/src/test/java/com/example/solidconnection/support/TestContainerSpringBootTest.java b/src/test/java/com/example/solidconnection/support/TestContainerSpringBootTest.java index 5c5c93742..462400400 100644 --- a/src/test/java/com/example/solidconnection/support/TestContainerSpringBootTest.java +++ b/src/test/java/com/example/solidconnection/support/TestContainerSpringBootTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; import org.springframework.test.context.ContextConfiguration; import org.testcontainers.junit.jupiter.Testcontainers; @@ -11,6 +12,7 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +@ComponentScan(basePackages = "com.example.solidconnection") @ExtendWith({DatabaseClearExtension.class}) @ContextConfiguration(initializers = {RedisTestContainer.class, MySQLTestContainer.class}) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) diff --git a/src/test/java/com/example/solidconnection/university/fixture/LanguageRequirementFixture.java b/src/test/java/com/example/solidconnection/university/fixture/LanguageRequirementFixture.java new file mode 100644 index 000000000..ba32c1b27 --- /dev/null +++ b/src/test/java/com/example/solidconnection/university/fixture/LanguageRequirementFixture.java @@ -0,0 +1,54 @@ +package com.example.solidconnection.university.fixture; + +import com.example.solidconnection.type.LanguageTestType; +import com.example.solidconnection.university.domain.LanguageRequirement; +import com.example.solidconnection.university.domain.UniversityInfoForApply; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class LanguageRequirementFixture { + + private final LanguageRequirementFixtureBuilder languageRequirementFixtureBuilder; + + public LanguageRequirement 토플_80(UniversityInfoForApply universityInfo) { + return languageRequirementFixtureBuilder + .languageTestType(LanguageTestType.TOEFL_IBT) + .minScore("80") + .universityInfoForApply(universityInfo) + .create(); + } + + public LanguageRequirement 토플_70(UniversityInfoForApply universityInfo) { + return languageRequirementFixtureBuilder + .languageTestType(LanguageTestType.TOEFL_IBT) + .minScore("70") + .universityInfoForApply(universityInfo) + .create(); + } + + public LanguageRequirement 토익_800(UniversityInfoForApply universityInfo) { + return languageRequirementFixtureBuilder + .languageTestType(LanguageTestType.TOEIC) + .minScore("800") + .universityInfoForApply(universityInfo) + .create(); + } + + public LanguageRequirement 토익_900(UniversityInfoForApply universityInfo) { + return languageRequirementFixtureBuilder + .languageTestType(LanguageTestType.TOEIC) + .minScore("900") + .universityInfoForApply(universityInfo) + .create(); + } + + public LanguageRequirement JLPT_N2(UniversityInfoForApply universityInfo) { + return languageRequirementFixtureBuilder + .languageTestType(LanguageTestType.JLPT) + .minScore("N2") + .universityInfoForApply(universityInfo) + .create(); + } +} diff --git a/src/test/java/com/example/solidconnection/university/fixture/LanguageRequirementFixtureBuilder.java b/src/test/java/com/example/solidconnection/university/fixture/LanguageRequirementFixtureBuilder.java new file mode 100644 index 000000000..e6f3fd4d5 --- /dev/null +++ b/src/test/java/com/example/solidconnection/university/fixture/LanguageRequirementFixtureBuilder.java @@ -0,0 +1,45 @@ +package com.example.solidconnection.university.fixture; + +import com.example.solidconnection.type.LanguageTestType; +import com.example.solidconnection.university.domain.LanguageRequirement; +import com.example.solidconnection.university.domain.UniversityInfoForApply; +import com.example.solidconnection.university.repository.LanguageRequirementRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class LanguageRequirementFixtureBuilder { + + private final LanguageRequirementRepository languageRequirementRepository; + + private LanguageTestType languageTestType; + private String minScore; + private UniversityInfoForApply universityInfoForApply; + + public LanguageRequirementFixtureBuilder languageTestType(LanguageTestType languageTestType) { + this.languageTestType = languageTestType; + return this; + } + + public LanguageRequirementFixtureBuilder minScore(String minScore) { + this.minScore = minScore; + return this; + } + + public LanguageRequirementFixtureBuilder universityInfoForApply(UniversityInfoForApply universityInfoForApply) { + this.universityInfoForApply = universityInfoForApply; + return this; + } + + public LanguageRequirement create() { + LanguageRequirement languageRequirement = new LanguageRequirement( + null, + languageTestType, + minScore, + universityInfoForApply + ); + universityInfoForApply.addLanguageRequirements(languageRequirement); + return languageRequirementRepository.save(languageRequirement); + } +} diff --git a/src/test/java/com/example/solidconnection/university/fixture/UniversityFixture.java b/src/test/java/com/example/solidconnection/university/fixture/UniversityFixture.java new file mode 100644 index 000000000..f3a41515f --- /dev/null +++ b/src/test/java/com/example/solidconnection/university/fixture/UniversityFixture.java @@ -0,0 +1,97 @@ +package com.example.solidconnection.university.fixture; + +import com.example.solidconnection.country.fixture.CountryFixture; +import com.example.solidconnection.region.fixture.RegionFixture; +import com.example.solidconnection.university.domain.University; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public final class UniversityFixture { + + private final RegionFixture regionFixture; + private final CountryFixture countryFixture; + private final UniversityFixtureBuilder universityFixtureBuilder; + + public University 괌_대학() { + return universityFixtureBuilder.university() + .koreanName("괌 대학") + .englishName("University of Guam") + .country(countryFixture.미국()) + .region(regionFixture.영미권()) + .create(); + } + + public University 네바다주립_대학_라스베이거스() { + return universityFixtureBuilder.university() + .koreanName("네바다주립 대학 라스베이거스") + .englishName("University of Nevada, Las Vegas") + .country(countryFixture.미국()) + .region(regionFixture.영미권()) + .create(); + } + + public University 메모리얼_대학_세인트존스() { + return universityFixtureBuilder.university() + .koreanName("메모리얼 대학 세인트존스") + .englishName("Memorial University of Newfoundland St. John's") + .country(countryFixture.캐나다()) + .region(regionFixture.영미권()) + .create(); + } + + public University 서던덴마크_대학() { + return universityFixtureBuilder.university() + .koreanName("서던덴마크 대학") + .englishName("University of Southern Denmark") + .country(countryFixture.덴마크()) + .region(regionFixture.유럽()) + .create(); + } + + public University 코펜하겐IT_대학() { + return universityFixtureBuilder.university() + .koreanName("코펜하겐IT 대학") + .englishName("IT University of Copenhagen") + .country(countryFixture.덴마크()) + .region(regionFixture.유럽()) + .create(); + } + + public University 그라츠_대학() { + return universityFixtureBuilder.university() + .koreanName("그라츠 대학") + .englishName("University of Graz") + .country(countryFixture.오스트리아()) + .region(regionFixture.유럽()) + .create(); + } + + public University 그라츠공과_대학() { + return universityFixtureBuilder.university() + .koreanName("그라츠공과 대학") + .englishName("Graz University of Technology") + .country(countryFixture.오스트리아()) + .region(regionFixture.유럽()) + .create(); + } + + public University 린츠_카톨릭_대학() { + return universityFixtureBuilder.university() + .koreanName("린츠 카톨릭 대학") + .englishName("Catholic Private University Linz") + .country(countryFixture.오스트리아()) + .region(regionFixture.유럽()) + .create(); + } + + public University 메이지_대학() { + return universityFixtureBuilder.university() + .koreanName("메이지 대학") + .englishName("Meiji University") + .country(countryFixture.일본()) + .region(regionFixture.아시아()) + .create(); + } +} diff --git a/src/test/java/com/example/solidconnection/university/fixture/UniversityFixtureBuilder.java b/src/test/java/com/example/solidconnection/university/fixture/UniversityFixtureBuilder.java new file mode 100644 index 000000000..f51ea9677 --- /dev/null +++ b/src/test/java/com/example/solidconnection/university/fixture/UniversityFixtureBuilder.java @@ -0,0 +1,58 @@ +package com.example.solidconnection.university.fixture; + +import com.example.solidconnection.entity.Country; +import com.example.solidconnection.entity.Region; +import com.example.solidconnection.university.domain.University; +import com.example.solidconnection.university.repository.UniversityRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class UniversityFixtureBuilder { + + private final UniversityRepository universityRepository; + + private String koreanName; + private String englishName; + private Country country; + private Region region; + + public UniversityFixtureBuilder university() { + return new UniversityFixtureBuilder(universityRepository); + } + + public UniversityFixtureBuilder koreanName(String koreanName) { + this.koreanName = koreanName; + return this; + } + + public UniversityFixtureBuilder englishName(String englishName) { + this.englishName = englishName; + return this; + } + + public UniversityFixtureBuilder country(Country country) { + this.country = country; + return this; + } + + public UniversityFixtureBuilder region(Region region) { + this.region = region; + return this; + } + + public University create() { + University university = new University( + null, koreanName, englishName, + "formatName", + "https://homepage-url", + "https://english-course-url", + "https://accommodation-url", + "https://logo-image-url", + "https://background-image-url", + null, country, region + ); + return universityRepository.save(university); + } +} diff --git a/src/test/java/com/example/solidconnection/university/fixture/UniversityInfoForApplyFixture.java b/src/test/java/com/example/solidconnection/university/fixture/UniversityInfoForApplyFixture.java new file mode 100644 index 000000000..32a32cf6d --- /dev/null +++ b/src/test/java/com/example/solidconnection/university/fixture/UniversityInfoForApplyFixture.java @@ -0,0 +1,97 @@ +package com.example.solidconnection.university.fixture; + +import com.example.solidconnection.university.domain.UniversityInfoForApply; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.TestComponent; + +@TestComponent +@RequiredArgsConstructor +public class UniversityInfoForApplyFixture { + + private final UniversityInfoForApplyFixtureBuilder universityInfoForApplyFixtureBuilder; + private final UniversityFixture universityFixture; + + @Value("${university.term}") + public String term; + + public UniversityInfoForApply 괌대학_A_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("괌대학(A형)") + .university(universityFixture.괌_대학()) + .create(); + } + + public UniversityInfoForApply 괌대학_B_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("괌대학(B형)") + .university(universityFixture.괌_대학()) + .create(); + } + + public UniversityInfoForApply 네바다주립대학_라스베이거스_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("네바다주립대학 라스베이거스(B형)") + .university(universityFixture.네바다주립_대학_라스베이거스()) + .create(); + } + + public UniversityInfoForApply 메모리얼대학_세인트존스_A_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("메모리얼 대학 세인트존스(A형)") + .university(universityFixture.메모리얼_대학_세인트존스()) + .create(); + } + + public UniversityInfoForApply 서던덴마크대학교_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("서던덴마크대학교") + .university(universityFixture.서던덴마크_대학()) + .create(); + } + + public UniversityInfoForApply 코펜하겐IT대학_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("코펜하겐 IT대학") + .university(universityFixture.코펜하겐IT_대학()) + .create(); + } + + public UniversityInfoForApply 그라츠대학_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("그라츠 대학") + .university(universityFixture.그라츠_대학()) + .create(); + } + + public UniversityInfoForApply 그라츠공과대학_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("그라츠공과대학") + .university(universityFixture.그라츠공과_대학()) + .create(); + } + + public UniversityInfoForApply 린츠_카톨릭대학_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("린츠 카톨릭 대학교") + .university(universityFixture.린츠_카톨릭_대학()) + .create(); + } + + public UniversityInfoForApply 메이지대학_지원_정보() { + return universityInfoForApplyFixtureBuilder.universityInfoForApply() + .term(term) + .koreanName("메이지대학") + .university(universityFixture.메이지_대학()) + .create(); + } +} diff --git a/src/test/java/com/example/solidconnection/university/fixture/UniversityInfoForApplyFixtureBuilder.java b/src/test/java/com/example/solidconnection/university/fixture/UniversityInfoForApplyFixtureBuilder.java new file mode 100644 index 000000000..8041bda1e --- /dev/null +++ b/src/test/java/com/example/solidconnection/university/fixture/UniversityInfoForApplyFixtureBuilder.java @@ -0,0 +1,53 @@ +package com.example.solidconnection.university.fixture; + +import com.example.solidconnection.university.domain.University; +import com.example.solidconnection.university.domain.UniversityInfoForApply; +import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.test.context.TestComponent; + +import java.util.HashSet; + +import static com.example.solidconnection.type.SemesterAvailableForDispatch.ONE_SEMESTER; +import static com.example.solidconnection.type.TuitionFeeType.HOME_UNIVERSITY_PAYMENT; + +@TestComponent +@RequiredArgsConstructor +public class UniversityInfoForApplyFixtureBuilder { + + private final UniversityInfoForApplyRepository universityInfoForApplyRepository; + + private String term; + private String koreanName; + private University university; + + public UniversityInfoForApplyFixtureBuilder universityInfoForApply() { + return new UniversityInfoForApplyFixtureBuilder(universityInfoForApplyRepository); + } + + public UniversityInfoForApplyFixtureBuilder term(String term) { + this.term = term; + return this; + } + + public UniversityInfoForApplyFixtureBuilder koreanName(String koreanName) { + this.koreanName = koreanName; + return this; + } + + public UniversityInfoForApplyFixtureBuilder university(University university) { + this.university = university; + return this; + } + + public UniversityInfoForApply create() { + UniversityInfoForApply universityInfoForApply = new UniversityInfoForApply( + null, term, koreanName, 1, HOME_UNIVERSITY_PAYMENT, ONE_SEMESTER, + "1", "detailsForLanguage", "gpaRequirement", + "gpaRequirementCriteria", "detailsForApply", "detailsForMajor", + "detailsForAccommodation", "detailsForEnglishCourse", "details", + new HashSet<>(), university + ); + return universityInfoForApplyRepository.save(universityInfoForApply); + } +} diff --git a/src/test/java/com/example/solidconnection/university/service/UniversityQueryServiceTest.java b/src/test/java/com/example/solidconnection/university/service/UniversityQueryServiceTest.java index 1cd0d755f..731ccec5b 100644 --- a/src/test/java/com/example/solidconnection/university/service/UniversityQueryServiceTest.java +++ b/src/test/java/com/example/solidconnection/university/service/UniversityQueryServiceTest.java @@ -1,15 +1,16 @@ package com.example.solidconnection.university.service; import com.example.solidconnection.custom.exception.CustomException; -import com.example.solidconnection.support.integration.BaseIntegrationTest; +import com.example.solidconnection.support.TestContainerSpringBootTest; +import com.example.solidconnection.university.fixture.LanguageRequirementFixture; +import com.example.solidconnection.university.fixture.UniversityInfoForApplyFixture; import com.example.solidconnection.type.LanguageTestType; +import com.example.solidconnection.university.domain.UniversityInfoForApply; import com.example.solidconnection.university.dto.UniversityDetailResponse; -import com.example.solidconnection.university.dto.LanguageRequirementResponse; import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponse; import com.example.solidconnection.university.dto.UniversityInfoForApplyPreviewResponses; import com.example.solidconnection.university.repository.UniversityInfoForApplyRepository; import com.example.solidconnection.university.repository.custom.UniversityFilterRepository; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -17,14 +18,15 @@ import java.util.List; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; import static com.example.solidconnection.custom.exception.ErrorCode.UNIVERSITY_INFO_FOR_APPLY_NOT_FOUND; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; import static org.mockito.BDDMockito.then; import static org.mockito.Mockito.times; +@TestContainerSpringBootTest @DisplayName("대학교 조회 서비스 테스트") -class UniversityQueryServiceTest extends BaseIntegrationTest { +class UniversityQueryServiceTest { @Autowired private UniversityQueryService universityQueryService; @@ -35,60 +37,36 @@ class UniversityQueryServiceTest extends BaseIntegrationTest { @SpyBean private UniversityInfoForApplyRepository universityInfoForApplyRepository; + @Autowired + private UniversityInfoForApplyFixture universityInfoForApplyFixture; + + @Autowired + private LanguageRequirementFixture languageRequirementFixture; + @Test - void 대학_상세정보를_정상_조회한다() { + void 대학_상세정보를_정상_조회한다() { // given - Long universityId = 괌대학_A_지원_정보.getId(); + UniversityInfoForApply 괌대학_A_지원_정보 = universityInfoForApplyFixture.괌대학_A_지원_정보(); // when - UniversityDetailResponse response = universityQueryService.getUniversityDetail(universityId); + UniversityDetailResponse response = universityQueryService.getUniversityDetail(괌대학_A_지원_정보.getId()); // then - Assertions.assertAll( - () -> assertThat(response.id()).isEqualTo(괌대학_A_지원_정보.getId()), - () -> assertThat(response.term()).isEqualTo(괌대학_A_지원_정보.getTerm()), - () -> assertThat(response.koreanName()).isEqualTo(괌대학_A_지원_정보.getKoreanName()), - () -> assertThat(response.englishName()).isEqualTo(영미권_미국_괌대학.getEnglishName()), - () -> assertThat(response.formatName()).isEqualTo(영미권_미국_괌대학.getFormatName()), - () -> assertThat(response.region()).isEqualTo(영미권.getKoreanName()), - () -> assertThat(response.country()).isEqualTo(미국.getKoreanName()), - () -> assertThat(response.homepageUrl()).isEqualTo(영미권_미국_괌대학.getHomepageUrl()), - () -> assertThat(response.logoImageUrl()).isEqualTo(영미권_미국_괌대학.getLogoImageUrl()), - () -> assertThat(response.backgroundImageUrl()).isEqualTo(영미권_미국_괌대학.getBackgroundImageUrl()), - () -> assertThat(response.detailsForLocal()).isEqualTo(영미권_미국_괌대학.getDetailsForLocal()), - () -> assertThat(response.studentCapacity()).isEqualTo(괌대학_A_지원_정보.getStudentCapacity()), - () -> assertThat(response.tuitionFeeType()).isEqualTo(괌대학_A_지원_정보.getTuitionFeeType().getKoreanName()), - () -> assertThat(response.semesterAvailableForDispatch()).isEqualTo(괌대학_A_지원_정보.getSemesterAvailableForDispatch().getKoreanName()), - () -> assertThat(response.languageRequirements()).containsOnlyOnceElementsOf( - 괌대학_A_지원_정보.getLanguageRequirements().stream() - .map(LanguageRequirementResponse::from) - .toList()), - () -> assertThat(response.detailsForLanguage()).isEqualTo(괌대학_A_지원_정보.getDetailsForLanguage()), - () -> assertThat(response.gpaRequirement()).isEqualTo(괌대학_A_지원_정보.getGpaRequirement()), - () -> assertThat(response.gpaRequirementCriteria()).isEqualTo(괌대학_A_지원_정보.getGpaRequirementCriteria()), - () -> assertThat(response.semesterRequirement()).isEqualTo(괌대학_A_지원_정보.getSemesterRequirement()), - () -> assertThat(response.detailsForApply()).isEqualTo(괌대학_A_지원_정보.getDetailsForApply()), - () -> assertThat(response.detailsForMajor()).isEqualTo(괌대학_A_지원_정보.getDetailsForMajor()), - () -> assertThat(response.detailsForAccommodation()).isEqualTo(괌대학_A_지원_정보.getDetailsForAccommodation()), - () -> assertThat(response.detailsForEnglishCourse()).isEqualTo(괌대학_A_지원_정보.getDetailsForEnglishCourse()), - () -> assertThat(response.details()).isEqualTo(괌대학_A_지원_정보.getDetails()), - () -> assertThat(response.accommodationUrl()).isEqualTo(괌대학_A_지원_정보.getUniversity().getAccommodationUrl()), - () -> assertThat(response.englishCourseUrl()).isEqualTo(괌대학_A_지원_정보.getUniversity().getEnglishCourseUrl()) - ); + assertThat(response.id()).isEqualTo(괌대학_A_지원_정보.getId()); } @Test void 대학_상세정보_조회시_캐시가_적용된다() { // given - Long universityId = 괌대학_A_지원_정보.getId(); + UniversityInfoForApply 괌대학_A_지원_정보 = universityInfoForApplyFixture.괌대학_A_지원_정보(); // when - UniversityDetailResponse firstResponse = universityQueryService.getUniversityDetail(universityId); - UniversityDetailResponse secondResponse = universityQueryService.getUniversityDetail(universityId); + UniversityDetailResponse firstResponse = universityQueryService.getUniversityDetail(괌대학_A_지원_정보.getId()); + UniversityDetailResponse secondResponse = universityQueryService.getUniversityDetail(괌대학_A_지원_정보.getId()); // then assertThat(firstResponse).isEqualTo(secondResponse); - then(universityInfoForApplyRepository).should(times(1)).getUniversityInfoForApplyById(universityId); + then(universityInfoForApplyRepository).should(times(1)).getUniversityInfoForApplyById(괌대학_A_지원_정보.getId()); } @Test @@ -106,6 +84,14 @@ class UniversityQueryServiceTest extends BaseIntegrationTest { @Test void 전체_대학을_조회한다() { + // given + UniversityInfoForApply 괌대학_A_지원_정보 = universityInfoForApplyFixture.괌대학_A_지원_정보(); + UniversityInfoForApply 괌대학_B_지원_정보 = universityInfoForApplyFixture.괌대학_B_지원_정보(); + UniversityInfoForApply 네바다주립대학_라스베이거스_지원_정보 = universityInfoForApplyFixture.네바다주립대학_라스베이거스_지원_정보(); + UniversityInfoForApply 서던덴마크대학교_지원_정보 = universityInfoForApplyFixture.서던덴마크대학교_지원_정보(); + UniversityInfoForApply 그라츠대학_지원_정보 = universityInfoForApplyFixture.그라츠대학_지원_정보(); + UniversityInfoForApply 메이지대학_지원_정보 = universityInfoForApplyFixture.메이지대학_지원_정보(); + // when UniversityInfoForApplyPreviewResponses response = universityQueryService.searchUniversity( null, List.of(), null, null); @@ -116,12 +102,8 @@ class UniversityQueryServiceTest extends BaseIntegrationTest { UniversityInfoForApplyPreviewResponse.from(괌대학_A_지원_정보), UniversityInfoForApplyPreviewResponse.from(괌대학_B_지원_정보), UniversityInfoForApplyPreviewResponse.from(네바다주립대학_라스베이거스_지원_정보), - UniversityInfoForApplyPreviewResponse.from(메모리얼대학_세인트존스_A_지원_정보), UniversityInfoForApplyPreviewResponse.from(서던덴마크대학교_지원_정보), - UniversityInfoForApplyPreviewResponse.from(코펜하겐IT대학_지원_정보), UniversityInfoForApplyPreviewResponse.from(그라츠대학_지원_정보), - UniversityInfoForApplyPreviewResponse.from(그라츠공과대학_지원_정보), - UniversityInfoForApplyPreviewResponse.from(린츠_카톨릭대학_지원_정보), UniversityInfoForApplyPreviewResponse.from(메이지대학_지원_정보) ); } @@ -129,7 +111,8 @@ class UniversityQueryServiceTest extends BaseIntegrationTest { @Test void 대학_조회시_캐시가_적용된다() { // given - String regionCode = 영미권.getCode(); + universityInfoForApplyFixture.괌대학_A_지원_정보(); + String regionCode = "AMERICAS"; List keywords = List.of("괌"); LanguageTestType testType = LanguageTestType.TOEFL_IBT; String testScore = "70"; @@ -150,22 +133,28 @@ class UniversityQueryServiceTest extends BaseIntegrationTest { @Test void 지역으로_대학을_필터링한다() { + // given + UniversityInfoForApply 괌대학_A_지원_정보 = universityInfoForApplyFixture.괌대학_A_지원_정보(); + universityInfoForApplyFixture.코펜하겐IT대학_지원_정보(); + universityInfoForApplyFixture.그라츠공과대학_지원_정보(); + universityInfoForApplyFixture.메이지대학_지원_정보(); + // when UniversityInfoForApplyPreviewResponses response = universityQueryService.searchUniversity( - 영미권.getCode(), List.of(), null, null); + "AMERICAS", List.of(), null, null); // then assertThat(response.universityInfoForApplyPreviewResponses()) - .containsExactlyInAnyOrder( - UniversityInfoForApplyPreviewResponse.from(괌대학_A_지원_정보), - UniversityInfoForApplyPreviewResponse.from(괌대학_B_지원_정보), - UniversityInfoForApplyPreviewResponse.from(네바다주립대학_라스베이거스_지원_정보), - UniversityInfoForApplyPreviewResponse.from(메모리얼대학_세인트존스_A_지원_정보) - ); + .containsExactlyInAnyOrder(UniversityInfoForApplyPreviewResponse.from(괌대학_A_지원_정보)); } @Test void 키워드로_대학을_필터링한다() { + // given + universityInfoForApplyFixture.괌대학_A_지원_정보(); + UniversityInfoForApply 그라츠대학_지원_정보 = universityInfoForApplyFixture.그라츠대학_지원_정보(); + UniversityInfoForApply 메이지대학_지원_정보 = universityInfoForApplyFixture.메이지대학_지원_정보(); + // when UniversityInfoForApplyPreviewResponses response = universityQueryService.searchUniversity( null, List.of("라", "일본"), null, null); @@ -173,34 +162,45 @@ class UniversityQueryServiceTest extends BaseIntegrationTest { // then assertThat(response.universityInfoForApplyPreviewResponses()) .containsExactlyInAnyOrder( - UniversityInfoForApplyPreviewResponse.from(네바다주립대학_라스베이거스_지원_정보), UniversityInfoForApplyPreviewResponse.from(그라츠대학_지원_정보), - UniversityInfoForApplyPreviewResponse.from(그라츠공과대학_지원_정보), UniversityInfoForApplyPreviewResponse.from(메이지대학_지원_정보) ); } @Test void 어학시험_조건으로_대학을_필터링한다() { + // given + UniversityInfoForApply 괌대학_A_지원_정보 = universityInfoForApplyFixture.괌대학_A_지원_정보(); + languageRequirementFixture.토플_80(괌대학_A_지원_정보); + languageRequirementFixture.토익_800(괌대학_A_지원_정보); + UniversityInfoForApply 괌대학_B_지원_정보 = universityInfoForApplyFixture.괌대학_B_지원_정보(); + languageRequirementFixture.토플_70(괌대학_B_지원_정보); + languageRequirementFixture.토익_900(괌대학_B_지원_정보); + // when UniversityInfoForApplyPreviewResponses response = universityQueryService.searchUniversity( null, List.of(), LanguageTestType.TOEFL_IBT, "70"); // then assertThat(response.universityInfoForApplyPreviewResponses()) - .containsExactlyInAnyOrder( - UniversityInfoForApplyPreviewResponse.from(괌대학_B_지원_정보), - UniversityInfoForApplyPreviewResponse.from(서던덴마크대학교_지원_정보) - ); + .containsExactlyInAnyOrder(UniversityInfoForApplyPreviewResponse.from(괌대학_B_지원_정보)); } @Test void 모든_조건으로_대학을_필터링한다() { + // given + UniversityInfoForApply 괌대학_A_지원_정보 = universityInfoForApplyFixture.괌대학_A_지원_정보(); + languageRequirementFixture.토플_80(괌대학_A_지원_정보); + languageRequirementFixture.토익_800(괌대학_A_지원_정보); + UniversityInfoForApply 서던덴마크대학교_지원_정보 = universityInfoForApplyFixture.서던덴마크대학교_지원_정보(); + languageRequirementFixture.토플_70(서던덴마크대학교_지원_정보); + // when UniversityInfoForApplyPreviewResponses response = universityQueryService.searchUniversity( "EUROPE", List.of(), LanguageTestType.TOEFL_IBT, "70"); // then - assertThat(response.universityInfoForApplyPreviewResponses()).containsExactly(UniversityInfoForApplyPreviewResponse.from(서던덴마크대학교_지원_정보)); + assertThat(response.universityInfoForApplyPreviewResponses()) + .containsExactly(UniversityInfoForApplyPreviewResponse.from(서던덴마크대학교_지원_정보)); } }