[#66] 결제 & 예약 확정 로직 수정 #67

Merged
pricelees merged 17 commits from refactor/#66 into main 2025-10-17 04:59:12 +00:00
Showing only changes of commit 385f98fb21 - Show all commits

View File

@ -2,10 +2,11 @@ package com.sangdol.roomescape.payment
import com.ninjasquad.springmockk.MockkBean import com.ninjasquad.springmockk.MockkBean
import com.sangdol.roomescape.payment.business.PaymentService import com.sangdol.roomescape.payment.business.PaymentService
import com.sangdol.roomescape.payment.business.domain.PaymentMethod import com.sangdol.roomescape.payment.business.domain.*
import com.sangdol.roomescape.payment.business.domain.UserFacingPaymentErrorCode
import com.sangdol.roomescape.payment.business.event.PaymentEvent import com.sangdol.roomescape.payment.business.event.PaymentEvent
import com.sangdol.roomescape.payment.business.event.PaymentEventListener import com.sangdol.roomescape.payment.business.event.PaymentEventListener
import com.sangdol.roomescape.payment.dto.PaymentConfirmRequest
import com.sangdol.roomescape.payment.dto.PaymentGatewayResponse
import com.sangdol.roomescape.payment.exception.ExternalPaymentException import com.sangdol.roomescape.payment.exception.ExternalPaymentException
import com.sangdol.roomescape.payment.exception.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentErrorCode
import com.sangdol.roomescape.payment.exception.PaymentException import com.sangdol.roomescape.payment.exception.PaymentException
@ -31,31 +32,67 @@ class PaymentServiceTest(
context("결제를 승인한다.") { context("결제를 승인한다.") {
val request = PaymentFixture.confirmRequest val request = PaymentFixture.confirmRequest
test("결제 정상 승인 및 이벤트 발행 확인") { context("결제 정상 승인 및 이벤트 발행 확인") {
test("간편결제 + 카드") {
val tosspayAPIResponse = PaymentFixture.confirmResponse( val tosspayAPIResponse = PaymentFixture.confirmResponse(
paymentKey = request.paymentKey, paymentKey = request.paymentKey,
amount = request.amount, amount = request.amount,
orderId = request.orderId, orderId = request.orderId,
method = PaymentMethod.CARD method = PaymentMethod.EASY_PAY,
cardDetail = PaymentFixture.cardDetail(100_000),
easyPayDetail = PaymentFixture.easypayDetail(0)
) )
val paymentEventSlot = slot<PaymentEvent>() runSuccessTest(request, tosspayAPIResponse) {
assertSoftly(it.detail) {
this::class shouldBe EasypayCardPaymentDetail::class
}
}
}
every { test("간편결제 - 충전식") {
tosspayClient.confirm(request.paymentKey, request.orderId, request.amount) val tosspayAPIResponse = PaymentFixture.confirmResponse(
} returns tosspayAPIResponse paymentKey = request.paymentKey,
amount = request.amount,
orderId = request.orderId,
method = PaymentMethod.EASY_PAY,
)
every { runSuccessTest(request, tosspayAPIResponse) {
paymentEventListener.handlePaymentEvent(capture(paymentEventSlot)) assertSoftly(it.detail) {
} just runs this::class shouldBe EasypayPrepaidPaymentDetail::class
}
}
}
paymentService.requestConfirm(12345L, request) test("카드") {
val tosspayAPIResponse = PaymentFixture.confirmResponse(
paymentKey = request.paymentKey,
amount = request.amount,
orderId = request.orderId,
method = PaymentMethod.CARD,
)
assertSoftly(paymentEventSlot.captured) { runSuccessTest(request, tosspayAPIResponse) {
this.paymentKey shouldBe request.paymentKey assertSoftly(it.detail) {
this.orderId shouldBe request.orderId this::class shouldBe CardPaymentDetail::class
this.totalAmount shouldBe request.amount }
this.method shouldBe PaymentMethod.CARD }
}
test("계좌이체") {
val tosspayAPIResponse = PaymentFixture.confirmResponse(
paymentKey = request.paymentKey,
amount = request.amount,
orderId = request.orderId,
method = PaymentMethod.TRANSFER,
)
runSuccessTest(request, tosspayAPIResponse) {
assertSoftly(it.detail) {
this::class shouldBe BankTransferPaymentDetail::class
}
}
} }
} }
@ -122,4 +159,27 @@ class PaymentServiceTest(
} }
} }
} }
private fun runSuccessTest(request: PaymentConfirmRequest, tosspayAPIResponse: PaymentGatewayResponse, additionalAssertion: (PaymentEvent) -> Unit): PaymentEvent {
val paymentEventSlot = slot<PaymentEvent>()
every {
tosspayClient.confirm(request.paymentKey, request.orderId, request.amount)
} returns tosspayAPIResponse
every {
paymentEventListener.handlePaymentEvent(capture(paymentEventSlot))
} just runs
paymentService.requestConfirm(12345L, request)
assertSoftly(paymentEventSlot.captured) {
this.paymentKey shouldBe request.paymentKey
this.orderId shouldBe request.orderId
this.totalAmount shouldBe request.amount
this.method shouldBe tosspayAPIResponse.method
}
return paymentEventSlot.captured
}
} }