Skip to content

Commit

Permalink
Merge pull request #13 from FIAP-3SOAT-G15/add-tests
Browse files Browse the repository at this point in the history
Add tests
  • Loading branch information
wellyfrs authored May 19, 2024
2 parents 60a9cc4 + 69037b1 commit 0cafe7c
Show file tree
Hide file tree
Showing 22 changed files with 1,172 additions and 224 deletions.
35 changes: 35 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,21 @@
<java.version>17</java.version>
<kotlin.version>1.8.22</kotlin.version>
<kotlin.compiler.jvmTarget>17</kotlin.compiler.jvmTarget>

<org.mapstruct.version>1.5.3.Final</org.mapstruct.version>
<testcontainers.version>1.19.1</testcontainers.version>

<skipITs>true</skipITs>
<skipOpenAPIGen>true</skipOpenAPIGen>

<sonar.organization>fiap-3soat-g15</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
<sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
<sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis>
<sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
<sonar.language>kotlin</sonar.language>
<sonar.verbose>true</sonar.verbose>

<aws.java.sdk.version>1.12.724</aws.java.sdk.version>
</properties>
<dependencies>
Expand Down Expand Up @@ -373,6 +377,37 @@
<skip>${skipOpenAPIGen}</skip>
</configuration>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
<version>0.8.12</version>
<configuration>
<excludes>
<exclude>**/*Config.*</exclude>
<exclude>**/*Mapper.*</exclude>
</excludes>
</configuration>
<executions>
<execution>
<id>prepare-agent</id>
<goals>
<goal>prepare-agent</goal>
</goals>
</execution>
<execution>
<id>report</id>
<phase>verify</phase>
<goals>
<goal>report</goal>
</goals>
<configuration>
<formats>
<format>XML</format>
</formats>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
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 0cafe7c

Please sign in to comment.