package roomescape.theme.util import jakarta.persistence.EntityManager import org.springframework.transaction.support.TransactionTemplate import roomescape.member.infrastructure.persistence.MemberEntity import roomescape.reservation.infrastructure.persistence.ReservationStatus import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.time.infrastructure.persistence.TimeEntity import roomescape.util.MemberFixture import roomescape.util.ReservationFixture import roomescape.util.ThemeFixture import roomescape.util.TimeFixture import java.time.LocalDate import java.time.LocalTime class TestThemeDataHelper( val entityManager: EntityManager, val transactionTemplate: TransactionTemplate? ) { /** * GET /themes/most-reserved-last-week API와 관련 Repository 테스트에 사용 * @param name: 테마 이름 * @param reservedCount: 이 테마가 예약된 횟수 * @param date: reservedCount 개의 예약을 만들 때 사용할 날짜 */ fun createThemeWithReservations(name: String, reservedCount: Int, date: LocalDate): ThemeEntity = if (transactionTemplate == null) { createAndGet(name, reservedCount, date) } else { transactionTemplate.execute { createAndGet(name, reservedCount, date) }!! } fun createAndGet(name: String, reservedCount: Int, date: LocalDate): ThemeEntity { val themeEntity: ThemeEntity = ThemeFixture.create(name = name).also { entityManager.persist(it) } val member: MemberEntity = MemberFixture.create().also { entityManager.persist(it) } for (i in 1..reservedCount) { val time: TimeEntity = TimeFixture.create( startAt = LocalTime.now().plusMinutes(i.toLong()) ).also { entityManager.persist(it) } ReservationFixture.create( date = date, theme = themeEntity, member = member, time = time, status = ReservationStatus.entries.random() ).also { entityManager.persist(it) } } entityManager.flush() entityManager.clear() return themeEntity } }