[#52] 만료 예약 / 일정 스케쥴링 작업 추가 및 동시성 처리를 위한 일부 코드 수정 #53

Merged
pricelees merged 18 commits from refactor/#52 into main 2025-10-04 08:40:37 +00:00
Showing only changes of commit e9c8e612fa - Show all commits

View File

@ -1,9 +1,5 @@
package com.sangdol.roomescape.schedule package com.sangdol.roomescape.schedule
import io.kotest.matchers.shouldBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import com.sangdol.common.types.web.HttpStatus import com.sangdol.common.types.web.HttpStatus
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel import com.sangdol.roomescape.admin.infrastructure.persistence.AdminPermissionLevel
import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType import com.sangdol.roomescape.admin.infrastructure.persistence.AdminType
@ -12,6 +8,10 @@ import com.sangdol.roomescape.schedule.exception.ScheduleErrorCode
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleRepository
import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus import com.sangdol.roomescape.schedule.infrastructure.persistence.ScheduleStatus
import com.sangdol.roomescape.supports.* import com.sangdol.roomescape.supports.*
import io.kotest.matchers.shouldBe
import org.hamcrest.CoreMatchers.equalTo
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpMethod
import java.time.LocalDate import java.time.LocalDate
import java.time.LocalTime import java.time.LocalTime
@ -20,7 +20,7 @@ class ScheduleApiTest(
) : FunSpecSpringbootTest() { ) : FunSpecSpringbootTest() {
init { init {
context("특정 매장 + 날짜의 일정 및 테마 정보를 조회한다.") { context("특정 매장 + 날짜의 일정 및 테마 정보를 조회한다.") {
test("날짜가 오늘이면 현재 시간 이후의 정보만 조회된다.") { test("날짜가 당일이면 현재 시간 이후의 정보만 조회된다.") {
val size = 3 val size = 3
val date = LocalDate.now() val date = LocalDate.now()
val store = dummyInitializer.createStore() val store = dummyInitializer.createStore()
@ -31,7 +31,7 @@ class ScheduleApiTest(
storeId = store.id, storeId = store.id,
request = ScheduleFixture.createRequest.copy( request = ScheduleFixture.createRequest.copy(
date = date, date = date,
time = LocalTime.now().plusHours(i.toLong()) time = LocalTime.now().plusMinutes(i.toLong())
) )
) )
} }
@ -45,13 +45,17 @@ class ScheduleApiTest(
) )
} }
val expectedSize = scheduleRepository.findAll().takeIf { it.isNotEmpty() }
?.let { it.count { schedule -> schedule.date.isEqual(date) && schedule.time.isAfter(LocalTime.now()) } }
?: throw AssertionError("initialize 작업에서 레코드가 저장되지 않음.")
runTest( runTest(
on = { on = {
get("/stores/${store.id}/schedules?date=${date}") get("/stores/${store.id}/schedules?date=${date}")
}, },
expect = { expect = {
statusCode(HttpStatus.OK.value()) statusCode(HttpStatus.OK.value())
body("data.schedules.size()", equalTo(size)) body("data.schedules.size()", equalTo(expectedSize))
assertProperties( assertProperties(
props = setOf("id", "startFrom", "endAt", "themeId", "themeName", "themeDifficulty", "status"), props = setOf("id", "startFrom", "endAt", "themeId", "themeName", "themeDifficulty", "status"),
propsNameIfList = "schedules" propsNameIfList = "schedules"