From 385f98fb21bb100a77c1bf36f93ea46f8f99f3db Mon Sep 17 00:00:00 2001 From: pricelees Date: Thu, 16 Oct 2025 15:29:34 +0900 Subject: [PATCH] =?UTF-8?q?test:=20PaymentServiceTest=EC=97=90=20=EA=B2=B0?= =?UTF-8?q?=EC=A0=9C=20=EC=88=98=EB=8B=A8=EB=B3=84=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/payment/PaymentServiceTest.kt | 104 ++++++++++++++---- 1 file changed, 82 insertions(+), 22 deletions(-) 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 + } }