[#44] 매장 기능 도입 #45

Merged
pricelees merged 116 commits from feat/#44 into main 2025-09-20 03:15:06 +00:00
9 changed files with 226 additions and 221 deletions
Showing only changes of commit 228ea32db1 - Show all commits

View File

@ -38,7 +38,7 @@ class AuthApiTest(
AdminFixture.hqDefault AdminFixture.hqDefault
).forEach { ).forEach {
test("${it.type} 타입 관리자") { test("${it.type} 타입 관리자") {
val admin = authUtil.createAdmin(it) val admin = testAuthUtil.createAdmin(it)
runLoginSuccessTest( runLoginSuccessTest(
id = admin.id, id = admin.id,
@ -56,7 +56,7 @@ class AuthApiTest(
} }
test("회원") { test("회원") {
val user: UserEntity = authUtil.signup(UserFixture.createRequest) val user: UserEntity = testAuthUtil.signup(UserFixture.createRequest)
runLoginSuccessTest( runLoginSuccessTest(
id = user.id, id = user.id,
@ -73,7 +73,7 @@ class AuthApiTest(
context("실패 응답") { context("실패 응답") {
context("계정이 맞으면 로그인 실패 이력을 남긴다.") { context("계정이 맞으면 로그인 실패 이력을 남긴다.") {
test("비밀번호가 틀린 경우") { test("비밀번호가 틀린 경우") {
val admin = authUtil.createAdmin(AdminFixture.default) val admin = testAuthUtil.createAdmin(AdminFixture.default)
val request = LoginRequest(admin.account, "wrong_password", PrincipalType.ADMIN) val request = LoginRequest(admin.account, "wrong_password", PrincipalType.ADMIN)
runTest( runTest(
@ -96,7 +96,7 @@ class AuthApiTest(
} }
test("토큰 생성 과정에서 오류가 발생하는 경우") { test("토큰 생성 과정에서 오류가 발생하는 경우") {
val admin = authUtil.createAdmin(AdminFixture.default) val admin = testAuthUtil.createAdmin(AdminFixture.default)
val request = LoginRequest(admin.account, admin.password, PrincipalType.ADMIN) val request = LoginRequest(admin.account, admin.password, PrincipalType.ADMIN)
every { every {
@ -125,7 +125,7 @@ class AuthApiTest(
context("계정이 일치하지 않으면 로그인 실패 이력을 남기지 않는다.") { context("계정이 일치하지 않으면 로그인 실패 이력을 남기지 않는다.") {
test("회원") { test("회원") {
val user = authUtil.signup(UserFixture.createRequest) val user = testAuthUtil.signup(UserFixture.createRequest)
val invalidEmail = "test@email.com".also { val invalidEmail = "test@email.com".also {
it shouldNotBe user.email it shouldNotBe user.email
} }
@ -149,7 +149,7 @@ class AuthApiTest(
} }
test("관리자") { test("관리자") {
val admin = authUtil.createAdmin(AdminFixture.default) val admin = testAuthUtil.createAdmin(AdminFixture.default)
val invalidAccount = "invalid".also { val invalidAccount = "invalid".also {
it shouldNotBe admin.account it shouldNotBe admin.account
} }

View File

@ -27,7 +27,7 @@ class FailOnSaveLoginHistoryTest(
} }
test("회원") { test("회원") {
val user = authUtil.signup(UserFixture.createRequest) val user = testAuthUtil.signup(UserFixture.createRequest)
val request = LoginRequest(user.email, user.password, PrincipalType.USER) val request = LoginRequest(user.email, user.password, PrincipalType.USER)
runTest( runTest(
@ -44,7 +44,7 @@ class FailOnSaveLoginHistoryTest(
} }
test("관리자") { test("관리자") {
val admin = authUtil.createAdmin(AdminFixture.default) val admin = testAuthUtil.createAdmin(AdminFixture.default)
val request = LoginRequest(admin.account, admin.password, PrincipalType.ADMIN) val request = LoginRequest(admin.account, admin.password, PrincipalType.ADMIN)
runTest( runTest(

View File

@ -43,7 +43,7 @@ class PaymentAPITest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -165,8 +165,8 @@ class PaymentAPITest(
PaymentMethod.entries.filter { it !in supportedMethod }.forEach { PaymentMethod.entries.filter { it !in supportedMethod }.forEach {
test("결제 수단: ${it.koreanName}") { test("결제 수단: ${it.koreanName}") {
val reservation = dummyInitializer.createConfirmReservation( val reservation = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = authUtil.defaultUserLogin() reserverToken = testAuthUtil.defaultUserLogin()
) )
val request = PaymentFixture.confirmRequest val request = PaymentFixture.confirmRequest
@ -183,7 +183,7 @@ class PaymentAPITest(
) )
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = "/payments?reservationId=${reservation.id}", endpoint = "/payments?reservationId=${reservation.id}",
requestBody = PaymentFixture.confirmRequest, requestBody = PaymentFixture.confirmRequest,
@ -209,7 +209,7 @@ class PaymentAPITest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
requestBody = PaymentFixture.cancelRequest, requestBody = PaymentFixture.cancelRequest,
@ -219,10 +219,10 @@ class PaymentAPITest(
} }
test("정상 취소") { test("정상 취소") {
val userToken = authUtil.defaultUserLogin() val userToken = testAuthUtil.defaultUserLogin()
val confirmRequest = PaymentFixture.confirmRequest val confirmRequest = PaymentFixture.confirmRequest
val reservation = dummyInitializer.createConfirmReservation( val reservation = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = userToken reserverToken = userToken
) )
@ -266,9 +266,9 @@ class PaymentAPITest(
} }
test("예약에 대한 결제 정보가 없으면 실패한다.") { test("예약에 대한 결제 정보가 없으면 실패한다.") {
val userToken = authUtil.defaultUserLogin() val userToken = testAuthUtil.defaultUserLogin()
val reservation = dummyInitializer.createConfirmReservation( val reservation = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = userToken, reserverToken = userToken,
) )
@ -312,8 +312,8 @@ class PaymentAPITest(
val request = PaymentFixture.confirmRequest.copy(paymentKey = paymentKey, amount = amount) val request = PaymentFixture.confirmRequest.copy(paymentKey = paymentKey, amount = amount)
val reservation: ReservationEntity = dummyInitializer.createPendingReservation( val reservation: ReservationEntity = dummyInitializer.createPendingReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = authUtil.defaultUserLogin(), reserverToken = testAuthUtil.defaultUserLogin(),
) )
val method = if (easyPayDetail != null) { val method = if (easyPayDetail != null) {
@ -335,7 +335,7 @@ class PaymentAPITest(
} returns clientResponse } returns clientResponse
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
using = { using = {
body(request) body(request)
}, },

View File

@ -55,7 +55,7 @@ class ReservationApiTest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -66,13 +66,13 @@ class ReservationApiTest(
test("정상 생성") { test("정상 생성") {
val schedule: ScheduleEntity = dummyInitializer.createSchedule( val schedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
request = ScheduleFixture.createRequest, request = ScheduleFixture.createRequest,
status = ScheduleStatus.HOLD status = ScheduleStatus.HOLD
) )
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
using = { using = {
body(commonRequest.copy(scheduleId = schedule.id)) body(commonRequest.copy(scheduleId = schedule.id))
}, },
@ -95,13 +95,13 @@ class ReservationApiTest(
test("예약을 생성할 때 해당 일정이 ${ScheduleStatus.HOLD} 상태가 아니면 실패한다.") { test("예약을 생성할 때 해당 일정이 ${ScheduleStatus.HOLD} 상태가 아니면 실패한다.") {
val schedule: ScheduleEntity = dummyInitializer.createSchedule( val schedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
request = ScheduleFixture.createRequest, request = ScheduleFixture.createRequest,
status = ScheduleStatus.AVAILABLE status = ScheduleStatus.AVAILABLE
) )
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
using = { using = {
body(commonRequest.copy(scheduleId = schedule.id)) body(commonRequest.copy(scheduleId = schedule.id))
}, },
@ -116,7 +116,7 @@ class ReservationApiTest(
} }
test("예약 인원이 테마의 최소 인원보다 작거나 최대 인원보다 많으면 실패한다.") { test("예약 인원이 테마의 최소 인원보다 작거나 최대 인원보다 많으면 실패한다.") {
val adminToken = authUtil.defaultStoreAdminLogin() val adminToken = testAuthUtil.defaultStoreAdminLogin()
val theme: ThemeEntity = dummyInitializer.createTheme( val theme: ThemeEntity = dummyInitializer.createTheme(
adminToken = adminToken, adminToken = adminToken,
request = ThemeFixture.createRequest request = ThemeFixture.createRequest
@ -128,7 +128,7 @@ class ReservationApiTest(
status = ScheduleStatus.HOLD status = ScheduleStatus.HOLD
) )
val userToken = authUtil.defaultUserLogin() val userToken = testAuthUtil.defaultUserLogin()
runExceptionTest( runExceptionTest(
token = userToken, token = userToken,
@ -156,7 +156,7 @@ class ReservationApiTest(
context("필수 입력값이 입력되지 않으면 실패한다.") { context("필수 입력값이 입력되지 않으면 실패한다.") {
test("예약자명") { test("예약자명") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
requestBody = commonRequest.copy(reserverName = ""), requestBody = commonRequest.copy(reserverName = ""),
@ -166,7 +166,7 @@ class ReservationApiTest(
test("예약자 연락처") { test("예약자 연락처") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
requestBody = commonRequest.copy(reserverContact = ""), requestBody = commonRequest.copy(reserverContact = ""),
@ -190,7 +190,7 @@ class ReservationApiTest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -199,10 +199,10 @@ class ReservationApiTest(
} }
test("정상 응답") { test("정상 응답") {
val userToken = authUtil.defaultUserLogin() val userToken = testAuthUtil.defaultUserLogin()
val reservation: ReservationEntity = dummyInitializer.createPendingReservation( val reservation: ReservationEntity = dummyInitializer.createPendingReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = userToken, reserverToken = userToken,
) )
@ -228,7 +228,7 @@ class ReservationApiTest(
test("예약이 없으면 실패한다.") { test("예약이 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = "/reservations/$INVALID_PK/confirm", endpoint = "/reservations/$INVALID_PK/confirm",
expectedErrorCode = ReservationErrorCode.RESERVATION_NOT_FOUND expectedErrorCode = ReservationErrorCode.RESERVATION_NOT_FOUND
@ -250,7 +250,7 @@ class ReservationApiTest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -259,10 +259,10 @@ class ReservationApiTest(
} }
test("정상 응답") { test("정상 응답") {
val userToken = authUtil.defaultUserLogin() val userToken = testAuthUtil.defaultUserLogin()
val reservation: ReservationEntity = dummyInitializer.createConfirmReservation( val reservation: ReservationEntity = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = userToken, reserverToken = userToken,
) )
@ -291,7 +291,7 @@ class ReservationApiTest(
test("예약이 없으면 실패한다.") { test("예약이 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = "/reservations/$INVALID_PK/cancel", endpoint = "/reservations/$INVALID_PK/cancel",
requestBody = ReservationCancelRequest(cancelReason = "test"), requestBody = ReservationCancelRequest(cancelReason = "test"),
@ -301,12 +301,12 @@ class ReservationApiTest(
test("다른 회원의 예약을 취소할 수 없다.") { test("다른 회원의 예약을 취소할 수 없다.") {
val reservation: ReservationEntity = dummyInitializer.createConfirmReservation( val reservation: ReservationEntity = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = authUtil.defaultUserLogin(), reserverToken = testAuthUtil.defaultUserLogin(),
) )
val otherUserToken = val otherUserToken =
authUtil.userLogin(UserFixture.createUser(email = "test@test.com", phone = "01011111111")) testAuthUtil.userLogin(UserFixture.createUser(email = "test@test.com", phone = "01011111111"))
runExceptionTest( runExceptionTest(
token = otherUserToken, token = otherUserToken,
@ -332,7 +332,7 @@ class ReservationApiTest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -341,8 +341,8 @@ class ReservationApiTest(
} }
test("정상 응답") { test("정상 응답") {
val userToken = authUtil.defaultUserLogin() val userToken = testAuthUtil.defaultUserLogin()
val adminToken = authUtil.defaultStoreAdminLogin() val adminToken = testAuthUtil.defaultStoreAdminLogin()
for (i in 1..3) { for (i in 1..3) {
dummyInitializer.createConfirmReservation( dummyInitializer.createConfirmReservation(
@ -398,7 +398,7 @@ class ReservationApiTest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -413,8 +413,8 @@ class ReservationApiTest(
beforeTest { beforeTest {
reservation = dummyInitializer.createConfirmReservation( reservation = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = authUtil.defaultUserLogin(), reserverToken = testAuthUtil.defaultUserLogin(),
) )
} }
@ -480,7 +480,7 @@ class ReservationApiTest(
val cancelReason = "테스트입니다." val cancelReason = "테스트입니다."
val user = authUtil.defaultUser() val user = testAuthUtil.defaultUser()
dummyInitializer.cancelPayment( dummyInitializer.cancelPayment(
userId = user.id, userId = user.id,
@ -547,7 +547,7 @@ class ReservationApiTest(
test("예약이 없으면 실패한다.") { test("예약이 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = "/reservations/$INVALID_PK/detail", endpoint = "/reservations/$INVALID_PK/detail",
expectedErrorCode = ReservationErrorCode.RESERVATION_NOT_FOUND expectedErrorCode = ReservationErrorCode.RESERVATION_NOT_FOUND
@ -556,12 +556,12 @@ class ReservationApiTest(
test("예약은 있지만, 결제 정보를 찾을 수 없으면 null로 지정한다.") { test("예약은 있지만, 결제 정보를 찾을 수 없으면 null로 지정한다.") {
val reservation = dummyInitializer.createConfirmReservation( val reservation = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = authUtil.defaultUserLogin(), reserverToken = testAuthUtil.defaultUserLogin(),
) )
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
on = { on = {
get("/reservations/${reservation.id}/detail") get("/reservations/${reservation.id}/detail")
}, },
@ -574,8 +574,8 @@ class ReservationApiTest(
test("예약과 결제는 있지만, 결제 세부 내역이 없으면 세부 내역만 null로 지정한다..") { test("예약과 결제는 있지만, 결제 세부 내역이 없으면 세부 내역만 null로 지정한다..") {
val reservation = dummyInitializer.createConfirmReservation( val reservation = dummyInitializer.createConfirmReservation(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
reserverToken = authUtil.defaultUserLogin(), reserverToken = testAuthUtil.defaultUserLogin(),
) )
dummyInitializer.createPayment( dummyInitializer.createPayment(
@ -586,7 +586,7 @@ class ReservationApiTest(
} }
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
on = { on = {
get("/reservations/${reservation.id}/detail") get("/reservations/${reservation.id}/detail")
}, },
@ -621,7 +621,7 @@ class ReservationApiTest(
reservation: ReservationEntity reservation: ReservationEntity
): LinkedHashMap<String, Any> { ): LinkedHashMap<String, Any> {
return runTest( return runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
on = { on = {
get("/reservations/${reservation.id}/detail") get("/reservations/${reservation.id}/detail")
}, },
@ -636,7 +636,7 @@ class ReservationApiTest(
} }
private fun initializeForPopularThemeTest(): MostReservedThemeIdListResponse { private fun initializeForPopularThemeTest(): MostReservedThemeIdListResponse {
val user: UserEntity = authUtil.defaultUser() val user: UserEntity = testAuthUtil.defaultUser()
val themeIds: List<Long> = (1..5).map { val themeIds: List<Long> = (1..5).map {
themeRepository.save( themeRepository.save(

View File

@ -32,7 +32,7 @@ class ScheduleApiTest(
val endpoint = "/schedules/themes?date=$date" val endpoint = "/schedules/themes?date=$date"
test("정상 응답") { test("정상 응답") {
val adminToken = authUtil.defaultStoreAdminLogin() val adminToken = testAuthUtil.defaultStoreAdminLogin()
for (i in 1..10) { for (i in 1..10) {
dummyInitializer.createSchedule( dummyInitializer.createSchedule(
@ -45,7 +45,7 @@ class ScheduleApiTest(
} }
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
on = { on = {
get(endpoint) get(endpoint)
}, },
@ -61,7 +61,7 @@ class ScheduleApiTest(
test("정상 응답") { test("정상 응답") {
val date = LocalDate.now().plusDays(1) val date = LocalDate.now().plusDays(1)
val adminToken = authUtil.defaultStoreAdminLogin() val adminToken = testAuthUtil.defaultStoreAdminLogin()
val createdSchedule = dummyInitializer.createSchedule( val createdSchedule = dummyInitializer.createSchedule(
adminToken = adminToken, adminToken = adminToken,
request = createRequest.copy(date = date, time = LocalTime.now()) request = createRequest.copy(date = date, time = LocalTime.now())
@ -79,7 +79,7 @@ class ScheduleApiTest(
} }
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
on = { on = {
get("/schedules?date=$date&themeId=${createdSchedule.themeId}") get("/schedules?date=$date&themeId=${createdSchedule.themeId}")
}, },
@ -109,7 +109,7 @@ class ScheduleApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -120,7 +120,7 @@ class ScheduleApiTest(
val admin = AdminFixture.create(permissionLevel = AdminPermissionLevel.READ_SUMMARY) val admin = AdminFixture.create(permissionLevel = AdminPermissionLevel.READ_SUMMARY)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -129,7 +129,7 @@ class ScheduleApiTest(
} }
test("정상 응답") { test("정상 응답") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val createdSchedule = dummyInitializer.createSchedule( val createdSchedule = dummyInitializer.createSchedule(
adminToken = token, adminToken = token,
@ -161,7 +161,7 @@ class ScheduleApiTest(
test("일정이 없으면 실패한다.") { test("일정이 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = "/schedules/$INVALID_PK", endpoint = "/schedules/$INVALID_PK",
expectedErrorCode = ScheduleErrorCode.SCHEDULE_NOT_FOUND expectedErrorCode = ScheduleErrorCode.SCHEDULE_NOT_FOUND
@ -184,7 +184,7 @@ class ScheduleApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
requestBody = createRequest, requestBody = createRequest,
endpoint = endpoint, endpoint = endpoint,
@ -197,7 +197,7 @@ class ScheduleApiTest(
val admin = AdminFixture.create(permissionLevel = it) val admin = AdminFixture.create(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.POST, method = HttpMethod.POST,
requestBody = createRequest, requestBody = createRequest,
endpoint = endpoint, endpoint = endpoint,
@ -208,7 +208,7 @@ class ScheduleApiTest(
} }
test("정상 생성 및 감사 정보 확인") { test("정상 생성 및 감사 정보 확인") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val themeId: Long = dummyInitializer.createTheme( val themeId: Long = dummyInitializer.createTheme(
adminToken = token, adminToken = token,
@ -246,7 +246,7 @@ class ScheduleApiTest(
} }
test("이미 동일한 날짜, 시간, 테마인 일정이 있으면 실패한다.") { test("이미 동일한 날짜, 시간, 테마인 일정이 있으면 실패한다.") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val date = LocalDate.now().plusDays(1) val date = LocalDate.now().plusDays(1)
val time = LocalTime.of(10, 0) val time = LocalTime.of(10, 0)
@ -267,7 +267,7 @@ class ScheduleApiTest(
} }
test("입력된 날짜 + 시간이 현재 시간 이전이면 실패한다.") { test("입력된 날짜 + 시간이 현재 시간 이전이면 실패한다.") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val body = createRequest.copy(LocalDate.now(), LocalTime.now().minusMinutes(1)) val body = createRequest.copy(LocalDate.now(), LocalTime.now().minusMinutes(1))
runExceptionTest( runExceptionTest(
@ -294,7 +294,7 @@ class ScheduleApiTest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -304,12 +304,12 @@ class ScheduleApiTest(
test("해당 일정이 ${ScheduleStatus.AVAILABLE} 상태이면 정상 응답") { test("해당 일정이 ${ScheduleStatus.AVAILABLE} 상태이면 정상 응답") {
val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule( val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
request = createRequest request = createRequest
) )
runTest( runTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
on = { on = {
patch("/schedules/${createdSchedule.id}/hold") patch("/schedules/${createdSchedule.id}/hold")
}, },
@ -326,7 +326,7 @@ class ScheduleApiTest(
test("예약이 없으면 실패한다.") { test("예약이 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
endpoint = "/schedules/$INVALID_PK/hold", endpoint = "/schedules/$INVALID_PK/hold",
expectedErrorCode = ScheduleErrorCode.SCHEDULE_NOT_FOUND expectedErrorCode = ScheduleErrorCode.SCHEDULE_NOT_FOUND
@ -334,7 +334,7 @@ class ScheduleApiTest(
} }
test("해당 일정이 ${ScheduleStatus.AVAILABLE} 상태가 아니면 실패한다.") { test("해당 일정이 ${ScheduleStatus.AVAILABLE} 상태가 아니면 실패한다.") {
val adminToken = authUtil.defaultStoreAdminLogin() val adminToken = testAuthUtil.defaultStoreAdminLogin()
val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule( val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = adminToken, adminToken = adminToken,
@ -361,7 +361,7 @@ class ScheduleApiTest(
) )
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
endpoint = "/schedules/${createdSchedule.id}/hold", endpoint = "/schedules/${createdSchedule.id}/hold",
expectedErrorCode = ScheduleErrorCode.SCHEDULE_NOT_AVAILABLE expectedErrorCode = ScheduleErrorCode.SCHEDULE_NOT_AVAILABLE
@ -389,7 +389,7 @@ class ScheduleApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
requestBody = updateRequest, requestBody = updateRequest,
endpoint = endpoint, endpoint = endpoint,
@ -402,7 +402,7 @@ class ScheduleApiTest(
val admin = AdminFixture.create(permissionLevel = it) val admin = AdminFixture.create(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
requestBody = updateRequest, requestBody = updateRequest,
endpoint = endpoint, endpoint = endpoint,
@ -414,14 +414,14 @@ class ScheduleApiTest(
test("정상 수정 및 감사 정보 변경 확인") { test("정상 수정 및 감사 정보 변경 확인") {
val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule( val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = authUtil.defaultStoreAdminLogin(), adminToken = testAuthUtil.defaultStoreAdminLogin(),
request = createRequest.copy( request = createRequest.copy(
date = LocalDate.now().plusDays(1), date = LocalDate.now().plusDays(1),
time = LocalTime.now().plusMinutes(1), time = LocalTime.now().plusMinutes(1),
) )
) )
val otherAdminToken = authUtil.adminLogin( val otherAdminToken = testAuthUtil.adminLogin(
AdminFixture.create(account = "otherAdmin", phone = "01099999999") AdminFixture.create(account = "otherAdmin", phone = "01099999999")
) )
@ -449,7 +449,7 @@ class ScheduleApiTest(
} }
test("입력값이 없으면 수정하지 않는다.") { test("입력값이 없으면 수정하지 않는다.") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule( val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = token, adminToken = token,
@ -477,7 +477,7 @@ class ScheduleApiTest(
test("일정이 없으면 실패한다.") { test("일정이 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
requestBody = updateRequest, requestBody = updateRequest,
endpoint = "/schedules/${INVALID_PK}", endpoint = "/schedules/${INVALID_PK}",
@ -486,7 +486,7 @@ class ScheduleApiTest(
} }
test("입력된 날짜 + 시간이 현재 시간 이전이면 실패한다.") { test("입력된 날짜 + 시간이 현재 시간 이전이면 실패한다.") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule( val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = token, adminToken = token,
request = request =
@ -518,7 +518,7 @@ class ScheduleApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.DELETE, method = HttpMethod.DELETE,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -530,7 +530,7 @@ class ScheduleApiTest(
val admin = AdminFixture.create(permissionLevel = it) val admin = AdminFixture.create(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.DELETE, method = HttpMethod.DELETE,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -540,7 +540,7 @@ class ScheduleApiTest(
} }
test("정상 삭제") { test("정상 삭제") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule( val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = token, adminToken = token,
request = createRequest request = createRequest
@ -560,7 +560,7 @@ class ScheduleApiTest(
} }
test("예약 중이거나 예약이 완료된 일정이면 실패한다.") { test("예약 중이거나 예약이 완료된 일정이면 실패한다.") {
val token = authUtil.defaultStoreAdminLogin() val token = testAuthUtil.defaultStoreAdminLogin()
val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule( val createdSchedule: ScheduleEntity = dummyInitializer.createSchedule(
adminToken = token, adminToken = token,

View File

@ -47,11 +47,11 @@ abstract class FunSpecSpringbootTest : FunSpec({
@LocalServerPort @LocalServerPort
var port: Int = 0 var port: Int = 0
lateinit var authUtil: AuthUtil lateinit var testAuthUtil: TestAuthUtil
override suspend fun beforeSpec(spec: Spec) { override suspend fun beforeSpec(spec: Spec) {
RestAssured.port = port RestAssured.port = port
authUtil = AuthUtil(userRepository, adminRepository, storeRepository) testAuthUtil = TestAuthUtil(userRepository, adminRepository, storeRepository)
} }
} }

View File

@ -0,0 +1,94 @@
package roomescape.supports
import io.restassured.module.kotlin.extensions.Extract
import io.restassured.module.kotlin.extensions.Given
import io.restassured.module.kotlin.extensions.Then
import io.restassured.module.kotlin.extensions.When
import org.springframework.data.repository.findByIdOrNull
import org.springframework.http.HttpStatus
import org.springframework.http.MediaType
import roomescape.admin.infrastructure.persistence.AdminEntity
import roomescape.admin.infrastructure.persistence.AdminRepository
import roomescape.auth.web.LoginRequest
import roomescape.common.dto.PrincipalType
import roomescape.store.infrastructure.persistence.StoreRepository
import roomescape.user.infrastructure.persistence.UserEntity
import roomescape.user.infrastructure.persistence.UserRepository
import roomescape.user.web.UserCreateRequest
class TestAuthUtil(
private val userRepository: UserRepository,
private val adminRepository: AdminRepository,
private val storeRepository: StoreRepository,
) {
fun createAdmin(admin: AdminEntity): AdminEntity {
val storeId = admin.storeId
if (storeId != null && storeRepository.findByIdOrNull(storeId) == null) {
storeRepository.save(
StoreFixture.create(
id = storeId,
businessRegNum = randomBusinessRegNum(),
)
)
}
return adminRepository.save(admin)
}
fun signup(request: UserCreateRequest): UserEntity {
val userId: Long = Given {
contentType(MediaType.APPLICATION_JSON_VALUE)
body(request)
} When {
post("/users")
} Then {
statusCode(HttpStatus.OK.value())
} Extract {
path("data.id")
}
return userRepository.findByIdOrNull(userId)
?: throw AssertionError("Unexpected Exception Occurred.")
}
fun adminLogin(admin: AdminEntity): String {
val saved = createAdmin(admin)
val requestBody = LoginRequest(saved.account, saved.password, PrincipalType.ADMIN)
return Given {
contentType(MediaType.APPLICATION_JSON_VALUE)
body(requestBody)
} When {
post("/auth/login")
} Then {
statusCode(200)
} Extract {
path("data.accessToken")
}
}
fun defaultStoreAdminLogin(): String = adminLogin(AdminFixture.storeDefault)
fun defaultHqAdminLogin(): String = adminLogin(AdminFixture.hqDefault)
fun userLogin(user: UserEntity): String {
if (userRepository.findByEmail(user.email) == null) {
userRepository.save(user)
}
return Given {
contentType(MediaType.APPLICATION_JSON_VALUE)
body(LoginRequest(account = user.email, password = user.password, principalType = PrincipalType.USER))
} When {
post("/auth/login")
} Then {
statusCode(200)
} Extract {
path("data.accessToken")
}
}
fun defaultUserLogin(): String = userLogin(UserFixture.default)
fun defaultUser(): UserEntity = userRepository.findByEmail(UserFixture.default.email)
?: userRepository.save(UserFixture.default)
}

View File

@ -19,13 +19,12 @@ import roomescape.theme.business.MIN_PRICE
import roomescape.theme.exception.ThemeErrorCode import roomescape.theme.exception.ThemeErrorCode
import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeEntity
import roomescape.theme.infrastructure.persistence.ThemeRepository import roomescape.theme.infrastructure.persistence.ThemeRepository
import roomescape.theme.web.ThemeIdListRequest
import roomescape.theme.web.ThemeUpdateRequest import roomescape.theme.web.ThemeUpdateRequest
import roomescape.supports.* import roomescape.supports.*
import roomescape.supports.ThemeFixture.createRequest import roomescape.supports.ThemeFixture.createRequest
import kotlin.random.Random import kotlin.random.Random
class ThemeApiTest( class HQAdminThemeApiTest(
private val themeRepository: ThemeRepository private val themeRepository: ThemeRepository
) : FunSpecSpringbootTest() { ) : FunSpecSpringbootTest() {
@ -45,7 +44,7 @@ class ThemeApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.POST, method = HttpMethod.POST,
requestBody = createRequest, requestBody = createRequest,
endpoint = endpoint, endpoint = endpoint,
@ -58,7 +57,7 @@ class ThemeApiTest(
val admin = AdminFixture.createStoreAdmin(permissionLevel = it) val admin = AdminFixture.createStoreAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.POST, method = HttpMethod.POST,
requestBody = createRequest, requestBody = createRequest,
endpoint = endpoint, endpoint = endpoint,
@ -71,7 +70,7 @@ class ThemeApiTest(
val admin = AdminFixture.createHqAdmin(permissionLevel = it) val admin = AdminFixture.createHqAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.POST, method = HttpMethod.POST,
requestBody = createRequest, requestBody = createRequest,
endpoint = endpoint, endpoint = endpoint,
@ -84,7 +83,7 @@ class ThemeApiTest(
test("정상 생성 및 감사 정보 확인") { test("정상 생성 및 감사 정보 확인") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
@ -112,7 +111,7 @@ class ThemeApiTest(
} }
test("이미 동일한 이름의 테마가 있으면 실패한다.") { test("이미 동일한 이름의 테마가 있으면 실패한다.") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
val commonName = "test123" val commonName = "test123"
dummyInitializer.createTheme( dummyInitializer.createTheme(
adminToken = token, adminToken = token,
@ -135,7 +134,7 @@ class ThemeApiTest(
} }
test("금액이 ${MIN_PRICE}원 미만이면 실패한다.") { test("금액이 ${MIN_PRICE}원 미만이면 실패한다.") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -158,7 +157,7 @@ class ThemeApiTest(
} }
test("field: availableMinutes") { test("field: availableMinutes") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -172,7 +171,7 @@ class ThemeApiTest(
} }
test("field: expectedMinutesFrom") { test("field: expectedMinutesFrom") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -186,7 +185,7 @@ class ThemeApiTest(
} }
test("field: expectedMinutesTo") { test("field: expectedMinutesTo") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -202,7 +201,7 @@ class ThemeApiTest(
context("시간 범위가 잘못 지정되면 실패한다.") { context("시간 범위가 잘못 지정되면 실패한다.") {
test("최소 예상 시간 > 최대 예상 시간") { test("최소 예상 시간 > 최대 예상 시간") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -219,7 +218,7 @@ class ThemeApiTest(
} }
test("최대 예상 시간 > 이용 가능 시간") { test("최대 예상 시간 > 이용 가능 시간") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -249,7 +248,7 @@ class ThemeApiTest(
} }
test("field: minParticipants") { test("field: minParticipants") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -263,7 +262,7 @@ class ThemeApiTest(
} }
test("field: maxParticipants") { test("field: maxParticipants") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -279,7 +278,7 @@ class ThemeApiTest(
context("인원 범위가 잘못 지정되면 실패한다.") { context("인원 범위가 잘못 지정되면 실패한다.") {
test("최소 인원 > 최대 인원") { test("최소 인원 > 최대 인원") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
runTest( runTest(
token = token, token = token,
using = { using = {
@ -297,59 +296,6 @@ class ThemeApiTest(
} }
} }
context("입력된 모든 ID에 대한 테마를 조회한다.") {
test("정상 응답") {
val adminToken = authUtil.defaultHqAdminLogin()
val themeSize = 3
val themeIds = mutableListOf<Long>()
for (i in 1..themeSize) {
dummyInitializer.createTheme(adminToken, createRequest.copy(name = "test$i"))
.also { themeIds.add(it.id) }
}
runTest(
token = authUtil.defaultUserLogin(),
using = {
body(ThemeIdListRequest(themeIds))
},
on = {
post("/themes/batch")
},
expect = {
statusCode(HttpStatus.OK.value())
body("data.themes.size()", equalTo(themeSize))
}
)
}
test("없는 테마가 있으면 생략한다.") {
val token = authUtil.defaultHqAdminLogin()
val themeSize = 3
val themeIds = mutableListOf<Long>()
for (i in 1..themeSize) {
dummyInitializer.createTheme(token, createRequest.copy(name = "test$i"))
.also { themeIds.add(it.id) }
}
themeIds.add(INVALID_PK)
runTest(
token = authUtil.defaultUserLogin(),
using = {
body(ThemeIdListRequest(themeIds))
},
on = {
post("/themes/batch")
},
expect = {
statusCode(HttpStatus.OK.value())
body("data.themes.size()", equalTo(themeSize))
}
)
}
}
context("관리자가 모든 테마를 조회한다.") { context("관리자가 모든 테마를 조회한다.") {
val endpoint = "/admin/themes" val endpoint = "/admin/themes"
val requests = listOf( val requests = listOf(
@ -368,7 +314,7 @@ class ThemeApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -380,7 +326,7 @@ class ThemeApiTest(
val admin = AdminFixture.createStoreAdmin(permissionLevel = it) val admin = AdminFixture.createStoreAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.POST, method = HttpMethod.POST,
requestBody = createRequest, requestBody = createRequest,
endpoint = endpoint, endpoint = endpoint,
@ -392,7 +338,7 @@ class ThemeApiTest(
test("비공개 테마까지 포함하여 간단한 정보만 조회된다.") { test("비공개 테마까지 포함하여 간단한 정보만 조회된다.") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
requests.forEach { dummyInitializer.createTheme(token, it) } requests.forEach { dummyInitializer.createTheme(token, it) }
runTest( runTest(
@ -411,40 +357,6 @@ class ThemeApiTest(
} }
} }
context("ID로 테마 정보를 조회한다.") {
test("성공 응답") {
val createdTheme: ThemeEntity = dummyInitializer.createTheme(
adminToken = authUtil.defaultHqAdminLogin(),
request = createRequest
)
runTest(
on = {
get("/themes/${createdTheme.id}")
},
expect = {
body("data.id", equalTo(createdTheme.id))
body("data.name", equalTo(createdTheme.name))
assertProperties(
props = setOf(
"id", "name", "thumbnailUrl", "description", "difficulty", "price",
"minParticipants", "maxParticipants",
"availableMinutes", "expectedMinutesFrom", "expectedMinutesTo"
),
)
}
)
}
test("테마가 없으면 실패한다.") {
runExceptionTest(
method = HttpMethod.GET,
endpoint = "/themes/$INVALID_PK",
expectedErrorCode = ThemeErrorCode.THEME_NOT_FOUND
)
}
}
context("관리자 페이지에서 특정 테마의 상세 정보를 조회한다.") { context("관리자 페이지에서 특정 테마의 상세 정보를 조회한다.") {
context("권한이 없으면 접근할 수 없다.") { context("권한이 없으면 접근할 수 없다.") {
val endpoint = "/admin/themes/$INVALID_PK" val endpoint = "/admin/themes/$INVALID_PK"
@ -459,7 +371,7 @@ class ThemeApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -471,7 +383,7 @@ class ThemeApiTest(
val admin = AdminFixture.createStoreAdmin(permissionLevel = it) val admin = AdminFixture.createStoreAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -483,7 +395,7 @@ class ThemeApiTest(
val admin = AdminFixture.createHqAdmin(permissionLevel = it) val admin = AdminFixture.createHqAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -494,7 +406,7 @@ class ThemeApiTest(
} }
test("정상 응답") { test("정상 응답") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
val createdTheme = dummyInitializer.createTheme( val createdTheme = dummyInitializer.createTheme(
adminToken = token, adminToken = token,
request = createRequest request = createRequest
@ -522,7 +434,7 @@ class ThemeApiTest(
test("테마가 없으면 실패한다.") { test("테마가 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultHqAdminLogin(), token = testAuthUtil.defaultHqAdminLogin(),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = "/admin/themes/$INVALID_PK", endpoint = "/admin/themes/$INVALID_PK",
expectedErrorCode = ThemeErrorCode.THEME_NOT_FOUND expectedErrorCode = ThemeErrorCode.THEME_NOT_FOUND
@ -531,7 +443,6 @@ class ThemeApiTest(
} }
context("테마를 삭제한다.") { context("테마를 삭제한다.") {
context("권한이 없으면 접근할 수 없다.") { context("권한이 없으면 접근할 수 없다.") {
val endpoint = "/admin/themes/${INVALID_PK}" val endpoint = "/admin/themes/${INVALID_PK}"
@ -545,7 +456,7 @@ class ThemeApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.DELETE, method = HttpMethod.DELETE,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -557,7 +468,7 @@ class ThemeApiTest(
val admin = AdminFixture.createStoreAdmin(permissionLevel = it) val admin = AdminFixture.createStoreAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.DELETE, method = HttpMethod.DELETE,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -569,7 +480,7 @@ class ThemeApiTest(
val admin = AdminFixture.createHqAdmin(permissionLevel = it) val admin = AdminFixture.createHqAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.DELETE, method = HttpMethod.DELETE,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -580,7 +491,7 @@ class ThemeApiTest(
} }
test("정상 삭제") { test("정상 삭제") {
val token = authUtil.defaultHqAdminLogin() val token = testAuthUtil.defaultHqAdminLogin()
val createdTheme = dummyInitializer.createTheme( val createdTheme = dummyInitializer.createTheme(
adminToken = token, adminToken = token,
request = createRequest request = createRequest
@ -601,7 +512,7 @@ class ThemeApiTest(
test("테마가 없으면 실패한다.") { test("테마가 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultHqAdminLogin(), token = testAuthUtil.defaultHqAdminLogin(),
method = HttpMethod.DELETE, method = HttpMethod.DELETE,
endpoint = "/admin/themes/$INVALID_PK", endpoint = "/admin/themes/$INVALID_PK",
expectedErrorCode = ThemeErrorCode.THEME_NOT_FOUND expectedErrorCode = ThemeErrorCode.THEME_NOT_FOUND
@ -625,7 +536,7 @@ class ThemeApiTest(
test("회원") { test("회원") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultUserLogin(), token = testAuthUtil.defaultUserLogin(),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
endpoint = endpoint, endpoint = endpoint,
requestBody = request, requestBody = request,
@ -638,7 +549,7 @@ class ThemeApiTest(
val admin = AdminFixture.createStoreAdmin(permissionLevel = it) val admin = AdminFixture.createStoreAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
endpoint = endpoint, endpoint = endpoint,
requestBody = request, requestBody = request,
@ -651,7 +562,7 @@ class ThemeApiTest(
val admin = AdminFixture.createHqAdmin(permissionLevel = it) val admin = AdminFixture.createHqAdmin(permissionLevel = it)
runExceptionTest( runExceptionTest(
token = authUtil.adminLogin(admin), token = testAuthUtil.adminLogin(admin),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
endpoint = endpoint, endpoint = endpoint,
requestBody = request, requestBody = request,
@ -666,10 +577,10 @@ class ThemeApiTest(
test("정상 수정 및 감사 정보 변경 확인") { test("정상 수정 및 감사 정보 변경 확인") {
val createdTheme: ThemeEntity = dummyInitializer.createTheme( val createdTheme: ThemeEntity = dummyInitializer.createTheme(
adminToken = authUtil.defaultHqAdminLogin(), adminToken = testAuthUtil.defaultHqAdminLogin(),
request = createRequest.copy(name = "theme-${Random.nextInt()}") request = createRequest.copy(name = "theme-${Random.nextInt()}")
) )
val otherAdminToken: String = authUtil.adminLogin( val otherAdminToken: String = testAuthUtil.adminLogin(
AdminFixture.createHqAdmin(permissionLevel = AdminPermissionLevel.WRITABLE) AdminFixture.createHqAdmin(permissionLevel = AdminPermissionLevel.WRITABLE)
) )
@ -696,12 +607,12 @@ class ThemeApiTest(
test("입력값이 없으면 수정하지 않는다.") { test("입력값이 없으면 수정하지 않는다.") {
val createdTheme: ThemeEntity = dummyInitializer.createTheme( val createdTheme: ThemeEntity = dummyInitializer.createTheme(
adminToken = authUtil.defaultHqAdminLogin(), adminToken = testAuthUtil.defaultHqAdminLogin(),
request = createRequest.copy(name = "theme-${Random.nextInt()}") request = createRequest.copy(name = "theme-${Random.nextInt()}")
) )
runTest( runTest(
token = authUtil.defaultHqAdminLogin(), token = testAuthUtil.defaultHqAdminLogin(),
using = { using = {
body(ThemeUpdateRequest()) body(ThemeUpdateRequest())
}, },
@ -721,7 +632,7 @@ class ThemeApiTest(
test("테마가 없으면 실패한다.") { test("테마가 없으면 실패한다.") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultHqAdminLogin(), token = testAuthUtil.defaultHqAdminLogin(),
method = HttpMethod.PATCH, method = HttpMethod.PATCH,
endpoint = "/admin/themes/$INVALID_PK", endpoint = "/admin/themes/$INVALID_PK",
requestBody = updateRequest, requestBody = updateRequest,
@ -730,7 +641,7 @@ class ThemeApiTest(
} }
test("금액이 ${MIN_PRICE}원 미만이면 실패한다.") { test("금액이 ${MIN_PRICE}원 미만이면 실패한다.") {
val adminToken = authUtil.defaultHqAdminLogin() val adminToken = testAuthUtil.defaultHqAdminLogin()
val createdTheme: ThemeEntity = dummyInitializer.createTheme( val createdTheme: ThemeEntity = dummyInitializer.createTheme(
adminToken = adminToken, adminToken = adminToken,
request = createRequest.copy(name = "theme-${Random.nextInt()}") request = createRequest.copy(name = "theme-${Random.nextInt()}")
@ -750,7 +661,7 @@ class ThemeApiTest(
lateinit var createdTheme: ThemeEntity lateinit var createdTheme: ThemeEntity
beforeTest { beforeTest {
adminToken = authUtil.defaultHqAdminLogin() adminToken = testAuthUtil.defaultHqAdminLogin()
createdTheme = dummyInitializer.createTheme( createdTheme = dummyInitializer.createTheme(
adminToken = adminToken, adminToken = adminToken,
request = createRequest.copy(name = "theme-${Random.nextInt()}") request = createRequest.copy(name = "theme-${Random.nextInt()}")
@ -793,7 +704,7 @@ class ThemeApiTest(
lateinit var createdTheme: ThemeEntity lateinit var createdTheme: ThemeEntity
beforeTest { beforeTest {
adminToken = authUtil.defaultHqAdminLogin() adminToken = testAuthUtil.defaultHqAdminLogin()
createdTheme = dummyInitializer.createTheme( createdTheme = dummyInitializer.createTheme(
adminToken = adminToken, adminToken = adminToken,
request = createRequest.copy(name = "theme-${Random.nextInt()}") request = createRequest.copy(name = "theme-${Random.nextInt()}")
@ -834,7 +745,7 @@ class ThemeApiTest(
lateinit var createdTheme: ThemeEntity lateinit var createdTheme: ThemeEntity
beforeTest { beforeTest {
adminToken = authUtil.defaultHqAdminLogin() adminToken = testAuthUtil.defaultHqAdminLogin()
createdTheme = dummyInitializer.createTheme( createdTheme = dummyInitializer.createTheme(
adminToken = adminToken, adminToken = adminToken,
request = createRequest.copy(name = "theme-${Random.nextInt()}") request = createRequest.copy(name = "theme-${Random.nextInt()}")
@ -867,7 +778,7 @@ class ThemeApiTest(
lateinit var createdTheme: ThemeEntity lateinit var createdTheme: ThemeEntity
beforeTest { beforeTest {
adminToken = authUtil.defaultHqAdminLogin() adminToken = testAuthUtil.defaultHqAdminLogin()
createdTheme = dummyInitializer.createTheme( createdTheme = dummyInitializer.createTheme(
adminToken = adminToken, adminToken = adminToken,
request = createRequest.copy(name = "theme-${Random.nextInt()}") request = createRequest.copy(name = "theme-${Random.nextInt()}")

View File

@ -145,7 +145,7 @@ class UserApiTest(
test("관리자") { test("관리자") {
runExceptionTest( runExceptionTest(
token = authUtil.defaultStoreAdminLogin(), token = testAuthUtil.defaultStoreAdminLogin(),
method = HttpMethod.GET, method = HttpMethod.GET,
endpoint = endpoint, endpoint = endpoint,
expectedErrorCode = AuthErrorCode.ACCESS_DENIED expectedErrorCode = AuthErrorCode.ACCESS_DENIED
@ -154,8 +154,8 @@ class UserApiTest(
} }
test("정상 응답") { test("정상 응답") {
val user = authUtil.defaultUser() val user = testAuthUtil.defaultUser()
val token = authUtil.userLogin(user) val token = testAuthUtil.userLogin(user)
runTest( runTest(
token = token, token = token,