diff --git a/src/main/java/roomescape/reservation/business/ReservationTimeService.kt b/src/main/java/roomescape/reservation/business/ReservationTimeService.kt index 9b2ff06b..2cfd3acb 100644 --- a/src/main/java/roomescape/reservation/business/ReservationTimeService.kt +++ b/src/main/java/roomescape/reservation/business/ReservationTimeService.kt @@ -12,6 +12,7 @@ import roomescape.reservation.infrastructure.persistence.ReservationTimeEntity import roomescape.reservation.infrastructure.persistence.ReservationTimeRepository import roomescape.reservation.web.* import java.time.LocalDate +import java.time.LocalTime @Service class ReservationTimeService( @@ -28,30 +29,24 @@ class ReservationTimeService( @Transactional(readOnly = true) - fun findAllTimes(): ReservationTimesResponse = reservationTimeRepository.findAll() - .toResponses() - + fun findAllTimes(): ReservationTimesResponse = reservationTimeRepository.findAll() + .toResponses() @Transactional fun addTime(reservationTimeRequest: ReservationTimeRequest): ReservationTimeResponse { - validateIsDuplicatedTimeExists(reservationTimeRequest) + val startAt: LocalTime = reservationTimeRequest.startAt - return ReservationTimeEntity(startAt = reservationTimeRequest.startAt) + if (reservationTimeRepository.existsByStartAt(startAt)) { + throw RoomescapeException( + ErrorType.TIME_DUPLICATED, "[startAt: $startAt]", HttpStatus.CONFLICT + ) + } + + return ReservationTimeEntity(startAt = startAt) .also { reservationTimeRepository.save(it) } .toResponse() } - private fun validateIsDuplicatedTimeExists(reservationTimeRequest: ReservationTimeRequest) { - reservationTimeRepository.findByStartAt(reservationTimeRequest.startAt) - .also { - if (it.isNotEmpty()) { - throw RoomescapeException( - ErrorType.TIME_DUPLICATED, "[startAt: $it]", HttpStatus.CONFLICT - ) - } - } - } - @Transactional fun removeTimeById(id: Long) { val reservationTime: ReservationTimeEntity = findTimeById(id) diff --git a/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt b/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt index 26b533b8..d4a03bcd 100644 --- a/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt +++ b/src/main/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepository.kt @@ -4,5 +4,5 @@ import org.springframework.data.jpa.repository.JpaRepository import java.time.LocalTime interface ReservationTimeRepository : JpaRepository { - fun findByStartAt(startAt: LocalTime): List + fun existsByStartAt(startAt: LocalTime): Boolean } diff --git a/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt b/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt index cb4a9342..a1bedcfe 100644 --- a/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt +++ b/src/test/java/roomescape/reservation/business/ReservationTimeServiceTest.kt @@ -45,7 +45,7 @@ class ReservationTimeServiceTest : FunSpec({ val request = ReservationTimeRequest(startAt = LocalTime.of(10, 0)) // Mocking the behavior of reservationTimeRepository.findByStartAt - every { reservationTimeRepository.findByStartAt(request.startAt) } returns listOf(mockk()) + every { reservationTimeRepository.existsByStartAt(request.startAt) } returns true shouldThrow { reservationTimeService.addTime(request) diff --git a/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepositoryTest.kt b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepositoryTest.kt new file mode 100644 index 00000000..ba7045a3 --- /dev/null +++ b/src/test/java/roomescape/reservation/infrastructure/persistence/ReservationTimeRepositoryTest.kt @@ -0,0 +1,33 @@ +package roomescape.reservation.infrastructure.persistence + +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe +import jakarta.persistence.EntityManager +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest +import roomescape.util.ReservationTimeFixture +import java.time.LocalTime + +@DataJpaTest +class ReservationTimeRepositoryTest( + val entityManager: EntityManager, + val reservationTimeRepository: ReservationTimeRepository, +) : FunSpec({ + + context("existsByStartAt") { + val startAt = LocalTime.of(10, 0) + + beforeTest { + entityManager.persist(ReservationTimeFixture.create(startAt = startAt)) + entityManager.flush() + entityManager.clear() + } + + test("동일한 시간이 있으면 true 반환") { + reservationTimeRepository.existsByStartAt(startAt) shouldBe true + } + + test("동일한 시간이 없으면 false 반환") { + reservationTimeRepository.existsByStartAt(startAt.plusSeconds(1)) shouldBe false + } + } +})