From cf37bc666ad51ece355ee85d339ee017e56fcaca Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 31 Oct 2019 14:58:40 +0100 Subject: [PATCH 1/2] 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()) } From e2999d9f8bf4f3315710642f417994df4068d998 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 4 Nov 2019 09:20:25 +0100 Subject: [PATCH 2/2] Updates the parsing of a json body containing a regex in the body --- .../dsl/wiremock/WireMockRequestStubStrategy.groovy | 10 ++++++---- .../wiremock/restdocs/WireMockSnippetTests.java | 8 +++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy index 40641754d7..c8e1626348 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.groovy @@ -93,14 +93,15 @@ class WireMockRequestStubStrategy extends BaseWireMockStubStrategy { } boolean bodyHasMatchingStrategy = request.body.clientValue instanceof MatchingStrategy MatchingStrategy matchingStrategy = getMatchingStrategyFromBody(request.body) + Object clientSideBody = MapConverter.transformToClientValues(request.body) if (contentType == ContentType.JSON) { def originalBody = matchingStrategy?.clientValue if (bodyHasMatchingStrategy) { requestPattern.withRequestBody( convertToValuePattern(matchingStrategy)) - } else if (containsPattern(request?.body)) { + } else if (clientSideBody instanceof Pattern || clientSideBody instanceof RegexProperty) { requestPattern.withRequestBody( - convertToValuePattern(appendBodyRegexpMatchPattern(request.body))) + convertToValuePattern(appendBodyRegexpMatchPattern(request.body, contentType))) } else { def body = JsonToJsonPathsConverter. removeMatchingJsonPaths(originalBody, request.bodyMatchers) @@ -399,13 +400,14 @@ class WireMockRequestStubStrategy extends BaseWireMockStubStrategy { } private MatchingStrategy appendBodyRegexpMatchPattern(Object value, ContentType contentType) { + Object clientValue = MapConverter.transformToClientValues(value) switch (contentType) { case ContentType.JSON: return new MatchingStrategy( - buildJSONRegexpMatch(value), MatchingStrategy.Type.MATCHING) + buildJSONRegexpMatch(clientValue), MatchingStrategy.Type.MATCHING) case ContentType.UNKNOWN: return new MatchingStrategy( - buildGStringRegexpForStubSide(value), MatchingStrategy.Type.MATCHING) + buildGStringRegexpForStubSide(clientValue), MatchingStrategy.Type.MATCHING) case ContentType.XML: throw new IllegalStateException("XML pattern matching is not implemented yet") } diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java index af40a141aa..4168b11d67 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java @@ -177,8 +177,7 @@ public class WireMockSnippetTests { @Test public void should_accept_query_params() throws IOException { - this.operation = operation(requestGetWithQueryParam(), response(), - this.context); + this.operation = operation(requestGetWithQueryParam(), response(), this.context); WireMockSnippet snippet = new WireMockSnippet(); snippet.document(this.operation); @@ -188,9 +187,8 @@ public class WireMockSnippetTests { StubMapping stubMapping = WireMockStubMapping .buildFrom(new String(Files.readAllBytes(stub.toPath()))); assertThat(stubMapping.getRequest().getUrlPath()).isEqualTo("/bar"); - assertThat(stubMapping.getRequest() - .getQueryParameters()) - .containsOnly(Assertions.entry("myParam", MultiValuePattern.of(equalTo(("myValue"))))); + assertThat(stubMapping.getRequest().getQueryParameters()).containsOnly( + Assertions.entry("myParam", MultiValuePattern.of(equalTo(("myValue"))))); } private Operation operation(OperationRequest request, OperationResponse response,