generated from pricelees/issue-pr-template
<!-- 제목 양식 --> <!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) --> ## 📝 관련 이슈 및 PR **PR과 관련된 이슈 번호** - #30 ## ✨ 작업 내용 <!-- 어떤 작업을 했는지 알려주세요! --> - ReservationService를 읽기(Find) / 쓰기(Write) 서비스로 분리 - 모든 도메인에 repository를 사용하는 Finder, Writer, Validator 도입 -> ReservationService에 있는 조회, 검증, 쓰기 작업을 별도의 클래스로 분리하기 위함이었고, 이 과정에서 다른 도메인에도 도입함. ## 🧪 테스트 <!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! --> 새로 추가된 기능 & 클래스는 모두 테스트 추가하였고, 작업 후 전체 테스트 완료 ## 📚 참고 자료 및 기타 <!-- 참고한 자료, 또는 논의할 사항이 있다면 알려주세요! --> Reviewed-on: #31 Co-authored-by: pricelees <priceelees@gmail.com> Co-committed-by: pricelees <priceelees@gmail.com>
75 lines
2.4 KiB
Kotlin
75 lines
2.4 KiB
Kotlin
package roomescape.time.implement
|
|
|
|
import io.kotest.assertions.throwables.shouldNotThrow
|
|
import io.kotest.assertions.throwables.shouldThrow
|
|
import io.kotest.core.spec.style.FunSpec
|
|
import io.kotest.matchers.shouldBe
|
|
import io.mockk.every
|
|
import io.mockk.mockk
|
|
import roomescape.reservation.implement.ReservationFinder
|
|
import roomescape.time.exception.TimeErrorCode
|
|
import roomescape.time.exception.TimeException
|
|
import roomescape.time.infrastructure.persistence.TimeEntity
|
|
import roomescape.time.infrastructure.persistence.TimeRepository
|
|
import roomescape.util.TimeFixture
|
|
import java.time.LocalTime
|
|
|
|
class TimeValidatorTest : FunSpec({
|
|
val timeRepository: TimeRepository = mockk()
|
|
val reservationFinder: ReservationFinder = mockk()
|
|
|
|
val timeValidator = TimeValidator(timeRepository, reservationFinder)
|
|
|
|
context("validateIsAlreadyExists") {
|
|
val startAt = LocalTime.now()
|
|
|
|
test("같은 이메일을 가진 회원이 있으면 예외를 던진다.") {
|
|
every {
|
|
timeRepository.existsByStartAt(startAt)
|
|
} returns true
|
|
|
|
shouldThrow<TimeException> {
|
|
timeValidator.validateIsAlreadyExists(startAt)
|
|
}.also {
|
|
it.errorCode shouldBe TimeErrorCode.TIME_DUPLICATED
|
|
}
|
|
}
|
|
|
|
test("같은 이메일을 가진 회원이 없으면 종료한다.") {
|
|
every {
|
|
timeRepository.existsByStartAt(startAt)
|
|
} returns false
|
|
|
|
shouldNotThrow<TimeException> {
|
|
timeValidator.validateIsAlreadyExists(startAt)
|
|
}
|
|
}
|
|
}
|
|
|
|
context("validateIsReserved") {
|
|
val time: TimeEntity = TimeFixture.create(startAt = LocalTime.now())
|
|
|
|
test("해당 시간에 예약이 있으면 예외를 던진다.") {
|
|
every {
|
|
reservationFinder.isTimeReserved(time)
|
|
} returns true
|
|
|
|
shouldThrow<TimeException> {
|
|
timeValidator.validateIsReserved(time)
|
|
}.also {
|
|
it.errorCode shouldBe TimeErrorCode.TIME_ALREADY_RESERVED
|
|
}
|
|
}
|
|
|
|
test("해당 시간에 예약이 없으면 종료한다.") {
|
|
every {
|
|
reservationFinder.isTimeReserved(time)
|
|
} returns false
|
|
|
|
shouldNotThrow<TimeException> {
|
|
timeValidator.validateIsReserved(time)
|
|
}
|
|
}
|
|
}
|
|
})
|