diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy index 78c8430f74..a659b168a9 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMessagingMethodBodyBuilder.groovy @@ -71,6 +71,11 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { return "" } + @Override + protected String getResponseBodyPropertyComparisonString(String property, ExecutionProperty value) { + return "" + } + @Override protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) { blockBuilder.addLine("${exec.insertValue("parsedJson.read('\\\$$property')")}") diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy index 553b13b6b0..f9c5ca2b6c 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JUnitMethodBodyBuilder.groovy @@ -81,6 +81,11 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder return "assertThat(responseBody${property}).${buildEscapedMatchesMethod(value)}" } + @Override + protected String getResponseBodyPropertyComparisonString(String property, ExecutionProperty value) { + return value.insertValue("responseBody${property}") + } + @Override protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) { blockBuilder.addLine("${exec.insertValue("parsedJson.read(\"\\\$$property\")")};") diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy index af40d02fc6..bd37884257 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy @@ -91,6 +91,12 @@ abstract class MethodBodyBuilder { */ protected abstract String getResponseBodyPropertyComparisonString(String property, Pattern value) + /** + * Builds the code that for the given {@code property} will match it to + * the given {@link ExecutionProperty} value + */ + protected abstract String getResponseBodyPropertyComparisonString(String property, ExecutionProperty value) + /** * Appends to the {@link BlockBuilder} the assertion for the given body element */ diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy index 49e4fde0a2..f39c342897 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMessagingMethodBodyBuilder.groovy @@ -53,7 +53,12 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { @Override protected String getResponseBodyPropertyComparisonString(String property, Pattern value) { - return null + return "" + } + + @Override + protected String getResponseBodyPropertyComparisonString(String property, ExecutionProperty value) { + return "" } @Override diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy index a33a29a350..cdbe20c78a 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/SpockMethodRequestProcessingBodyBuilder.groovy @@ -60,6 +60,11 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing return "responseBody$property ${patternComparison(value)}" } + @Override + protected String getResponseBodyPropertyComparisonString(String property, ExecutionProperty value) { + return value.insertValue("responseBody${property}") + } + @Override protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) { blockBuilder.addLine("${exec.insertValue("parsedJson.read('\\\$$property')")}") diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy index 99fc611670..c855907ab5 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy @@ -766,6 +766,29 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub test.contains("assertThat(responseBody).matches(\".*\");") } + @Issue('#150') + def "should support custom method execution in response"() { + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + url '/get' + } + response { + status 200 + status 200 + body(value(stub("HELLO FROM STUB"), server(execute('foo($it)')))) + } + } + MethodBodyBuilder builder = new JaxRsClientJUnitMethodBodyBuilder(contractDsl, properties) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.then(blockBuilder) + def test = blockBuilder.toString() + then: + test.contains("foo(responseBody);") + } + private String stripped(String string) { return string.stripMargin().stripIndent().replace('\t', '').replace('\n', '').replace(' ','') } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy index f40d81271a..903b05cbe4 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy @@ -1645,4 +1645,27 @@ World.'''""" test.contains("responseBody ==~ java.util.regex.Pattern.compile('.*')") } + @Issue('#150') + def "should support custom method execution in response"() { + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + url '/get' + } + response { + status 200 + status 200 + body(value(stub("HELLO FROM STUB"), server(execute('foo($it)')))) + } + } + MethodBodyBuilder builder = new MockMvcSpockMethodRequestProcessingBodyBuilder(contractDsl, properties) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.then(blockBuilder) + def test = blockBuilder.toString() + then: + test.contains("foo(responseBody)") + } + }