From 7326dec3d1cb18f57df21c6d53bb9ebd0505329e Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 8 Nov 2019 14:12:35 +0100 Subject: [PATCH] Fixed wrong wrapping of execute() in JaxRs test generation fixes gh-1252 --- .../JaxRsClientJUnitMethodBodyBuilder.groovy | 2 +- ...kMethodRequestProcessingBodyBuilder.groovy | 11 +++++- .../verifier/builder/MethodBodyBuilder.groovy | 7 +++- .../SpringTestMethodBodyBuildersSpec.groovy | 38 +++++++++++++++++++ 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientJUnitMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientJUnitMethodBodyBuilder.groovy index 5bb567577d..5e8a8eb048 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientJUnitMethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientJUnitMethodBodyBuilder.groovy @@ -154,7 +154,7 @@ class JaxRsClientJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder { if (header.name == 'Content-Type' || header.name == 'Accept') { return } - bb.addLine(".header(\"${header.name}\", ${quotedAndEscaped(header.serverValue as String)})") + bb.addLine(".header(\"${header.name}\", ${quotedAndEscaped(header.serverValue)})") } } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientSpockMethodRequestProcessingBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientSpockMethodRequestProcessingBodyBuilder.groovy index 8e224071f7..98a56a5392 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientSpockMethodRequestProcessingBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientSpockMethodRequestProcessingBodyBuilder.groovy @@ -20,6 +20,7 @@ import java.util.regex.Pattern import groovy.transform.PackageScope import groovy.transform.TypeChecked +import org.apache.commons.text.StringEscapeUtils import org.springframework.cloud.contract.spec.Contract import org.springframework.cloud.contract.spec.internal.Cookie @@ -160,7 +161,7 @@ class JaxRsClientSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequ if (header.name == 'Content-Type' || header.name == 'Accept') { return } // Particular headers are set via 'request' / 'entity' methods - bb.addLine(".header('${header.name}', '${header.serverValue}')") + bb.addLine(".header('${header.name}', ${quotedAndEscaped(header.serverValue)})".toString()) } } @@ -174,6 +175,14 @@ class JaxRsClientSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequ } } + @Override + protected String quotedAndEscaped(Object object) { + if (object instanceof ExecutionProperty) { + return object.executionCommand + } + return "'" + StringEscapeUtils.escapeJava(object.toString()) + "'" + } + protected String getHeader(String name) { return request.headers?.entries?.find { it.name == name }?.serverValue } 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 d19271628d..244d0c6d3b 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 @@ -138,8 +138,11 @@ abstract class MethodBodyBuilder implements ClassVerifier { return ContentType.UNKNOWN } - protected String quotedAndEscaped(String string) { - return '"' + StringEscapeUtils.escapeJava(string) + '"' + protected String quotedAndEscaped(Object object) { + if (object instanceof ExecutionProperty) { + return object.executionCommand + } + return '"' + StringEscapeUtils.escapeJava(object.toString()) + '"' } /** 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 5266a442bb..70f008f136 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 @@ -3033,4 +3033,42 @@ DocumentContext parsedJson = JsonPath.parse(json); SpockMessagingMethodBodyBuilder.simpleName | { Contract dsl -> new SpockMessagingMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } JUnitMessagingMethodBodyBuilder.simpleName | { Contract dsl -> new JUnitMessagingMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } } + + @Issue('#1252') + def 'should call execute in headers instead of quoting it [#methodBuilderName]'() { + given: + Contract contractDsl = Contract.make { + request { + method PUT() + url '/frauds/name' + headers { + header(authorization(), value(client(anyNonBlankString()), server(execute("authToken()")))) + + } + } + response { + status OK() + headers { + header(contentType(), "${fromRequest().header(contentType())}") + } + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + and: + builder.appendTo(blockBuilder) + String test = blockBuilder.toString() + when: + SyntaxChecker.tryToRun(methodBuilderName, test.join("\n")) + then: + !test.contains('''"authToken()"''') + !test.contains("""'authToken()'""") + 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) } + } }