From df80cc8f1fa004c818cc847b311670b087c47ecf Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 17 Nov 2016 13:15:25 +0100 Subject: [PATCH] Added execute support for text based responses without this change it's impossible to execute any custom method to assert a response for a body that is just text with this change you can do it fixes #150 --- .../JUnitMessagingMethodBodyBuilder.groovy | 5 ++++ .../builder/JUnitMethodBodyBuilder.groovy | 5 ++++ .../verifier/builder/MethodBodyBuilder.groovy | 6 +++++ .../SpockMessagingMethodBodyBuilder.groovy | 7 +++++- ...kMethodRequestProcessingBodyBuilder.groovy | 5 ++++ .../JaxRsClientMethodBuilderSpec.groovy | 23 +++++++++++++++++++ .../MockMvcMethodBodyBuilderSpec.groovy | 23 +++++++++++++++++++ 7 files changed, 73 insertions(+), 1 deletion(-) 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)") + } + }