From 703e0f2b15f5d9432e96d29178e315398d7ccb16 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 15 Nov 2019 14:20:11 +0100 Subject: [PATCH] Added tests for an example with complex body inside the c() or p() added a small fix for duplicate when().async() fixes gh-1263 --- .../verifier/builder/MethodBodyBuilder.groovy | 2 +- .../RequestProcessingMethodBodyBuilder.groovy | 2 +- .../SpringTestMethodBodyBuildersSpec.groovy | 45 +++++++++++++++++++ .../dsl/wiremock/WireMockGroovyDslSpec.groovy | 40 +++++++++++++++++ 4 files changed, 87 insertions(+), 2 deletions(-) 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 244d0c6d3b..c64c71ea13 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 @@ -456,7 +456,7 @@ abstract class MethodBodyBuilder implements ClassVerifier { Object convertedResponseBody = jsonBodyVerificationBuilder .addJsonResponseBodyCheck(bb, responseBody, bodyMatchers, getResponseAsString(), shouldCommentOutBDDBlocks()) - if (!(convertedResponseBody instanceof Map || convertedResponseBody instanceof List)) { + if (!(convertedResponseBody instanceof Map || convertedResponseBody instanceof List) && !(convertedResponseBody instanceof ExecutionProperty)) { simpleTextResponseBodyCheck(bb, convertedResponseBody) } processBodyElement(bb, "", "", convertedResponseBody) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy index 03dc077c9a..52954e7809 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy @@ -171,7 +171,7 @@ abstract class RequestProcessingMethodBodyBuilder extends MethodBodyBuilder { } private void addAsyncIfRequired(BlockBuilder bb) { - if (response.async) { + if (response.async && !response.delay) { bb.addLine('.when().async()') } if (response.delay) { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy index 70f008f136..eee77e2963 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SpringTestMethodBodyBuildersSpec.groovy @@ -3071,4 +3071,49 @@ DocumentContext parsedJson = JsonPath.parse(json); JaxRsClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } WebTestClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new WebTestClientJUnitMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } } + + @Issue('#1263') + def 'should allow using execute in the request body [#methodBuilderName]'() { + given: + Contract contractDsl = Contract.make { + description "should migrate spaceship" + request { + method POST() + url('/api/migration') + headers { + accept('application/json') + contentType(applicationJson()) + } + body( + $(c([id: 4, foo:5, whatever:"hello"]), p(execute('hashCode()'))) + ) + } + response { + status OK() + headers { + contentType(applicationJson()) + } + body( + $(c([id: 4, foo:5, whatever:"hello"]), p(execute('hashCode()'))) + ) + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + and: + builder.appendTo(blockBuilder) + String test = blockBuilder.toString() + when: + SyntaxChecker.tryToRun(methodBuilderName, test.join("\n")) + then: + // 1 in the request and 1 in the response + test.findAll("hashCode()").size() == 2 + where: + methodBuilderName | methodBuilder + HttpSpockMethodRequestProcessingBodyBuilder.simpleName | { Contract dsl -> new HttpSpockMethodRequestProcessingBodyBuilder(dsl, properties, generatedClassDataForMethod) } + MockMvcJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } + JaxRsClientSpockMethodRequestProcessingBodyBuilder.simpleName | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties, generatedClassDataForMethod) } + JaxRsClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } + WebTestClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new WebTestClientJUnitMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } + } } 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 b73707243c..2977694041 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 @@ -2713,6 +2713,46 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie } + @Issue("#1263") + def "should work with complex objects in the body"() { + given: + Contract contractDsl = Contract.make { + description "should migrate spaceship" + request { + method POST() + url('/api/migration') + headers { + accept('application/json') + contentType(applicationJson()) + } + body( + $(c([id: 4, foo:5, whatever:"hello"]), p(execute('hashCode()'))) + ) + } + response { + status OK() + headers { + contentType(applicationJson()) + } + body( + $(c([id: 4, foo:5, whatever:"hello"]), p(execute('hashCode()'))) + ) + } + } + when: + String wireMockStub = new WireMockStubStrategy("Test", + new ContractMetadata(null, false, 0, null, contractDsl), contractDsl) + .toWireMockClientStub() + + then: + wireMockStub.contains('''$[?(@.['whatever'] == 'hello')]''') + wireMockStub.contains('''$[?(@.['id'] == 4)]''') + wireMockStub.contains('''$[?(@.['foo'] == 5)]''') + wireMockStub.contains('''"{\\"id\\":4,\\"foo\\":5,\\"whatever\\":\\"hello\\"}"''') + stubMappingIsValidWireMockStub(wireMockStub) + + } + @Issue("#1257") def "should work with null request element on the client side and optional stub entry"() { given: