Skip to content

Commit

Permalink
모집 테스트코드 추가 (#416)
Browse files Browse the repository at this point in the history
  • Loading branch information
sinkyoungdeok authored Feb 25, 2024
1 parent b5c46ec commit 6e41901
Show file tree
Hide file tree
Showing 10 changed files with 516 additions and 60 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@ import com.fone.competition.presentation.dto.RegisterCompetitionDto.RegisterComp
import com.fone.competition.presentation.dto.RetrieveCompetitionDto.RetrieveCompetitionResponse
import com.fone.competition.presentation.dto.RetrieveCompetitionDto.RetrieveCompetitionsResponse
import com.fone.competition.presentation.dto.RetrieveCompetitionScrapDto.RetrieveCompetitionScrapResponse
import com.fone.jobOpening.presentation.dto.LocationDto.RetrieveDistrictsResponse
import com.fone.jobOpening.presentation.dto.LocationDto.RetrieveRegionsResponse
import com.fone.jobOpening.presentation.dto.RegisterJobOpeningDto.RegisterJobOpeningResponse
import com.fone.jobOpening.presentation.dto.RetrieveJobOpeningDto.RetrieveJobOpeningResponse
import com.fone.jobOpening.presentation.dto.RetrieveJobOpeningDto.RetrieveJobOpeningsResponse
import com.fone.jobOpening.presentation.dto.RetrieveJobOpeningMyRegistrationDto.RetrieveJobOpeningMyRegistrationResponse
import com.fone.jobOpening.presentation.dto.RetrieveJobOpeningScrapDto.RetrieveJobOpeningScrapResponse
import com.fone.jobOpening.presentation.dto.RetrieveMySimilarJobOpeningDto.RetrieveMySimilarJobOpeningResponse
import com.fone.jobOpening.presentation.dto.ScrapJobOpeningDto.ScrapJobOpeningResponse
import com.fone.jobOpening.presentation.dto.common.LocationDto.RetrieveDistrictsResponse
import com.fone.jobOpening.presentation.dto.common.LocationDto.RetrieveRegionsResponse
import com.fone.profile.presentation.dto.RegisterProfileDto.RegisterProfileResponse
import com.fone.profile.presentation.dto.RetrieveProfileMyRegistrationDto.RetrieveProfileMyRegistrationResponse
import com.fone.profile.presentation.dto.RetrieveProfileWantDto.RetrieveProfileWantResponse
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.fone.jobOpening.domain.service

import com.fone.jobOpening.domain.repository.LocationRepository
import com.fone.jobOpening.presentation.dto.LocationDto.RetrieveDistrictsResponse
import com.fone.jobOpening.presentation.dto.LocationDto.RetrieveRegionsResponse
import com.fone.jobOpening.presentation.dto.common.LocationDto.RetrieveDistrictsResponse
import com.fone.jobOpening.presentation.dto.common.LocationDto.RetrieveRegionsResponse
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class ValidateJobOpeningService(
throw RequestValidationException("최소 1개 이상 작품의 성격을 선택해주세요.")
}

validateDate(request.recruitmentStartDate, request.recruitmentEndDate)
validateDate(request.recruitmentStartDate, request.recruitmentEndDate, "모집기간")
}

