From 74ea3fd27d91ca63cd62e5ca38e029f02176bb12 Mon Sep 17 00:00:00 2001 From: Andrew Fitzgerald Date: Tue, 18 Oct 2016 02:20:17 -0400 Subject: [PATCH] Allow MethodBodyBuilder to evaluate ExecutionProperty objects (#114) --- .../spec/internal/ExecutionProperty.groovy | 5 +++ .../JUnitMessagingMethodBodyBuilder.groovy | 2 +- .../builder/JUnitMethodBodyBuilder.groovy | 2 +- .../verifier/builder/MethodBodyBuilder.groovy | 11 ++++++- .../RequestProcessingMethodBodyBuilder.groovy | 2 +- .../SpockMessagingMethodBodyBuilder.groovy | 2 +- ...kMethodRequestProcessingBodyBuilder.groovy | 2 +- .../builder/ContractHttpDocsSpec.groovy | 2 +- .../MockMvcMethodBodyBuilderSpec.groovy | 32 ++++++++++++++++++- 9 files changed, 52 insertions(+), 8 deletions(-) diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy index 6f79e6dbcf..f9f10d07d5 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy @@ -42,4 +42,9 @@ class ExecutionProperty { String insertValue(String valueToInsert) { return executionCommand.replaceAll(PLACEHOLDER_VALUE, valueToInsert) } + + @Override + public String toString() { + return executionCommand; + } } 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 dae3f3479a..b1efd1c635 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 @@ -153,7 +153,7 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { @Override protected String getHeaderString(Header header) { - return ".header(\"${getTestSideValue(header.name)}\", \"${getTestSideValue(header.serverValue)}\")" + return ".header(${getTestSideValue(header.name)}, ${getTestSideValue(header.serverValue)})" } @Override 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 730ade10c2..e74fbd4e57 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 @@ -125,7 +125,7 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder @Override protected String getHeaderString(Header header) { - return ".header(\"${getTestSideValue(header.name)}\", \"${getTestSideValue(header.serverValue)}\")" + return ".header(${getTestSideValue(header.name)}, ${getTestSideValue(header.serverValue)})" } @Override 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 8727226c00..f22349c587 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 @@ -359,9 +359,18 @@ abstract class MethodBodyBuilder { * combines them into a String representation */ protected String getTestSideValue(Object object) { - return MapConverter.getTestSideValues(object).toString() + return '"' + MapConverter.getTestSideValues(object).toString() + '"' } + /** + * Extracts the executable test side values and + * returns the code of the executable + */ + protected String getTestSideValue(ExecutionProperty executionProperty) { + return executionProperty.toString() + } + + /** * 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/RequestProcessingMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/RequestProcessingMethodBodyBuilder.groovy index f1251acd6f..070b86ba30 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 @@ -109,7 +109,7 @@ abstract class RequestProcessingMethodBodyBuilder extends MethodBodyBuilder { String url = buildUrl(request) String method = request.method.serverValue.toString().toLowerCase() - bb.addLine(/.${method}("$url")/) + bb.addLine(/.${method}($url)/) addColonIfRequired(bb) bb.unindent() } 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 071cbbe54e..962b56b166 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 @@ -150,7 +150,7 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { @Override protected String getHeaderString(Header header) { - return "'${getTestSideValue(header.name)}': '${getTestSideValue(header.serverValue)}'" + return "${getTestSideValue(header.name)}: ${getTestSideValue(header.serverValue)}" } @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 a9d8274509..36d63123c4 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 @@ -106,7 +106,7 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing @Override protected String getHeaderString(Header header) { - return ".header('${getTestSideValue(header.name)}', '${getTestSideValue(header.serverValue)}')" + return ".header(${getTestSideValue(header.name)}, ${getTestSideValue(header.serverValue)})" } @Override diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy index f72978569b..d76f0152e8 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy @@ -268,7 +268,7 @@ class ContractHttpDocsSpec extends Specification { """ given: def request = given() - .header('Content-Type', 'application/json') + .header("Content-Type", "application/json") .body('''{"email":"abc@abc.com","callback_url":"http://partners.com"}''') when: 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 22105658b4..9fcb64324b 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 @@ -1557,7 +1557,7 @@ World.'''""" def test = blockBuilder.toString() def strippedTest = test.replace('\n', '').stripIndent().stripMargin() then: - strippedTest.matches(""".*header\\('header', 'application\\/vnd\\.fraud\\.v1\\+json;.*'\\).*""") + strippedTest.matches(""".*header\\("header", "application\\/vnd\\.fraud\\.v1\\+json;.*"\\).*""") strippedTest.matches(""".*body\\('''\\{"requestElement":"[0-9]{5}"\\}'''\\).*""") strippedTest.matches(""".*put\\("/foo/[0-9]{5}"\\).*""") strippedTest.contains("""response.header('Content-Type') ==~ java.util.regex.Pattern.compile('application/vnd.fraud.v1.json.*')""") @@ -1592,4 +1592,34 @@ World.'''""" test.contains('assertThatRejectionReasonIsNull(parsedJson.read(\'$.rejectionReason.title\'))') } + @Issue('#111') + def "should execute custom method for request headers"() { + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + urlPath '/get' + headers { + header('authorization', value(consumer('Bearer token'), producer(execute('getOAuthTokenHeader()')))) + } + } + response { + status 200 + body([ + fraudCheckStatus: "OK", + rejectionReason : [ + title: $(consumer(null), producer(execute('assertThatRejectionReasonIsNull($it)'))) + ] + ]) + } + } + MethodBodyBuilder builder = new MockMvcSpockMethodRequestProcessingBodyBuilder(contractDsl, properties) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.given(blockBuilder) + def test = blockBuilder.toString() + then: + test.contains('.header("authorization", getOAuthTokenHeader())') + } + }