diff --git a/docs/src/main/asciidoc/verifier_contract.adoc b/docs/src/main/asciidoc/verifier_contract.adoc index 23376d1d31..cea2cec30f 100644 --- a/docs/src/main/asciidoc/verifier_contract.adoc +++ b/docs/src/main/asciidoc/verifier_contract.adoc @@ -1559,6 +1559,11 @@ Next to that the request and path matchers are skipped during the conversion. When using a date, time or datetime value generator with a given format, the given format will be skipped and the ISO format will be used. +In order to properly support the Spring Cloud Contract way of doing messaging +with Pact you'll have to provide some additional meta data entries. Below you can find a list of such entries: + +- to define the destination to which a message gets sent, you have to +set a `metaData` entry in the Pact file, with key `sentTo` equal to the destination to which a message is to be sent. E.g. `"metaData": { "sentTo": "activemq:output" }` ==== Pact Contract diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy index d7da02f98b..e0f4c24a86 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/main/groovy/org/springframework/cloud/contract/verifier/spec/pact/MessagingSCContractCreator.groovy @@ -33,10 +33,10 @@ import au.com.dius.pact.model.v3.messaging.Message import au.com.dius.pact.model.v3.messaging.MessagePact import groovy.transform.CompileStatic import groovy.transform.PackageScope + import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.verifier.util.JsonPaths import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter - /** * Creator of {@link Contract} instances * @@ -48,6 +48,8 @@ import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter class MessagingSCContractCreator { private static final String FULL_BODY = '$' + private static final String DESTINATION_KEY = "sentTo" + private static final List NON_HEADER_META_DATA = [DESTINATION_KEY] Collection convertFrom(MessagePact pact) { return pact.messages.collect({ Message message -> @@ -68,7 +70,6 @@ class MessagingSCContractCreator { if (ruleGroup.ruleLogic != RuleLogic.AND) { throw new UnsupportedOperationException("Currently only the AND combination rule logic is supported") } - if (FULL_BODY == key) { JsonPaths jsonPaths = JsonToJsonPathsConverter.transformToJsonPathWithStubsSideValuesAndNoArraySizeCheck(message.contents.value) jsonPaths.each { @@ -127,15 +128,16 @@ class MessagingSCContractCreator { message.metaData.each { String k, String v -> if (k.equalsIgnoreCase("contentType")) { messagingContentType(v) - } else { + } else if (!NON_HEADER_META_DATA.contains(k)) { header(k, v) } } } } - - sentTo(guessDestination(message)); - + String dest = findDestination(message) + if (dest) { + sentTo(dest) + } } } }) @@ -150,12 +152,8 @@ class MessagingSCContractCreator { .uncapitalize() + "()" } - private String guessDestination(Message message) { - String[] outcomeParts = message.description.split(' ') - if (outcomeParts.length > 0) { - return outcomeParts[outcomeParts.length - 1] - } - return '' + private String findDestination(Message message) { + return message.metaData.get(DESTINATION_KEY) ?: "" } } diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverterSpec.groovy b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverterSpec.groovy index 5933950e3b..2bc0c2adc3 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverterSpec.groovy +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/groovy/org/springframework/cloud/contract/verifier/spec/pact/PactContractConverterSpec.groovy @@ -650,10 +650,10 @@ class PactContractConverterSpec extends Specification { } def "should convert from pact v3 messaging to one SC message contract"() { - given: Collection expectedContracts = [ Contract.make { + description() label 'message sent to activemq:output' input { triggeredBy('bookReturnedTriggered()') diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_messaging.json b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_messaging.json index 443495f733..64a43ad48f 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_messaging.json +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_messaging.json @@ -9,6 +9,7 @@ { "description":"message sent to activemq:output", "metaData":{ + "sentTo": "activemq:output", "BOOK-NAME":"foo", "contentType":"application/json" },