Skip to content

Commit

Permalink
Add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
wellyfrs committed May 19, 2024
1 parent 60a9cc4 commit 91a89a9
Show file tree
Hide file tree
Showing 21 changed files with 1,137 additions and 224 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,24 @@ class PaymentController(
return ResponseEntity.ok(loadPaymentUseCase.findAll())
}

override fun getByPaymentId(id: String): ResponseEntity<Payment> {
return ResponseEntity.ok(loadPaymentUseCase.getByPaymentId(id))
override fun getByPaymentId(paymentId: String): ResponseEntity<Payment> {
return ResponseEntity.ok(loadPaymentUseCase.getByPaymentId(paymentId))
}

override fun create(paymentHTTPRequest: PaymentHTTPRequest): ResponseEntity<Payment> {
return ResponseEntity.ok(providePaymentRequestUseCase.providePaymentRequest(paymentHTTPRequest))
}

override fun fail(paymentId: String): ResponseEntity<Payment> {
return ResponseEntity.ok(changePaymentStatusUseCase.failPayment(paymentId))
}

override fun expire(paymentId: String): ResponseEntity<Payment> {
return ResponseEntity.ok(changePaymentStatusUseCase.expirePayment(paymentId))
}

override fun confirm(paymentId: String): ResponseEntity<Payment> {
return ResponseEntity.ok(changePaymentStatusUseCase.confirmPayment(paymentId))
}

/**
Expand Down Expand Up @@ -57,22 +73,6 @@ class PaymentController(
}
}

override fun create(paymentHTTPRequest: PaymentHTTPRequest): ResponseEntity<Payment> {
return ResponseEntity.ok(providePaymentRequestUseCase.providePaymentRequest(paymentHTTPRequest))
}

override fun fail(paymentId: String): ResponseEntity<Payment> {
return ResponseEntity.ok(changePaymentStatusUseCase.failPayment(paymentId))
}

override fun expire(paymentId: String): ResponseEntity<Payment> {
return ResponseEntity.ok(changePaymentStatusUseCase.expirePayment(paymentId))
}

override fun confirm(paymentId: String): ResponseEntity<Payment> {
return ResponseEntity.ok(changePaymentStatusUseCase.confirmPayment(paymentId))
}

enum class IPNType(val ipnType: String) {
MERCHANT_ORDER("merchant_order"),
PAYMENT("payment"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,4 @@ class ServiceConfig {
orderGateway
)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,6 @@ class JWTSecurityConfig {
csrf.disable()
}
.authorizeHttpRequests { authorize ->
// TODO
authorize.requestMatchers(HttpMethod.POST, "/orders").permitAll()
authorize.anyRequest().permitAll()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,14 @@ import org.springframework.context.annotation.Configuration
@Configuration
@ComponentScan(basePackageClasses = [PaymentsApiApp::class])
class PaymentGatewayConfig {

@Bean("PaymentProvider")
@ConditionalOnProperty("payment-provider.mock", havingValue = "false")
fun createPaymentProvider(
mercadoPagoClient: MercadoPagoClient,
@Value("\${mercadopago.integration.webhookBaseUrl}") webhookBaseUrl: String,
): PaymentProviderGateway {
return MercadoPagoPaymentProvider(
mercadoPagoClient,
webhookBaseUrl,
)
return MercadoPagoPaymentProvider(mercadoPagoClient, webhookBaseUrl)
}

@Bean("PaymentProvider")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ class MercadoPagoPaymentProvider(
private val mercadoPagoClient: MercadoPagoClient,
private val webhookBaseUrl: String,
) : PaymentProviderGateway {

override fun createExternalOrder(paymentId: String, paymentHTTPRequest: PaymentHTTPRequest): PaymentRequest {
// source_news=ipn indicates application will receive only Instant Payment Notifications (IPNs), not webhooks
val notificationUrl = "${webhookBaseUrl}/payments/notifications/${paymentId}?source_news=ipn"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package com.fiap.payments.usecases
import com.fiap.payments.domain.entities.Payment

interface LoadPaymentUseCase {
fun getByPaymentId(id: String): Payment
fun getByPaymentId(paymentId: String): Payment

fun findAll(): List<Payment>

fun findByPaymentId(id: String): Payment?
fun findByPaymentId(paymentId: String): Payment?
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,21 +24,18 @@ class PaymentService(
{
private val log = LoggerFactory.getLogger(javaClass)

override fun getByPaymentId(id: String): Payment {
return paymentGateway.findByPaymentId(id)
override fun getByPaymentId(paymentId: String): Payment =
paymentGateway.findByPaymentId(paymentId)
?: throw PaymentsException(
errorType = ErrorType.PAYMENT_NOT_FOUND,
message = "Payment [$id] not found",
message = "Payment [$paymentId] not found",
)
}

override fun findByPaymentId(id: String): Payment? {
return paymentGateway.findByPaymentId(id)
}
override fun findByPaymentId(paymentId: String): Payment? =
paymentGateway.findByPaymentId(paymentId)

override fun findAll(): List<Payment> {
return paymentGateway.findAll()
}
override fun findAll(): List<Payment> =
paymentGateway.findAll()

override fun providePaymentRequest(paymentHTTPRequest: PaymentHTTPRequest): Payment {
var payment = Payment(
Expand All @@ -64,52 +61,30 @@ class PaymentService(
}

override fun confirmPayment(paymentId: String): Payment {
return getByPaymentId(paymentId)
.takeIf { it.status == PaymentStatus.PENDING }
?.let { payment ->
log.info("Confirming payment $payment")
val confirmedPayment = paymentGateway.upsert(payment.copy(
status = PaymentStatus.CONFIRMED,
statusChangedAt = LocalDateTime.now()
))
confirmOrderUseCase.confirmOrder(confirmedPayment.orderNumber)
confirmedPayment
}
?: throw PaymentsException(
errorType = ErrorType.INVALID_PAYMENT_STATE_TRANSITION,
message = "Payment can only be confirmed when it is pending",
)
val confirmedPayment = changePaymentStatus(paymentId = paymentId, newStatus = PaymentStatus.FAILED)
confirmOrderUseCase.confirmOrder(confirmedPayment.orderNumber)
return confirmedPayment
}

override fun failPayment(paymentId: String): Payment {
return getByPaymentId(paymentId)
.takeIf { it.status == PaymentStatus.PENDING }
?.let { payment ->
log.info("Failing payment $payment")
paymentGateway.upsert(payment.copy(
status = PaymentStatus.FAILED,
statusChangedAt = LocalDateTime.now()
))
}
?: throw PaymentsException(
errorType = ErrorType.INVALID_PAYMENT_STATE_TRANSITION,
message = "Payment can only be failed when it is pending",
)
}
override fun failPayment(paymentId: String): Payment =
changePaymentStatus(paymentId = paymentId, newStatus = PaymentStatus.FAILED)

override fun expirePayment(paymentId: String): Payment {
return getByPaymentId(paymentId)
override fun expirePayment(paymentId: String): Payment =
changePaymentStatus(paymentId = paymentId, newStatus = PaymentStatus.EXPIRED)

private fun changePaymentStatus(paymentId: String, newStatus: PaymentStatus): Payment =
getByPaymentId(paymentId)
.takeIf { it.status == PaymentStatus.PENDING }
?.let { payment ->
log.info("Expiring payment $payment")
paymentGateway.upsert(payment.copy(
status = PaymentStatus.EXPIRED,
log.info("Changing status of payment $payment to $newStatus")
val changedPayment = paymentGateway.upsert(payment.copy(
status = newStatus,
statusChangedAt = LocalDateTime.now()
))
changedPayment
}
?: throw PaymentsException(
errorType = ErrorType.INVALID_PAYMENT_STATE_TRANSITION,
message = "Payment can only be expired when it is pending",
message = "Cannot change status of non-pending payment",
)
}
}
66 changes: 0 additions & 66 deletions src/test/kotlin/TestFixtures.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
package com.fiap.payments

import org.junit.jupiter.api.Tag
import org.springframework.test.context.ActiveProfiles

Expand Down
Loading

0 comments on commit 91a89a9

Please sign in to comment.