package roomescape.util import io.kotest.core.config.AbstractProjectConfig import io.kotest.core.spec.Spec import io.kotest.core.spec.style.FunSpec import io.kotest.extensions.spring.SpringExtension import io.kotest.extensions.spring.SpringTestExtension import io.restassured.RestAssured import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.context.TestConfiguration import org.springframework.boot.test.web.server.LocalServerPort import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Import import org.springframework.test.context.ActiveProfiles import roomescape.admin.infrastructure.persistence.AdminRepository import roomescape.member.infrastructure.persistence.UserRepository import roomescape.payment.business.PaymentWriter import roomescape.payment.infrastructure.persistence.PaymentRepository import roomescape.reservation.infrastructure.persistence.ReservationRepository import roomescape.schedule.infrastructure.persistence.ScheduleRepository import roomescape.theme.infrastructure.persistence.ThemeRepository object KotestConfig : AbstractProjectConfig() { override fun extensions(): List = listOf(SpringExtension) } @Import(TestConfig::class) @ActiveProfiles("test") @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) abstract class FunSpecSpringbootTest : FunSpec({ extension(DatabaseCleanerExtension()) }) { @Autowired private lateinit var userRepository: UserRepository @Autowired private lateinit var adminRepository: AdminRepository @Autowired lateinit var dummyInitializer: DummyInitializer @LocalServerPort var port: Int = 0 lateinit var authUtil: AuthUtil override suspend fun beforeSpec(spec: Spec) { RestAssured.port = port authUtil = AuthUtil(userRepository, adminRepository) } } @TestConfiguration class TestConfig { @Bean fun dummyInitializer( themeRepository: ThemeRepository, scheduleRepository: ScheduleRepository, reservationRepository: ReservationRepository, paymentWriter: PaymentWriter, paymentRepository: PaymentRepository ): DummyInitializer { return DummyInitializer( themeRepository = themeRepository, scheduleRepository = scheduleRepository, reservationRepository = reservationRepository, paymentWriter = paymentWriter, paymentRepository = paymentRepository ) } }