From 760387617d9f19140e76e247cef0bdbdf4df40cc Mon Sep 17 00:00:00 2001 From: Dominik Meister Date: Mon, 20 Sep 2021 10:09:27 +0200 Subject: [PATCH] Fix handling of ClientDslProperties when generating wiremock stubs (#1716) Correctly handle client specific DslProperties (e.g. anyAlphanumeric()) in request headers, cookies, etc. Co-authored-by: Dominik Meister --- .../wiremock/WireMockRequestStubStrategy.java | 5 ++ .../dsl/wiremock/WireMockGroovyDslSpec.groovy | 68 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.java index 386f4b0760..40ebb8e541 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockRequestStubStrategy.java @@ -46,6 +46,7 @@ import org.springframework.cloud.contract.spec.Contract; import org.springframework.cloud.contract.spec.internal.Body; import org.springframework.cloud.contract.spec.internal.BodyMatcher; import org.springframework.cloud.contract.spec.internal.BodyMatchers; +import org.springframework.cloud.contract.spec.internal.ClientDslProperty; import org.springframework.cloud.contract.spec.internal.DslProperty; import org.springframework.cloud.contract.spec.internal.FromFileProperty; import org.springframework.cloud.contract.spec.internal.MatchingStrategy; @@ -369,6 +370,10 @@ class WireMockRequestStubStrategy extends BaseWireMockStubStrategy { } protected ContentPattern convertToValuePattern(Object object) { + if (object instanceof ClientDslProperty) { + object = ((ClientDslProperty) object).getClientValue(); + } + if (object instanceof Pattern || object instanceof RegexProperty) { return WireMock.matching(new RegexProperty(object).pattern()); } 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 83192ef2d7..5fcf4ba8c1 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 @@ -3062,6 +3062,74 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie server?.shutdown() } + def "should work with client DSL properties"() { + given: + org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract. + make { + request { + method('GET') + url("/api/foo") + headers { + header("foo", $(client(anyAlphaNumeric()), server("123"))) + } + cookies { + cookie("cookie1", $(client("foo"), server("bar"))) + cookie("cookie2", $(client(~/[a-z]+/), server("bar"))) + cookie("cookie3", $(client(anyAlphaNumeric()), server("bar"))) + cookie("cookie4", $(anyAlphaNumeric())) + } + } + response { + status OK() + body("ok") + headers { + header 'Content-Type': 'text/plain' + } + } + } + when: + String wireMockStub = new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null, groovyDsl), groovyDsl). + toWireMockClientStub() + then: + AssertionUtil.assertThatJsonsAreEqual(''' + { + "request" : { + "url" : "/api/foo", + "method" : "GET", + "headers" : { + "foo" : { + "matches" : "[a-zA-Z0-9]+" + } + }, + "cookies" : { + "cookie1" : { + "equalTo" : "foo" + }, + "cookie2" : { + "matches" : "[a-z]+" + }, + "cookie3" : { + "matches" : "[a-zA-Z0-9]+" + }, + "cookie4" : { + "matches" : "[a-zA-Z0-9]+" + } + } + }, + "response" : { + "status" : 200, + "body" : "ok", + "headers" : { + "Content-Type" : "text/plain" + }, + "transformers" : [ "response-template", "foo-transformer" ] + } + } + ''', wireMockStub) + and: + stubMappingIsValidWireMockStub(wireMockStub) + } + WireMockConfiguration config() { return new WireMockConfiguration().extensions(responseTemplateTransformer()) }