diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeCompleteResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeCompleteResponse.kt index 0ec64366..45e79298 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeCompleteResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeCompleteResponse.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.can.charge import java.math.BigDecimal data class ChargeCompleteResponse( + val chargeId: Long, val price: BigDecimal, val currencyCode: String, val isFirstCharged: Boolean, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt index e6e6eeb7..cddda81b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeService.kt @@ -716,6 +716,7 @@ class ChargeService( private fun completeResponse(charge: Charge): ChargeCompleteResponse { return ChargeCompleteResponse( + chargeId = charge.id!!, price = charge.payment!!.price, currencyCode = charge.payment!!.locale?.takeLast(3) ?: "KRW", isFirstCharged = charge.isFirstCharged == true, diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeControllerIntegrationTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeControllerIntegrationTest.kt index c674ad09..747e6724 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeControllerIntegrationTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/can/charge/ChargeControllerIntegrationTest.kt @@ -130,7 +130,7 @@ class ChargeControllerIntegrationTest @Autowired constructor( @ParameterizedTest @EnumSource(VerificationPath::class) - @DisplayName("다섯 완료 HTTP 경로는 실제 서비스 결과의 네 필드와 기존 envelope를 반환한다") + @DisplayName("다섯 완료 HTTP 경로는 저장된 충전 ID와 완료 정보 및 기존 envelope를 반환한다") fun shouldReturnChargeCompleteDataForAllFiveVerificationEndpoints(path: VerificationPath) { val owner = createMember(container = if (path.isIap) "web" else "ios") val chargeId = if (path == VerificationPath.GOOGLE) { @@ -143,10 +143,10 @@ class ChargeControllerIntegrationTest @Autowired constructor( val data = successData(post(path.path, verificationRequest(path, chargeId ?: 0), token(owner))) - assertCompletion(data, first = true, iap = path.isIap) + val expectedChargeId = chargeId ?: transactionTemplate.execute { chargeRepository.findAll().single().id!! }!! + assertCompletion(data, chargeId = expectedChargeId, first = true, iap = path.isIap) if (chargeId == null) { - val createdId = transactionTemplate.execute { chargeRepository.findAll().single().id!! }!! - assertCompleted(createdId, owner.id!!, PaymentGateway.GOOGLE_IAP, listOf(0, 0, 100, 0, 0, 0)) + assertCompleted(expectedChargeId, owner.id!!, PaymentGateway.GOOGLE_IAP, listOf(0, 0, 100, 0, 0, 0)) Mockito.verify(googlePlayService).verifyAndConsumePurchase("http-purchase", "http-product") Mockito.verifyNoInteractions(bootpay, okHttpClient) } else { @@ -170,6 +170,7 @@ class ChargeControllerIntegrationTest @Autowired constructor( repeat(2) { assertCompletion( successData(post(path.path, verificationRequest(path, chargeId), bearer)), + chargeId = chargeId, first = expected, iap = path.isIap ) @@ -191,10 +192,11 @@ class ChargeControllerIntegrationTest @Autowired constructor( val legacyBefore = storedState(legacyId, owner.id!!) allowGooglePurchase() - assertCompletion(successData(post("/charge/google", googleRequest(), token(owner))), first = false, iap = true) + val data = successData(post("/charge/google", googleRequest(), token(owner))) transactionTemplate.executeWithoutResult { val created = chargeRepository.findAll().single { it.id != legacyId } + assertCompletion(data, chargeId = created.id!!, first = false, iap = true) assertEquals(false, created.isFirstCharged) assertEquals(PaymentStatus.COMPLETE, created.payment!!.status) assertEquals("http-google-order", created.payment!!.orderId) @@ -265,6 +267,7 @@ class ChargeControllerIntegrationTest @Autowired constructor( val chargeId = createCharge(owner, PaymentGateway.PG, first = true) assertCompletion( successData(post("/charge/verify", VerifyRequest("http-receipt", "$chargeId"), token(owner))), + chargeId = chargeId, first = true, iap = false ) @@ -352,6 +355,7 @@ class ChargeControllerIntegrationTest @Autowired constructor( val completed = storedState(chargeId, owner.id!!) assertCompletion( successData(post("/charge/payverse/verify", PayverseVerifyRequest("http-tid", "$chargeId"), token(owner))), + chargeId = chargeId, first = true, iap = false ) @@ -453,8 +457,13 @@ class ChargeControllerIntegrationTest @Autowired constructor( return body["data"] } - private fun assertCompletion(data: JsonNode, first: Boolean, iap: Boolean) { - assertEquals(setOf("price", "currencyCode", "isFirstCharged", "isIap"), data.fieldNames().asSequence().toSet()) + private fun assertCompletion(data: JsonNode, chargeId: Long, first: Boolean, iap: Boolean) { + assertEquals( + setOf("chargeId", "price", "currencyCode", "isFirstCharged", "isIap"), + data.fieldNames().asSequence().toSet() + ) + assertEquals(true, data["chargeId"].isIntegralNumber) + assertEquals(chargeId, data["chargeId"].longValue()) assertEquals(true, data["price"].isNumber) assertEquals(0, BigDecimal("9.99").compareTo(data["price"].decimalValue())) assertEquals("USD", data["currencyCode"].textValue())