diff --git a/src/main/kotlin/roomescape/time/implement/TimeFinder.kt b/src/main/kotlin/roomescape/time/implement/TimeFinder.kt index 609a0fa3..60911a89 100644 --- a/src/main/kotlin/roomescape/time/implement/TimeFinder.kt +++ b/src/main/kotlin/roomescape/time/implement/TimeFinder.kt @@ -51,7 +51,7 @@ class TimeFinder( val allTimes: List = findAll() return allTimes.map { time -> - val isReservable: Boolean = reservations.any { reservation -> time.id == reservation.id } + val isReservable: Boolean = reservations.none { reservation -> time.id == reservation.time.id } TimeWithAvailability(time.id!!, time.startAt, date, themeId, isReservable) }.also { log.debug { "[TimeFinder.findAllWithAvailabilityByDateAndThemeId] ${it.size}개 조회 완료: date:$date, themeId=$themeId" } diff --git a/src/test/kotlin/roomescape/time/implement/TimeFinderTest.kt b/src/test/kotlin/roomescape/time/implement/TimeFinderTest.kt index 5c7c092d..ba6014a9 100644 --- a/src/test/kotlin/roomescape/time/implement/TimeFinderTest.kt +++ b/src/test/kotlin/roomescape/time/implement/TimeFinderTest.kt @@ -10,6 +10,7 @@ import io.mockk.mockk import io.mockk.verify import org.springframework.data.repository.findByIdOrNull import roomescape.reservation.implement.ReservationFinder +import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.time.business.domain.TimeWithAvailability import roomescape.theme.exception.ThemeErrorCode import roomescape.theme.exception.ThemeException @@ -105,5 +106,39 @@ class TimeFinderTest : FunSpec({ it.all { time -> time.isReservable } } } + + test("날짜, 테마에 맞는 예약이 있으면 예약할 수 없다.") { + val times = listOf( + TimeFixture.create(startAt = LocalTime.now()), + TimeFixture.create(startAt = LocalTime.now().plusMinutes(30)) + ) + every { + themeFinder.findById(themeId) + } returns mockk() + + every { + timeRepository.findAll() + } returns times + + every { + reservationFinder.findAllByDateAndTheme(date, any()) + } returns listOf( + mockk().apply { + every { time.id } returns times[0].id + }, + mockk().apply { + every { time.id } returns 0 + } + ) + + val result: List = + timeFinder.findAllWithAvailabilityByDateAndThemeId(date, themeId) + + assertSoftly(result) { + it shouldHaveSize 2 + it[0].isReservable shouldBe false + it[1].isReservable shouldBe true + } + } } })