From 3bbdda83a9cdab67479c8d91a44da07b5212907f Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 27 Nov 2017 13:59:21 +0100 Subject: [PATCH] PathNotFoundException when request body wraps into multiline string ; fixes #458 --- .../HandlebarsJsonPathHelper.groovy | 12 ++++++-- .../builder/MethodBodyBuilderSpec.groovy | 30 +++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy index ac29171b85..93b5891cc5 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/handlebars/HandlebarsJsonPathHelper.groovy @@ -6,8 +6,8 @@ import com.github.tomakehurst.wiremock.extension.responsetemplating.RequestTempl import com.jayway.jsonpath.DocumentContext import com.jayway.jsonpath.JsonPath import groovy.transform.CompileStatic -import org.springframework.cloud.contract.verifier.builder.TestSideRequestTemplateModel +import org.springframework.cloud.contract.verifier.builder.TestSideRequestTemplateModel /** * A Handlebars helper for the {@code jsonpath} helper function. * @@ -38,8 +38,16 @@ class HandlebarsJsonPathHelper implements Helper> { } private Object returnObjectForTest(Object model, String jsonPath) { - DocumentContext documentContext = JsonPath.parse(((TestSideRequestTemplateModel) model).rawBody) + String body = removeSurroundingQuotes(((TestSideRequestTemplateModel) model).rawBody).replace('\\"', '"') + DocumentContext documentContext = JsonPath.parse(body) return documentContext.read(jsonPath) } + private String removeSurroundingQuotes(String body) { + if (body.startsWith('"') && body.endsWith('"')) { + return body.substring(1, body.length() - 1) + } + return body + } + } 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 c011db3852..fe4941a834 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 @@ -348,6 +348,36 @@ DocumentContext parsedJson = JsonPath.parse(json); "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } } + @Issue("#458") + def "should reference request from body whtn body is a string [#methodBuilderName]"() { + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + url '/mytest' + body("""{ "name": "My name" }""") + } + response { + status 200 + body fromRequest().body('$.name') + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + then: + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, blockBuilder.toString()) + and: + stubMappingIsValidWireMockStub(contractDsl) + where: + methodBuilderName | methodBuilder | responseAsserter + "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | { String string -> assert string.contains('responseBody == "My name"') } + "MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } | { String string -> assert string.contains('assertThat(responseBody).isEqualTo("My name");') } + "JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | { String string -> assert string.contains('responseBody == "My name"') } + "JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } | { String string -> assert string.contains('assertThat(responseBody).isEqualTo("My name");') } + } + def "should use fixed delay milliseconds in the generated test [#methodBuilderName]"() { given: Contract contractDsl = Contract.make {