generated from pricelees/issue-pr-template
<!-- 제목 양식 --> <!-- [이슈번호] 작업 요약 (예시: [#10] Gitea 템플릿 생성) --> ## 📝 관련 이슈 및 PR **PR과 관련된 이슈 번호** - #34 ## ✨ 작업 내용 <!-- 어떤 작업을 했는지 알려주세요! --> - 회원 테이블과 관리자 테이블 분리 및 관리자 계정의 예약 기능 제거 - API 인증을 모두(Public) / 회원 전용(UserOnly) / 관리자 전용(AdminOnly) / 회원 + 관리자(Authenticated) 로 세분화해서 구분 - 관리자의 경우 API 접근 권한 세분화 등 인증 로직 개선 - 전체 리팩터링이 완료되어 레거시 코드 제거 ## 🧪 테스트 <!-- 어떤 테스트를 생각했고 진행했는지 알려주세요! --> <img width="750" alt="스크린샷 2025-09-13 19.11.44.png" src="attachments/11e1a79c-9723-4843-839d-be6158d94130"> - 추가 & 변경된 모든 API에 대한 통합 테스트 진행 ## 📚 참고 자료 및 기타 <!-- 참고한 자료, 또는 논의할 사항이 있다면 알려주세요! --> Reviewed-on: #43 Co-authored-by: pricelees <priceelees@gmail.com> Co-committed-by: pricelees <priceelees@gmail.com>
73 lines
2.1 KiB
Kotlin
73 lines
2.1 KiB
Kotlin
package roomescape.supports
|
|
|
|
import io.kotest.core.listeners.AfterSpecListener
|
|
import io.kotest.core.listeners.AfterTestListener
|
|
import io.kotest.core.listeners.BeforeSpecListener
|
|
import io.kotest.core.spec.Spec
|
|
import io.kotest.core.test.TestCase
|
|
import io.kotest.core.test.TestResult
|
|
import io.kotest.extensions.spring.testContextManager
|
|
import jakarta.persistence.EntityManager
|
|
import org.springframework.jdbc.core.JdbcTemplate
|
|
import org.springframework.stereotype.Component
|
|
|
|
@Component
|
|
class TestDatabaseUtil(
|
|
val entityManager: EntityManager,
|
|
val jdbcTemplate: JdbcTemplate,
|
|
) {
|
|
val tables: List<String> by lazy {
|
|
jdbcTemplate.query("SHOW TABLES") { rs, _ ->
|
|
rs.getString(1).lowercase()
|
|
}
|
|
}
|
|
|
|
fun initializeRegion() {
|
|
this::class.java.getResource("/schema/region-data.sql")?.readText()?.let {
|
|
jdbcTemplate.execute(it)
|
|
}
|
|
}
|
|
|
|
fun clear(mode: CleanerMode) {
|
|
entityManager.clear()
|
|
|
|
jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY FALSE")
|
|
tables.forEach {
|
|
if (mode == CleanerMode.EXCEPT_REGION && it == "region") {
|
|
return@forEach
|
|
}
|
|
jdbcTemplate.execute("TRUNCATE TABLE $it RESTART IDENTITY")
|
|
}
|
|
jdbcTemplate.execute("SET REFERENTIAL_INTEGRITY TRUE")
|
|
}
|
|
}
|
|
|
|
enum class CleanerMode {
|
|
EXCEPT_REGION,
|
|
ALL
|
|
}
|
|
|
|
class DatabaseCleanerExtension: BeforeSpecListener, AfterTestListener, AfterSpecListener {
|
|
|
|
override suspend fun beforeSpec(spec: Spec) {
|
|
super.beforeSpec(spec)
|
|
getCleaner().initializeRegion()
|
|
}
|
|
|
|
override suspend fun afterTest(testCase: TestCase, result: TestResult) {
|
|
super.afterTest(testCase, result)
|
|
getCleaner().clear(CleanerMode.EXCEPT_REGION)
|
|
}
|
|
|
|
override suspend fun afterSpec(spec: Spec) {
|
|
super.afterSpec(spec)
|
|
getCleaner().clear(CleanerMode.ALL)
|
|
}
|
|
|
|
private suspend fun getCleaner(): TestDatabaseUtil {
|
|
return testContextManager().testContext
|
|
.applicationContext
|
|
.getBean(TestDatabaseUtil::class.java)
|
|
}
|
|
}
|