From e73d6526bfb3240f9dc33d6afcf2be17e5383f49 Mon Sep 17 00:00:00 2001 From: mariuszdb <33603097+mariuszdb@users.noreply.github.com> Date: Mon, 26 Apr 2021 09:04:25 +0200 Subject: [PATCH] Parse ExecutionProperty in queryParameters (#1646) Fixes gh-854 --- .../verifier/builder/JaxRsUrlPathWhen.java | 12 ++++- .../builder/MockMvcQueryParamsWhen.java | 14 ++++-- .../builder/MethodBodyBuilderSpec.groovy | 49 +++++++++++++++++++ 3 files changed, 70 insertions(+), 5 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/JaxRsUrlPathWhen.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/JaxRsUrlPathWhen.java index ca8236c3fe..c0d6268190 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/JaxRsUrlPathWhen.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/JaxRsUrlPathWhen.java @@ -75,8 +75,8 @@ class JaxRsUrlPathWhen implements When, JaxRsAcceptor, QueryParamsResolver { .iterator(); while (iterator.hasNext()) { QueryParameter param = iterator.next(); - String text = ".queryParam(\"" + param.getName() + "\", " - + this.bodyParser.quotedShortText(resolveParamValue(param)) + ")"; + String queryParamValue = getQueryParamValue(param); + String text = ".queryParam(\"" + param.getName() + "\", " + queryParamValue + ")"; if (iterator.hasNext()) { this.blockBuilder.addLine(text); } @@ -86,6 +86,14 @@ class JaxRsUrlPathWhen implements When, JaxRsAcceptor, QueryParamsResolver { } } + private String getQueryParamValue(QueryParameter param) { + Object serverValue = param.getServerValue(); + if (serverValue instanceof ExecutionProperty) { + return ((ExecutionProperty) serverValue).getExecutionCommand(); + } + return this.bodyParser.quotedShortText(resolveParamValue(param)); + } + /** * @return {@code true} if the query parameter is allowed */ diff --git a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/MockMvcQueryParamsWhen.java b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/MockMvcQueryParamsWhen.java index 34a04790ef..9439ec07bf 100644 --- a/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/MockMvcQueryParamsWhen.java +++ b/spring-cloud-contract-verifier/src/main/java/org/springframework/cloud/contract/verifier/builder/MockMvcQueryParamsWhen.java @@ -20,6 +20,7 @@ import java.util.Iterator; import java.util.List; import java.util.stream.Collectors; +import org.springframework.cloud.contract.spec.internal.ExecutionProperty; import org.springframework.cloud.contract.spec.internal.MatchingStrategy; import org.springframework.cloud.contract.spec.internal.QueryParameter; import org.springframework.cloud.contract.spec.internal.Request; @@ -85,10 +86,17 @@ class MockMvcQueryParamsWhen implements When, MockMvcAcceptor, QueryParamsResolv } private String addQueryParameter(QueryParameter queryParam) { + String queryParamValue = getQueryParamValue(queryParam); return "." + QUERY_PARAM_METHOD + "(" + this.bodyParser.quotedLongText(queryParam.getName()) + "," - + this.bodyParser - .quotedLongText(resolveParamValue(MapConverter.getTestSideValuesForNonBody(queryParam))) - + ")"; + + queryParamValue + ")"; + } + + private String getQueryParamValue(QueryParameter queryParam) { + Object serverValue = queryParam.getServerValue(); + if (serverValue instanceof ExecutionProperty) { + return ((ExecutionProperty) serverValue).getExecutionCommand(); + } + return this.bodyParser.quotedLongText(resolveParamValue(MapConverter.getTestSideValuesForNonBody(queryParam))); } @Override diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy index 2aa3737748..99a1c61f36 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy @@ -1857,6 +1857,55 @@ response: } } + @Issue("#854") + def "should call execute in queryParameters [#methodBuilderName]"() { + given: + Contract contractDsl = Contract.make { + request { + method 'POST' + urlPath("/rest/something") { + queryParameters { + parameter('someHashCode': $( + consumer(regex(anInteger())), + producer(execute("hashCode()"))) + ) + } + } + } + response { + status OK() + } + } + methodBuilder() + when: + String test = singleTestGenerator(contractDsl) + then: + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + test.contains('''.queryParam("someHashCode",hashCode())''') | test.contains('''.queryParam("someHashCode", hashCode())''') + and: + stubMappingIsValidWireMockStub(contractDsl) + where: + methodBuilderName | methodBuilder + "spock" | { + properties.testFramework = TestFramework.SPOCK + } + "mockmvc" | { + properties.testMode = TestMode.MOCKMVC + } + "jaxrs-spock" | { + properties.testFramework = TestFramework.SPOCK; properties.testMode = TestMode.JAXRSCLIENT + } + "jaxrs" | { + properties.testFramework = TestFramework.JUNIT; properties.testMode = TestMode.JAXRSCLIENT + } + "webclient" | { + properties.testMode = TestMode.WEBTESTCLIENT + } + "testNG" | { + properties.testFramework = TestFramework.TESTNG + } + } + @Issue("#1262") def "should work with the timeout flag for groovy [#methodBuilderName]"() { given: