From cf37bc666ad51ece355ee85d339ee017e56fcaca Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 31 Oct 2019 14:58:40 +0100 Subject: [PATCH] Should not fail when matchers don't have dots fixes gh-894 --- .../util/JsonToJsonPathsConverter.groovy | 10 ++++--- .../dsl/wiremock/WireMockGroovyDslSpec.groovy | 26 +++++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverter.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverter.groovy index 34a6534bab..8cf641b8a8 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverter.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverter.groovy @@ -154,7 +154,11 @@ class JsonToJsonPathsConverter { removeTrailingContainers(pathToDelete, context) } else { - String lastParent = matcherPath.substring(0, matcherPath.lastIndexOf(".")) + int lastIndexOfDot = matcherPath.lastIndexOf(".") + if (lastIndexOfDot == -1) { + return false + } + String lastParent = matcherPath.substring(0, lastIndexOfDot) def lastParentObject = context.read(lastParent) if (isIterable(lastParentObject) && @@ -229,9 +233,9 @@ class JsonToJsonPathsConverter { return path } int lastIndexOfDot = lastIndexOfDot(path) - String toLastDot = path.substring(0, lastIndexOfDot) String fromLastDot = path.substring(lastIndexOfDot + 1) - String propertyName = "@.${fromLastDot}" + String toLastDot = lastIndexOfDot == -1 ? '$' : path.substring(0, lastIndexOfDot) + String propertyName = lastIndexOfDot == -1 ? '@' : "@.${fromLastDot}" String comparison = createComparison(propertyName, bodyMatcher, value, body) return "${toLastDot}[?(${comparison})]" } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy index 8066f425d3..8a2e0374b1 100755 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy @@ -2669,6 +2669,32 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie } + @Issue("#894") + def "should not fail when matchers don't have dots"() { + given: + Contract contractDsl = Contract.make { + request { + method 'POST' + url "/example" + body([ "123", "234"]) + bodyMatchers { + jsonPath('$[*]', byRegex(nonEmpty())) + } + } + response { + status 201 + } + } + when: + String wireMockStub = new WireMockStubStrategy("Test", + new ContractMetadata(null, false, 0, null, contractDsl), contractDsl) + .toWireMockClientStub() + + then: + stubMappingIsValidWireMockStub(wireMockStub) + + } + WireMockConfiguration config() { return new WireMockConfiguration().extensions(responseTemplateTransformer()) }