From f53476974c91e537ca3079b9ff4a836a8ac6b8fe Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 19 Feb 2019 13:51:42 +0100 Subject: [PATCH] Fixed wrong method delegation; fixes gh-889 --- .../pact/MessagingSCContractCreator.groovy | 10 ++- .../pact/PactContractConverterSpec.groovy | 9 ++ .../resources/pact/pact_v3_issue_889.json | 83 +++++++++++++++++++ 3 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_issue_889.json 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 447b4cfc74..c811a20e92 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,7 +33,9 @@ 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.spec.internal.RegexPatterns import org.springframework.cloud.contract.verifier.util.JsonPaths import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter @@ -47,6 +49,8 @@ import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter @PackageScope class MessagingSCContractCreator { + RegexPatterns regexPatterns = new RegexPatterns() + private static final String FULL_BODY = '$' Collection convertFrom(MessagePact pact) { @@ -104,13 +108,13 @@ class MessagingSCContractCreator { } else if (rule instanceof NumberTypeMatcher) { switch (rule.numberType) { case NumberTypeMatcher.NumberType.NUMBER: - jsonPath(key, byRegex(number())) + jsonPath(key, byRegex(regexPatterns.number())) break case NumberTypeMatcher.NumberType.INTEGER: - jsonPath(key, byRegex(anInteger())) + jsonPath(key, byRegex(regexPatterns.anInteger())) break case NumberTypeMatcher.NumberType.DECIMAL: - jsonPath(key, byRegex(aDouble())) + jsonPath(key, byRegex(regexPatterns.aDouble())) break default: throw new RuntimeException("Unsupported number type!") 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 4d3b6ba497..bc9e98aaa0 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 @@ -37,6 +37,7 @@ class PactContractConverterSpec extends Specification { File pact509Json = new File(PactContractConverterSpec.getResource("/pact/pact_509.json").toURI()) File pactv2Json = new File(PactContractConverterSpec.getResource("/pact/pact_v2.json").toURI()) File pactv3Json = new File(PactContractConverterSpec.getResource("/pact/pact_v3.json").toURI()) + File pactv3Issue889Json = new File(PactContractConverterSpec.getResource("/pact/pact_v3_issue_889.json").toURI()) File pactv3MessagingJson = new File(PactContractConverterSpec.getResource("/pact/pact_v3_messaging.json").toURI()) File pactv3UnsupportedRuleLogicJson = new File(PactContractConverterSpec.getResource("/pact/pact_v3_unsupported_rule_logic.json").toURI()) @Subject PactContractConverter converter = new PactContractConverter() @@ -617,6 +618,14 @@ class PactContractConverterSpec extends Specification { contracts == expectedContracts } + @Issue("#889") + def "should not throw an exception when parsing Pact file with different matchers"() { + when: + converter.convertFrom(pactv3Issue889Json) + then: + noExceptionThrown() + } + def "should convert from pact v3 messaging to one SC message contract"() { given: diff --git a/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_issue_889.json b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_issue_889.json new file mode 100644 index 0000000000..aeed8c4906 --- /dev/null +++ b/spring-cloud-contract-tools/spring-cloud-contract-pact/src/test/resources/pact/pact_v3_issue_889.json @@ -0,0 +1,83 @@ +{ + "consumer": { + "name": "order-manager" + }, + "provider": { + "name": "lineitem-worker" + }, + "messages": [ + { + "description": "A message sent to order-exchange", + "metaData": { + "sentTo": "order-exchange" + }, + "contents": { + "lineItemId": "string", + "orderId": "XXX-XXXXXX-000000-0000C", + "timestamp": 1550500138678, + "marketId": "MRKTDE", + "status": "PROCESSED" + }, + "providerStates": [ + { + "name": "statusMessageCreated()" + } + ], + "matchingRules": { + "body": { + "$.timestamp": { + "matchers": [ + { + "match": "number" + } + ], + "combine": "AND" + }, + "$.lineItemId": { + "matchers": [ + { + "match": "type" + } + ], + "combine": "AND" + }, + "$.orderId": { + "matchers": [ + { + "match": "regex", + "regex": "[A-Z]{3}-[A-Z]{6}-[0-9]{6}-[0-9A-F]{5}" + } + ], + "combine": "AND" + }, + "$.marketId": { + "matchers": [ + { + "match": "regex", + "regex": "[A-Z]{6}" + } + ], + "combine": "AND" + }, + "$.status": { + "matchers": [ + { + "match": "regex", + "regex": "[A-Z,_]*" + } + ], + "combine": "AND" + } + } + } + } + ], + "metadata": { + "pact-specification": { + "version": "3.0.0" + }, + "pact-jvm": { + "version": "3.5.13" + } + } +} \ No newline at end of file