From 79c591d87c1e136ecb6b51867a474a7502c14849 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Dr=C3=A4ger?= Date: Fri, 7 Dec 2018 17:10:06 +0100 Subject: [PATCH] messaging: add consumer implementation example --- consumer/pom.xml | 5 ++ .../example/demo/messaging/UserCreateEvent.kt | 18 ++++++ .../example/demo/messaging/UserDeleteEvent.kt | 6 ++ .../com/example/demo/MessagingContractTest.kt | 60 ++++++++++++++++++ ui-uploaded-and-verified.png | Bin 0 -> 32398 bytes 5 files changed, 89 insertions(+) create mode 100644 consumer/src/main/kotlin/com/example/demo/messaging/UserCreateEvent.kt create mode 100644 consumer/src/main/kotlin/com/example/demo/messaging/UserDeleteEvent.kt create mode 100644 consumer/src/test/kotlin/com/example/demo/MessagingContractTest.kt create mode 100644 ui-uploaded-and-verified.png diff --git a/consumer/pom.xml b/consumer/pom.xml index 62b3862..a24d4d8 100644 --- a/consumer/pom.xml +++ b/consumer/pom.xml @@ -34,6 +34,11 @@ khttp 0.1.0 + + com.fasterxml.jackson.module + jackson-module-kotlin + 2.9.7 + net.wuerl.kotlin assertj-core-kotlin diff --git a/consumer/src/main/kotlin/com/example/demo/messaging/UserCreateEvent.kt b/consumer/src/main/kotlin/com/example/demo/messaging/UserCreateEvent.kt new file mode 100644 index 0000000..d68b914 --- /dev/null +++ b/consumer/src/main/kotlin/com/example/demo/messaging/UserCreateEvent.kt @@ -0,0 +1,18 @@ +package com.example.demo.messaging + +import java.util.* + +data class UserCreateEvent( + val firstName: String, + val lastName: String, + val age: Int, + val active: Boolean, + val expiryDate: Date, + // val timestamp: Long, + val ids: Identifiers +) + +data class Identifiers( + val id: Long, + val uuid: UUID +) \ No newline at end of file diff --git a/consumer/src/main/kotlin/com/example/demo/messaging/UserDeleteEvent.kt b/consumer/src/main/kotlin/com/example/demo/messaging/UserDeleteEvent.kt new file mode 100644 index 0000000..e632491 --- /dev/null +++ b/consumer/src/main/kotlin/com/example/demo/messaging/UserDeleteEvent.kt @@ -0,0 +1,6 @@ +package com.example.demo.messaging + +data class UserDeleteEvent( + // val timestamp: Long, + val id: Long +) diff --git a/consumer/src/test/kotlin/com/example/demo/MessagingContractTest.kt b/consumer/src/test/kotlin/com/example/demo/MessagingContractTest.kt new file mode 100644 index 0000000..2327599 --- /dev/null +++ b/consumer/src/test/kotlin/com/example/demo/MessagingContractTest.kt @@ -0,0 +1,60 @@ +package com.example.demo + +import au.com.dius.pact.consumer.MessagePactBuilder +import au.com.dius.pact.consumer.MessagePactProviderRule +import au.com.dius.pact.consumer.Pact +import au.com.dius.pact.consumer.PactVerification +import au.com.dius.pact.model.v3.messaging.MessagePact +import com.example.demo.messaging.UserCreateEvent +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import io.pactfoundation.consumer.dsl.LambdaDsl.newJsonBody +import org.assertj.core.api.KotlinAssertions.assertThat +import org.junit.Rule +import org.junit.Test +import java.text.SimpleDateFormat + +class MessagingContractTest { + + @get:Rule + val pactRule = MessagePactProviderRule("messaging-provider", this) + + private val datePattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX" + private val sdf = SimpleDateFormat(datePattern) + private val expiryDate = sdf.parse("2017-09-16T05:25:25.000+02:00") + + @Pact(provider = "messaging-provider", consumer = "messaging-consumer") + fun createEvent(builder: MessagePactBuilder): MessagePact { + + val body = newJsonBody { body -> + body.stringType("firstName", "Christian") + body.stringValue("lastName", "Dräger") + body.numberType("age", 30) + body.booleanType("active") + //body.timestamp() + body.time("expiryDate", datePattern, expiryDate) + + body.`object`("ids") { + it.numberType("id", 1) + it.uuid("uuid") + } + }.build() + + return builder.given("a user was created") + .expectsToReceive("a create event") + .withContent(body) + .toPact() + } + + @Test + @PactVerification("messaging-provider", fragment = "createEvent") + fun canParseCreateEvent() { + val result = jacksonObjectMapper().readValue(pactRule.message, UserCreateEvent::class.java) + assertThat(result.firstName).isEqualTo("Christian") + assertThat(result.lastName).isEqualTo("Dräger") + assertThat(result.age).isEqualTo(30) + assertThat(result.active).isTrue() + assertThat(result.expiryDate).isEqualTo(expiryDate) + assertThat(result.ids.id).isEqualTo(1) + //assertThat(result.ids.uuid).isEqualTo(1) + } +} \ No newline at end of file diff --git a/ui-uploaded-and-verified.png b/ui-uploaded-and-verified.png new file mode 100644 index 0000000000000000000000000000000000000000..f5e184053cd5b540d76fc16ab3707b1de1ae03da GIT binary patch literal 32398 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