From 4dc11e5bfd2da07259a2f84f02110303134c0abd Mon Sep 17 00:00:00 2001 From: jangjunha Date: Thu, 14 Sep 2023 12:28:11 +0900 Subject: [PATCH] test: order-service messaging provider test --- ftgo-order-service/build.gradle | 8 ++ .../OrderMessagingPactProviderTest.kt | 94 +++++++++++++++++++ .../src/test/resources/application.yml | 9 ++ ftgo-pact/build.gradle.kts | 25 +++++ .../junitsupport/filter/ByInteractionType.kt | 23 +++++ settings.gradle | 2 + 6 files changed, 161 insertions(+) create mode 100644 ftgo-order-service/src/test/kotlin/me/jangjunha/ftgo/order_service/OrderMessagingPactProviderTest.kt create mode 100644 ftgo-order-service/src/test/resources/application.yml create mode 100644 ftgo-pact/build.gradle.kts create mode 100644 ftgo-pact/src/main/kotlin/me/jangjunha/ftgo/pact/provider/junitsupport/filter/ByInteractionType.kt diff --git a/ftgo-order-service/build.gradle b/ftgo-order-service/build.gradle index 8b05f6f..a61420d 100644 --- a/ftgo-order-service/build.gradle +++ b/ftgo-order-service/build.gradle @@ -57,6 +57,14 @@ dependencies { testImplementation 'org.jetbrains.kotlin:kotlin-test' testImplementation "io.eventuate.tram.core:eventuate-tram-test-util" testImplementation "io.eventuate.tram.sagas:eventuate-tram-sagas-spring-testing-support" + testImplementation 'au.com.dius.pact.provider:junit5spring:4.6.2' + testImplementation(project(':ftgo-pact')) { + capabilities { + requireCapability("me.jangjunha.ftgo:ftgo-pact-provider") + } + } + testImplementation 'io.eventuate.tram.core:eventuate-tram-spring-in-memory' + testRuntimeOnly 'com.h2database:h2' integrationTestImplementation 'io.eventuate.tram.core:eventuate-tram-spring-in-memory' integrationTestImplementation ("org.springframework.boot:spring-boot-starter-test:$springBootVersion") { diff --git a/ftgo-order-service/src/test/kotlin/me/jangjunha/ftgo/order_service/OrderMessagingPactProviderTest.kt b/ftgo-order-service/src/test/kotlin/me/jangjunha/ftgo/order_service/OrderMessagingPactProviderTest.kt new file mode 100644 index 0000000..951fd2d --- /dev/null +++ b/ftgo-order-service/src/test/kotlin/me/jangjunha/ftgo/order_service/OrderMessagingPactProviderTest.kt @@ -0,0 +1,94 @@ +package me.jangjunha.ftgo.order_service + +import au.com.dius.pact.core.model.Interaction +import au.com.dius.pact.core.model.Pact +import au.com.dius.pact.provider.MessageAndMetadata +import au.com.dius.pact.provider.PactVerifyProvider +import au.com.dius.pact.provider.junit5.MessageTestTarget +import au.com.dius.pact.provider.junit5.PactVerificationContext +import au.com.dius.pact.provider.junit5.PactVerificationInvocationContextProvider +import au.com.dius.pact.provider.junitsupport.Provider +import au.com.dius.pact.provider.junitsupport.loader.PactBroker +import au.com.dius.pact.provider.junitsupport.loader.PactFilter +import io.eventuate.common.json.mapper.JSonMapper +import me.jangjunha.ftgo.common.Money +import me.jangjunha.ftgo.order_service.api.OrderDetails +import me.jangjunha.ftgo.order_service.api.events.OrderAuthorized +import me.jangjunha.ftgo.order_service.api.events.OrderCreated +import me.jangjunha.ftgo.order_service.api.events.OrderRejected +import me.jangjunha.ftgo.pact.provider.junitsupport.filter.ByInteractionType +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.TestTemplate +import org.junit.jupiter.api.extension.ExtendWith +import java.util.* + + +@Provider("ftgo-order-service") +@PactFilter(value = ["Message"], filter = ByInteractionType::class) +@PactBroker(url = "https://pact.ftgo.jangjunha.me/") +class OrderMessagingPactProviderTest { + + @TestTemplate + @ExtendWith(PactVerificationInvocationContextProvider::class) + fun testTemplate(pact: Pact, interaction: Interaction, context: PactVerificationContext) { + context.verifyInteraction() + } + + @BeforeEach + fun setUp(context: PactVerificationContext) { + context.target = MessageTestTarget() + } + + @PactVerifyProvider("`OrderCreated` event") + fun orderCreatedEvent(): MessageAndMetadata { + val event = OrderCreated( + OrderDetails( + listOf( + OrderDetails.LineItem(2, "americano", "Americano", Money("2500")), + ), + Money("5000"), + UUID.fromString("97e3c4c2-f336-4435-9314-ad1a633495df"), + UUID.fromString("627a9a8a-41af-4daf-a968-00ffc80b53ad") + ), + "서울시 강남구 테헤란로 1", + "A Cafe" + ) + return MessageAndMetadata( + JSonMapper.toJson(event).toByteArray(), + mapOf( + Pair("event-type", "me.jangjunha.ftgo.order_service.api.events.OrderCreated"), + Pair("event-aggregate-type", "me.jangjunha.ftgo.order_service.domain.Order"), + Pair("event-aggregate-id", "6f2d06a3-5dd2-4096-8644-6084d64eae35"), + Pair("ID", ""), + ), + ) + } + + @PactVerifyProvider("`OrderAuthorized` event") + fun orderAuthorizedEvent(): MessageAndMetadata { + val event = OrderAuthorized() + return MessageAndMetadata( + JSonMapper.toJson(event).toByteArray(), + mapOf( + Pair("event-type", "me.jangjunha.ftgo.order_service.api.events.OrderAuthorized"), + Pair("event-aggregate-type", "me.jangjunha.ftgo.order_service.domain.Order"), + Pair("event-aggregate-id", "6f2d06a3-5dd2-4096-8644-6084d64eae35"), + Pair("ID", ""), + ), + ) + } + + @PactVerifyProvider("`OrderRejected` event") + fun orderRejectedEvent(): MessageAndMetadata { + val event = OrderRejected() + return MessageAndMetadata( + JSonMapper.toJson(event).toByteArray(), + mapOf( + Pair("event-type", "me.jangjunha.ftgo.order_service.api.events.OrderRejected"), + Pair("event-aggregate-type", "me.jangjunha.ftgo.order_service.domain.Order"), + Pair("event-aggregate-id", "6f2d06a3-5dd2-4096-8644-6084d64eae35"), + Pair("ID", ""), + ), + ) + } +} diff --git a/ftgo-order-service/src/test/resources/application.yml b/ftgo-order-service/src/test/resources/application.yml new file mode 100644 index 0000000..f4921a9 --- /dev/null +++ b/ftgo-order-service/src/test/resources/application.yml @@ -0,0 +1,9 @@ +spring: + datasource: + url: jdbc:h2:mem:db + driver-class-name: org.h2.Driver +grpc: + server: + port: 0 +pactbroker: + url: https://pact.ftgo.jangjunha.me/ diff --git a/ftgo-pact/build.gradle.kts b/ftgo-pact/build.gradle.kts new file mode 100644 index 0000000..7b3fbef --- /dev/null +++ b/ftgo-pact/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + `java-library` + id("org.jetbrains.kotlin.jvm") +} + +group = "me.jangjunha.ftgo" +version = "unspecified" + +java { + registerFeature("provider") { + usingSourceSet(sourceSets["main"]) + } +} + +repositories { + mavenCentral() +} + +dependencies { + "providerApi"("au.com.dius.pact:provider:4.6.2") +} + +tasks.test { + useJUnitPlatform() +} diff --git a/ftgo-pact/src/main/kotlin/me/jangjunha/ftgo/pact/provider/junitsupport/filter/ByInteractionType.kt b/ftgo-pact/src/main/kotlin/me/jangjunha/ftgo/pact/provider/junitsupport/filter/ByInteractionType.kt new file mode 100644 index 0000000..9bbda34 --- /dev/null +++ b/ftgo-pact/src/main/kotlin/me/jangjunha/ftgo/pact/provider/junitsupport/filter/ByInteractionType.kt @@ -0,0 +1,23 @@ +package me.jangjunha.ftgo.pact.provider.junitsupport.filter + +import au.com.dius.pact.core.model.Interaction +import au.com.dius.pact.core.model.SynchronousRequestResponse +import au.com.dius.pact.core.model.V4Interaction +import au.com.dius.pact.core.model.messaging.Message +import au.com.dius.pact.provider.junitsupport.filter.InteractionFilter +import java.util.function.Predicate + +class ByInteractionType : InteractionFilter { + override fun buildPredicate(values: Array): Predicate { + return Predicate { interaction: I -> + values.any { value -> + when (value) { + "Http" -> interaction is SynchronousRequestResponse + "V4Http" -> interaction is V4Interaction.SynchronousHttp + "Message" -> interaction is Message + else -> false + } + } + } + } +} diff --git a/settings.gradle b/settings.gradle index 0b14b98..cc90904 100644 --- a/settings.gradle +++ b/settings.gradle @@ -19,3 +19,5 @@ include 'ftgo-order-service' include 'eventuate-tram-producer-kafka' include 'ftgo-order-history-service' include 'ftgo-api-gateway' +include 'ftgo-pact' +