diff --git a/src/test/kotlin/roomescape/supports/DummyInitializer.kt b/src/test/kotlin/roomescape/supports/DummyInitializer.kt index 90c9b082..ba368664 100644 --- a/src/test/kotlin/roomescape/supports/DummyInitializer.kt +++ b/src/test/kotlin/roomescape/supports/DummyInitializer.kt @@ -1,11 +1,8 @@ package roomescape.supports -import io.restassured.module.kotlin.extensions.Extract -import io.restassured.module.kotlin.extensions.Given -import io.restassured.module.kotlin.extensions.When import org.springframework.data.repository.findByIdOrNull -import org.springframework.http.MediaType import roomescape.common.config.next +import roomescape.common.util.MdcPrincipalId import roomescape.payment.business.PaymentWriter import roomescape.payment.infrastructure.client.CardDetail import roomescape.payment.infrastructure.client.EasyPayDetail @@ -16,22 +13,25 @@ import roomescape.payment.infrastructure.persistence.PaymentEntity import roomescape.payment.infrastructure.persistence.PaymentRepository import roomescape.payment.web.PaymentConfirmRequest import roomescape.payment.web.PaymentWithDetailResponse -import roomescape.payment.web.toPaymentDetailResponse import roomescape.payment.web.toDetailResponse +import roomescape.payment.web.toPaymentDetailResponse import roomescape.reservation.infrastructure.persistence.ReservationEntity import roomescape.reservation.infrastructure.persistence.ReservationRepository +import roomescape.reservation.infrastructure.persistence.ReservationStatus import roomescape.reservation.web.PendingReservationCreateRequest +import roomescape.reservation.web.toEntity import roomescape.schedule.infrastructure.persistence.ScheduleEntity import roomescape.schedule.infrastructure.persistence.ScheduleRepository import roomescape.schedule.infrastructure.persistence.ScheduleStatus import roomescape.schedule.web.ScheduleCreateRequest -import roomescape.schedule.web.ScheduleUpdateRequest import roomescape.store.infrastructure.persistence.StoreEntity import roomescape.store.infrastructure.persistence.StoreRepository import roomescape.store.infrastructure.persistence.StoreStatus import roomescape.theme.infrastructure.persistence.ThemeEntity import roomescape.theme.infrastructure.persistence.ThemeRepository import roomescape.theme.web.ThemeCreateRequest +import roomescape.theme.web.toEntity +import roomescape.user.infrastructure.persistence.UserEntity import java.time.LocalDateTime class DummyInitializer( @@ -42,132 +42,109 @@ class DummyInitializer( private val paymentRepository: PaymentRepository, private val paymentWriter: PaymentWriter ) { - fun createTheme(adminToken: String, request: ThemeCreateRequest): ThemeEntity { - val createdThemeId: Long = Given { - contentType(MediaType.APPLICATION_JSON_VALUE) - header("Authorization", "Bearer $adminToken") - body(request) - } When { - post("/admin/themes") - } Extract { - path("data.id") - } - return themeRepository.findByIdOrNull(createdThemeId) - ?: throw RuntimeException("unexpected error occurred") + fun createStore( + id: Long = tsidFactory.next(), + name: String = "행복${randomPhoneNumber()}호점", + address: String = "강북구 행복로 $name", + contact: String = randomPhoneNumber(), + businessRegNum: String = randomBusinessRegNum(), + regionCode: String = "1111000000", + status: StoreStatus = StoreStatus.ACTIVE + ): StoreEntity { + return StoreEntity( + id = id, + name = name, + address = address, + contact = contact, + businessRegNum = businessRegNum, + regionCode = regionCode, + status = status + ).also { + storeRepository.save(it) + } + } + + fun createTheme( + request: ThemeCreateRequest = ThemeFixture.createRequest + ): ThemeEntity { + return request.toEntity(tsidFactory.next()).also { themeRepository.save(it) } } fun createSchedule( - adminToken: String, - request: ScheduleCreateRequest, + storeId: Long = tsidFactory.next(), + request: ScheduleCreateRequest = ScheduleFixture.createRequest, status: ScheduleStatus = ScheduleStatus.AVAILABLE ): ScheduleEntity { val themeId: Long = if (themeRepository.existsById(request.themeId)) { request.themeId } else { - createTheme( - adminToken = adminToken, - request = ThemeFixture.createRequest.copy(name = "theme-${System.currentTimeMillis()}") - ).id - } - val createdScheduleId: Long = Given { - contentType(MediaType.APPLICATION_JSON_VALUE) - header("Authorization", "Bearer $adminToken") - body(request.copy(themeId = themeId)) - } When { - post("/schedules") - } Extract { - path("data.id") + createTheme().id } - Given { - contentType(MediaType.APPLICATION_JSON_VALUE) - header("Authorization", "Bearer $adminToken") - body(ScheduleUpdateRequest(status = status)) - } When { - patch("/schedules/$createdScheduleId") + val storeId: Long = if (storeRepository.existsById(storeId)) { + storeId + } else { + createStore(id = storeId).id } - return scheduleRepository.findByIdOrNull(createdScheduleId) - ?: throw RuntimeException("unexpected error occurred") + val schedule: ScheduleEntity = ScheduleFixture.create( + date = request.date, time = request.time, storeId = storeId, themeId = themeId, + ).apply { + this.status = status + } + + return scheduleRepository.save(schedule) } fun createPendingReservation( - adminToken: String, - reserverToken: String, + user: UserEntity, themeRequest: ThemeCreateRequest = ThemeFixture.createRequest, scheduleRequest: ScheduleCreateRequest = ScheduleFixture.createRequest, reservationRequest: PendingReservationCreateRequest = ReservationFixture.pendingCreateRequest, ): ReservationEntity { val themeId: Long = if (themeRepository.existsById(scheduleRequest.themeId)) { scheduleRequest.themeId - } else if (themeRepository.existsById(reservationRequest.scheduleId)) { - reservationRequest.scheduleId } else { - createTheme( - adminToken = adminToken, - request = themeRequest - ).id + createTheme(themeRequest).id } val scheduleId: Long = if (scheduleRepository.existsById(reservationRequest.scheduleId)) { reservationRequest.scheduleId } else { createSchedule( - adminToken = adminToken, request = scheduleRequest.copy(themeId = themeId), status = ScheduleStatus.HOLD ).id } - return createPendingReservation( - reserverToken = reserverToken, - request = reservationRequest.copy(scheduleId = scheduleId) - ) + val reservation = ReservationFixture.pendingCreateRequest.copy( + scheduleId = scheduleId, + reserverName = reservationRequest.reserverName, + reserverContact = reservationRequest.reserverContact, + participantCount = reservationRequest.participantCount, + requirement = reservationRequest.requirement, + ).toEntity(id = tsidFactory.next(), userId = user.id) + + return reservationRepository.save(reservation) } fun createConfirmReservation( - adminToken: String, - reserverToken: String, + user: UserEntity, themeRequest: ThemeCreateRequest = ThemeFixture.createRequest, scheduleRequest: ScheduleCreateRequest = ScheduleFixture.createRequest, reservationRequest: PendingReservationCreateRequest = ReservationFixture.pendingCreateRequest, ): ReservationEntity { - val themeId: Long = if (themeRepository.existsById(scheduleRequest.themeId)) { - scheduleRequest.themeId - } else if (themeRepository.existsById(reservationRequest.scheduleId)) { - reservationRequest.scheduleId - } else { - createTheme( - adminToken = adminToken, - request = themeRequest - ).id + return createPendingReservation(user, themeRequest, scheduleRequest, reservationRequest).apply { + this.status = ReservationStatus.CONFIRMED + }.also { + reservationRepository.save(it) + + scheduleRepository.findByIdOrNull(it.scheduleId)?.let { schedule -> + schedule.status = ScheduleStatus.RESERVED + scheduleRepository.save(schedule) + } } - - val scheduleId: Long = if (scheduleRepository.existsById(reservationRequest.scheduleId)) { - reservationRequest.scheduleId - } else { - createSchedule( - adminToken = adminToken, - request = scheduleRequest.copy(themeId = themeId), - status = ScheduleStatus.HOLD - ).id - } - - val reservation = createPendingReservation( - reserverToken = reserverToken, - request = reservationRequest.copy(scheduleId = scheduleId) - ) - - Given { - contentType(MediaType.APPLICATION_JSON_VALUE) - header("Authorization", "Bearer $reserverToken") - } When { - post("/reservations/${reservation.id}/confirm") - } - - return reservationRepository.findByIdOrNull(reservation.id) - ?: throw RuntimeException("unexpected error occurred") } fun createPayment( @@ -228,37 +205,4 @@ class DummyInitializer( clientCancelResponse ) } - - private fun createPendingReservation( - reserverToken: String, - request: PendingReservationCreateRequest, - ): ReservationEntity { - val createdReservationId: Long = Given { - contentType(MediaType.APPLICATION_JSON_VALUE) - header("Authorization", "Bearer $reserverToken") - body(request.copy(scheduleId = request.scheduleId)) - } When { - post("/reservations/pending") - } Extract { - path("data.id") - } - - return reservationRepository.findByIdOrNull(createdReservationId) - ?: throw RuntimeException("unexpected error occurred") - } - - fun createStore(): StoreEntity { - - return StoreEntity( - id = tsidFactory.next(), - name = "Hello 매장-${System.currentTimeMillis()}", - address = "강북구 행복로 123", - contact = randomPhoneNumber(), - businessRegNum = randomBusinessRegNum(), - regionCode = "1111000000", - status = StoreStatus.ACTIVE - ).also { - storeRepository.save(it) - } - } }