suspend fun validateRolePage(request: ValidateJobOpeningDto.ThirdPage) {
Expand Down Expand Up @@ -97,7 +97,7 @@ class ValidateJobOpeningService(
locationRepository.findLocation(request.workingCity, request.workingDistrict)
?: throw RequestValidationException("'시', '구'가 유효하지 않습니다.")

validateDate(request.workingStartDate, request.workingEndDate)
validateDate(request.workingStartDate, request.workingEndDate, "근무시간")

if (request.workingStartTime != null && request.workingEndTime != null) {
return
Expand All @@ -106,14 +106,6 @@ class ValidateJobOpeningService(
if (request.workingStartTime == null && request.workingEndTime == null) {
return
}

if (request.workingStartTime == null) {
throw RequestValidationException("근무시간의 시작과 마감 값을 올바르게 입력해 주세요.")
}

if (request.workingEndTime == null) {
throw RequestValidationException("근무시간의 시작과 마감 값을 올바르게 입력해 주세요.")
}
}

suspend fun validateSummaryPage(request: ValidateJobOpeningDto.SixthPage) {
Expand All @@ -134,25 +126,26 @@ class ValidateJobOpeningService(
private fun validateDate(
recruitmentStartDate: LocalDate?,
recruitmentEndDate: LocalDate?,
displayName: String,
) {
if (recruitmentStartDate == null && recruitmentEndDate == null) {
// 상시모집이여서 아래 검증 로직 필요 없음
return
}

if (recruitmentStartDate == null) {
throw RequestValidationException("모집기간의 시작과 끝 값을 모두 입력해 주세요.")
throw RequestValidationException(displayName + " 시작과 끝 값을 모두 입력해 주세요.")
}

if (recruitmentEndDate == null) {
throw RequestValidationException("모집기간의 시작과 끝 값을 모두 입력해 주세요.")
throw RequestValidationException(displayName + " 시작과 끝 값을 모두 입력해 주세요.")
}

if (recruitmentStartDate.isAfter(recruitmentEndDate)) {
throw RequestValidationException("마감일을 시작일보다 앞날로 입력해 주세요.")
}

if (!recruitmentStartDate.isAfter(LocalDate.now())) {
if (recruitmentStartDate.isBefore(LocalDate.now())) {
throw RequestValidationException("시작일은 과거의 날짜로 설정될 수 없어요.")
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ import com.linecorp.kotlinjdsl.spring.data.reactive.query.SpringDataHibernateMut
import com.linecorp.kotlinjdsl.spring.reactive.listQuery
import com.linecorp.kotlinjdsl.spring.reactive.pageQuery
import com.linecorp.kotlinjdsl.spring.reactive.querydsl.SpringDataReactiveCriteriaQueryDsl
import com.linecorp.kotlinjdsl.spring.reactive.querydsl.SpringDataReactivePageableQueryDsl
import com.linecorp.kotlinjdsl.spring.reactive.singleQueryOrNull
import io.smallrye.mutiny.coroutines.awaitSuspending
import org.hibernate.reactive.mutiny.Mutiny
Expand Down Expand Up @@ -262,11 +261,6 @@ class JobOpeningRepositoryImpl(
return col(JobOpening::type).equal(type)
}

private fun SpringDataReactivePageableQueryDsl<JobOpening>.typeEq(type: Type?): EqualValueSpec<Type>? {
type ?: return null
return col(JobOpening::type).equal(type)
}

private fun SpringDataReactiveCriteriaQueryDsl<JobOpening?>.orderSpec(sort: Sort): List<OrderSpec> {
val recruitmentEndDateIsNull =
case(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.fone.jobOpening.presentation.controller

import com.fone.common.response.CommonResponse
import com.fone.jobOpening.application.LocationFacade
import com.fone.jobOpening.presentation.dto.LocationDto.RetrieveDistrictsResponse
import com.fone.jobOpening.presentation.dto.LocationDto.RetrieveRegionsResponse
import com.fone.jobOpening.presentation.dto.common.LocationDto.RetrieveDistrictsResponse
import com.fone.jobOpening.presentation.dto.common.LocationDto.RetrieveRegionsResponse
import io.swagger.annotations.Api
import io.swagger.annotations.ApiOperation
import io.swagger.v3.oas.annotations.media.Content
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package com.fone.jobOpening.presentation.dto
package com.fone.jobOpening.presentation.dto.common

import io.swagger.v3.oas.annotations.media.Schema

class LocationDto {
data class RetrieveRegionsResponse(
@Schema(description = "지역", example = "서울특별시")
@Schema(description = "지역", example = "[\"서울특별시\"]")
val regions: List<String>,
)

data class RetrieveDistrictsResponse(
@Schema(description = "시군구", example = "강남구")
@Schema(description = "시군구", example = "[\"강남구\"]")
val districts: List<String>,
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.fone.jobOpening.infrastructure

import com.fasterxml.jackson.databind.ObjectMapper
import com.fone.common.CommonJobOpeningCallApi
import com.fone.common.CommonUserCallApi
import com.fone.common.CustomDescribeSpec
import com.fone.common.IntegrationTest
import com.fone.common.entity.Type
import com.fone.jobOpening.domain.repository.JobOpeningRepository
import com.fone.jobOpening.presentation.dto.RetrieveJobOpeningDto
import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import org.springframework.test.web.reactive.server.WebTestClient

@IntegrationTest
class JobOpeningRepositoryImplTest(
client: WebTestClient,
private val objectMapper: ObjectMapper,
private val jobOpeningRepository: JobOpeningRepository,
) :
CustomDescribeSpec() {

init {
describe("#findByFilters") {
context("빈 구인구직 리스트를 조회하면") {
it("성공한다") {
val jobOpenings = jobOpeningRepository.findByFilters(
org.springframework.data.domain.Pageable.unpaged(),
RetrieveJobOpeningDto.RetrieveJobOpeningsRequest(type = Type.ACTOR)
)

jobOpenings.size shouldBe 0
}
}
}

describe("#findById") {
context("존재하는 구인구직을 상세 조회하면") {
val (accessToken, _) = CommonUserCallApi.getAccessToken(client)
val jobOpeningId = CommonJobOpeningCallApi.register(client, accessToken)

it("성공한다") {
val jobOpening = jobOpeningRepository.findById(1)
jobOpening shouldNotBe null
jobOpening?.id shouldBe 1
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import com.fone.common.CustomDescribeSpec
import com.fone.common.IntegrationTest
import com.fone.common.PageDeserializer
import com.fone.common.doGet
import com.fone.common.entity.CategoryType
import com.fone.common.entity.DomainType
import com.fone.common.response.CommonResponse
import com.fone.jobOpening.presentation.dto.RetrieveJobOpeningDto.RetrieveJobOpeningResponse
import com.fone.jobOpening.presentation.dto.RetrieveJobOpeningDto.RetrieveJobOpeningsResponse
Expand Down Expand Up @@ -94,5 +96,69 @@ class RetrieveJobOpeningControllerTest(client: WebTestClient, private val object
}
}
}
describe("#retrieve jobOpenings with filters") {
context("조건에 맞는 구인구직 리스트를 조회하면") {
it("성공한다") {
val filterParams = mapOf(
"type" to "ACTOR",
"ageMin" to "20",
"ageMax" to "30"
)
client.doGet(retrieveUrl, accessToken, filterParams)
.expectStatus().isOk.expectBody().consumeWith { println(it) }
.jsonPath("$.result").isEqualTo("SUCCESS")
}
}
}
describe("#retrieve jobOpenings sorted by viewCount") {
context("조회수(viewCount)로 정렬된 구인구직 리스트를 조회하면") {
it("성공한다") {
client.doGet(retrieveUrl, accessToken, mapOf("type" to "ACTOR", "sort" to "viewCount,desc"))
.expectStatus().isOk.expectBody().consumeWith { println(it) }
.jsonPath("$.result").isEqualTo("SUCCESS")
}
}
}
describe("#retrieve jobOpenings sorted by createdAt") {
context("생성일(createdAt)로 정렬된 구인구직 리스트를 조회하면") {
it("성공한다") {
client.doGet(retrieveUrl, accessToken, mapOf("type" to "ACTOR", "sort" to "createdAt,asc"))
.expectStatus().isOk.expectBody().consumeWith { println(it) }
.jsonPath("$.result").isEqualTo("SUCCESS")
}
}
}
describe("#retrieve jobOpenings sorted by scrapCount") {
context("스크랩수(scrapCount)로 정렬된 구인구직 리스트를 조회하면") {
it("성공한다") {
client.doGet(retrieveUrl, accessToken, mapOf("type" to "ACTOR", "sort" to "scrapCount,desc"))
.expectStatus().isOk.expectBody().consumeWith { println(it) }
.jsonPath("$.result").isEqualTo("SUCCESS")
}
}
}
describe("#retrieve jobOpenings sorted by recruitmentEndDate") {
context("모집 종료일(recruitmentEndDate)로 정렬된 구인구직 리스트를 조회하면") {
it("성공한다") {
client.doGet(retrieveUrl, accessToken, mapOf("type" to "ACTOR", "sort" to "recruitmentEndDate,asc"))
.expectStatus().isOk.expectBody().consumeWith { println(it) }
.jsonPath("$.result").isEqualTo("SUCCESS")
}
}
}
describe("#retrieve jobOpenings with domains and categories") {
context("특정 분야(domains)와 카테고리(categories)로 필터링된 구인구직 리스트를 조회하면") {
it("성공한다") {
val params = mapOf(
"type" to "ACTOR",
"domains" to listOf(DomainType.SCENARIO).joinToString(","),
"categories" to listOf(CategoryType.WEB_DRAMA).joinToString(",")
)
client.doGet(retrieveUrl, accessToken, params)
.expectStatus().isOk.expectBody().consumeWith { println(it) }
.jsonPath("$.result").isEqualTo("SUCCESS")
}
}
}
}
}
Loading

0 comments on commit 6e41901

Please sign in to comment.