73 lines
2.5 KiB
Kotlin

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<SpringTestExtension> = 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
)
}
}