-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fixes #256
- Loading branch information
Showing
33 changed files
with
565 additions
and
342 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
61 changes: 61 additions & 0 deletions
61
...ring/src/main/kotlin/io/github/ludorival/pactjvm/mock/spring/SpringRabbitMQMockAdapter.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
package io.github.ludorival.pactjvm.mock.spring | ||
|
||
import au.com.dius.pact.core.model.OptionalBody | ||
import au.com.dius.pact.core.model.ProviderState | ||
import au.com.dius.pact.core.model.messaging.Message | ||
import au.com.dius.pact.core.model.matchingrules.MatchingRulesImpl | ||
import io.github.ludorival.pactjvm.mock.Call | ||
import io.github.ludorival.pactjvm.mock.InteractionBuilder | ||
import io.github.ludorival.pactjvm.mock.PactMockAdapter | ||
import org.springframework.amqp.rabbit.core.RabbitTemplate | ||
import com.fasterxml.jackson.databind.ObjectMapper | ||
import com.fasterxml.jackson.databind.SerializationFeature | ||
|
||
open class SpringRabbitMQMockAdapter( | ||
private val provider: String, | ||
private val objectMapper: ObjectMapper = defaultObjectMapper() | ||
) : PactMockAdapter<Message>() { | ||
|
||
constructor(provider: String) : this(provider, defaultObjectMapper()) | ||
|
||
override fun support(call: Call<*>): Boolean { | ||
return call.self is RabbitTemplate | ||
} | ||
|
||
override fun <T> buildInteraction( | ||
interactionBuilder: InteractionBuilder<T>, | ||
providerName: String | ||
): Message { | ||
val call = interactionBuilder.call | ||
val exchange = call.args.firstOrNull { it is String } as? String ?: "" | ||
val routingKey = call.args.getOrNull(1) as? String ?: "" | ||
val message = call.args.lastOrNull() | ||
|
||
val messageContent = when (message) { | ||
is String -> message | ||
null -> "" | ||
else -> objectMapper.writeValueAsString(message) | ||
} | ||
|
||
return interactionBuilder.build { Message( | ||
description = description, | ||
providerStates = providerStates, | ||
contents = OptionalBody.body(messageContent.toByteArray()), | ||
metadata = mutableMapOf( | ||
"exchange" to exchange, | ||
"routing_key" to routingKey | ||
), | ||
matchingRules = requestMatchingRules | ||
) | ||
} | ||
} | ||
|
||
override fun determineConsumerAndProvider(call: Call<*>): Pair<String, String> { | ||
val exchange = call.args.firstOrNull { it is String } as? String | ||
return Pair(exchange?.split(".")?.firstOrNull() ?: "default", provider) | ||
} | ||
|
||
companion object { | ||
private fun defaultObjectMapper(): ObjectMapper = ObjectMapper() | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
...rc/main/kotlin/io/github/ludorival/pactjvm/mock/test/orderservice/OrderConsumerService.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package io.github.ludorival.pactjvm.mock.test.orderservice | ||
|
||
import io.github.ludorival.pactjvm.mock.test.shoppingservice.config.RabbitMQConfig | ||
import org.springframework.amqp.rabbit.annotation.RabbitListener | ||
import org.springframework.stereotype.Service | ||
|
||
@Service | ||
open class OrderConsumerService { | ||
|
||
@RabbitListener(queues = [RabbitMQConfig.ROUTING_KEY]) | ||
fun handleShoppingListOrdered(orderMessage: OrderMessage) { | ||
// Process the order message | ||
println("Received order message: $orderMessage") | ||
} | ||
} |
29 changes: 29 additions & 0 deletions
29
...k-test/src/main/kotlin/io/github/ludorival/pactjvm/mock/test/orderservice/OrderMessage.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
package io.github.ludorival.pactjvm.mock.test.orderservice | ||
|
||
import io.github.ludorival.pactjvm.mock.test.shoppingservice.ShoppingList | ||
|
||
data class OrderMessage( | ||
val shoppingListId: String, | ||
val userId: Long, | ||
val items: List<OrderItem> | ||
) { | ||
data class OrderItem( | ||
val name: String, | ||
val quantity: Int | ||
) | ||
|
||
companion object { | ||
fun fromShoppingList(shoppingList: ShoppingList): OrderMessage { | ||
return OrderMessage( | ||
shoppingListId = shoppingList.id.toString(), | ||
userId = shoppingList.userId, | ||
items = shoppingList.items.map { item -> | ||
OrderItem( | ||
name = item.name, | ||
quantity = item.quantity | ||
) | ||
} | ||
) | ||
} | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
...main/kotlin/io/github/ludorival/pactjvm/mock/test/orderservice/OrderServiceApplication.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package io.github.ludorival.pactjvm.mock.test.orderservice | ||
|
||
import org.springframework.boot.autoconfigure.SpringBootApplication | ||
import org.springframework.context.annotation.ComponentScan | ||
|
||
@SpringBootApplication | ||
@ComponentScan(basePackages = ["io.github.ludorival.pactjvm.mock.test.orderservice"]) | ||
open class OrderServiceApplication { | ||
companion object { | ||
@JvmStatic | ||
fun main(args: Array<String>) { | ||
org.springframework.boot.runApplication<OrderServiceApplication>(*args) | ||
} | ||
} | ||
} |
37 changes: 37 additions & 0 deletions
37
...c/main/kotlin/io/github/ludorival/pactjvm/mock/test/orderservice/RabbitMQConfiguration.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package io.github.ludorival.pactjvm.mock.test.orderservice | ||
|
||
import org.springframework.amqp.core.Binding | ||
import org.springframework.amqp.core.BindingBuilder | ||
import org.springframework.amqp.core.Queue | ||
import org.springframework.amqp.core.TopicExchange | ||
import org.springframework.amqp.rabbit.connection.ConnectionFactory | ||
import org.springframework.amqp.rabbit.core.RabbitTemplate | ||
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter | ||
import org.springframework.amqp.support.converter.MessageConverter | ||
import org.springframework.context.annotation.Bean | ||
import org.springframework.context.annotation.Configuration | ||
import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration | ||
import io.github.ludorival.pactjvm.mock.test.shoppingservice.config.RabbitMQConfig | ||
|
||
@Configuration | ||
class RabbitMQConfiguration { | ||
|
||
@Bean | ||
fun queue(): Queue = Queue(RabbitMQConfig.ROUTING_KEY) | ||
|
||
@Bean | ||
fun exchange(): TopicExchange = TopicExchange(RabbitMQConfig.EXCHANGE_NAME) | ||
|
||
@Bean | ||
fun binding(queue: Queue, exchange: TopicExchange): Binding = | ||
BindingBuilder.bind(queue).to(exchange).with(RabbitMQConfig.ROUTING_KEY) | ||
|
||
@Bean | ||
fun messageConverter(): MessageConverter = Jackson2JsonMessageConverter() | ||
|
||
@Bean | ||
fun rabbitTemplate(connectionFactory: ConnectionFactory, messageConverter: MessageConverter): RabbitTemplate = | ||
RabbitTemplate(connectionFactory).apply { | ||
this.messageConverter = messageConverter | ||
} | ||
} |
30 changes: 30 additions & 0 deletions
30
...ain/kotlin/io/github/ludorival/pactjvm/mock/test/shoppingservice/config/RabbitMQConfig.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
package io.github.ludorival.pactjvm.mock.test.shoppingservice.config | ||
|
||
import org.springframework.amqp.core.TopicExchange | ||
import org.springframework.amqp.rabbit.connection.ConnectionFactory | ||
import org.springframework.amqp.rabbit.core.RabbitTemplate | ||
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter | ||
import org.springframework.context.annotation.Bean | ||
import org.springframework.context.annotation.Configuration | ||
|
||
@Configuration | ||
open class RabbitMQConfig { | ||
|
||
companion object { | ||
const val EXCHANGE_NAME = "shopping.topic" | ||
const val ROUTING_KEY = "shopping.list.ordered" | ||
} | ||
|
||
@Bean | ||
open fun exchange(): TopicExchange = TopicExchange(EXCHANGE_NAME) | ||
|
||
@Bean | ||
open fun messageConverter() = Jackson2JsonMessageConverter() | ||
|
||
@Bean | ||
open fun rabbitTemplate(connectionFactory: ConnectionFactory, messageConverter: Jackson2JsonMessageConverter): RabbitTemplate { | ||
return RabbitTemplate(connectionFactory).apply { | ||
this.messageConverter = messageConverter | ||
} | ||
} | ||
} |
20 changes: 20 additions & 0 deletions
20
...ithub/ludorival/pactjvm/mock/test/shoppingservice/messaging/ShoppingListOrderPublisher.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package io.github.ludorival.pactjvm.mock.test.shoppingservice.messaging | ||
|
||
import io.github.ludorival.pactjvm.mock.test.orderservice.OrderMessage | ||
import io.github.ludorival.pactjvm.mock.test.shoppingservice.ShoppingList | ||
import io.github.ludorival.pactjvm.mock.test.shoppingservice.config.RabbitMQConfig | ||
import org.springframework.amqp.rabbit.core.RabbitTemplate | ||
import org.springframework.stereotype.Component | ||
|
||
@Component | ||
class ShoppingListOrderPublisher(private val rabbitTemplate: RabbitTemplate) { | ||
|
||
fun publishOrderFromShoppingList(shoppingList: ShoppingList) { | ||
val orderMessage = OrderMessage.fromShoppingList(shoppingList) | ||
rabbitTemplate.convertAndSend( | ||
RabbitMQConfig.EXCHANGE_NAME, | ||
RabbitMQConfig.ROUTING_KEY, | ||
orderMessage | ||
) | ||
} | ||
} |
Oops, something went wrong.