diff --git a/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentServiceTest.kt b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentServiceTest.kt index c1a20307..b1973107 100644 --- a/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentServiceTest.kt +++ b/service/src/test/kotlin/com/sangdol/roomescape/payment/PaymentServiceTest.kt @@ -2,10 +2,11 @@ package com.sangdol.roomescape.payment import com.ninjasquad.springmockk.MockkBean import com.sangdol.roomescape.payment.business.PaymentService -import com.sangdol.roomescape.payment.business.domain.PaymentMethod -import com.sangdol.roomescape.payment.business.domain.UserFacingPaymentErrorCode +import com.sangdol.roomescape.payment.business.domain.* import com.sangdol.roomescape.payment.business.event.PaymentEvent 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.PaymentErrorCode import com.sangdol.roomescape.payment.exception.PaymentException @@ -31,31 +32,67 @@ class PaymentServiceTest( context("결제를 승인한다.") { val request = PaymentFixture.confirmRequest - test("결제 정상 승인 및 이벤트 발행 확인") { - val tosspayAPIResponse = PaymentFixture.confirmResponse( - paymentKey = request.paymentKey, - amount = request.amount, - orderId = request.orderId, - method = PaymentMethod.CARD - ) + context("결제 정상 승인 및 이벤트 발행 확인") { + test("간편결제 + 카드") { + val tosspayAPIResponse = PaymentFixture.confirmResponse( + paymentKey = request.paymentKey, + amount = request.amount, + orderId = request.orderId, + method = PaymentMethod.EASY_PAY, + cardDetail = PaymentFixture.cardDetail(100_000), + easyPayDetail = PaymentFixture.easypayDetail(0) + ) - val paymentEventSlot = slot() + runSuccessTest(request, tosspayAPIResponse) { + assertSoftly(it.detail) { + this::class shouldBe EasypayCardPaymentDetail::class + } + } + } - every { - tosspayClient.confirm(request.paymentKey, request.orderId, request.amount) - } returns tosspayAPIResponse + test("간편결제 - 충전식") { + val tosspayAPIResponse = PaymentFixture.confirmResponse( + paymentKey = request.paymentKey, + amount = request.amount, + orderId = request.orderId, + method = PaymentMethod.EASY_PAY, + ) - every { - paymentEventListener.handlePaymentEvent(capture(paymentEventSlot)) - } just runs + runSuccessTest(request, tosspayAPIResponse) { + assertSoftly(it.detail) { + 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) { - this.paymentKey shouldBe request.paymentKey - this.orderId shouldBe request.orderId - this.totalAmount shouldBe request.amount - this.method shouldBe PaymentMethod.CARD + runSuccessTest(request, tosspayAPIResponse) { + assertSoftly(it.detail) { + this::class shouldBe CardPaymentDetail::class + } + } + } + + 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() + + 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 + } }