From 923faef7d3d76e7e33b79a365f136cf32bf78802 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sun, 16 Dec 2018 22:39:28 +0100 Subject: [PATCH] Fixed invalid multiline json reading --- .../spec/internal/FromFileProperty.groovy | 4 +- .../JUnitMessagingMethodBodyBuilder.groovy | 3 +- .../builder/JUnitMethodBodyBuilder.groovy | 2 +- .../JaxRsClientJUnitMethodBodyBuilder.groovy | 9 ++++ ...kMethodRequestProcessingBodyBuilder.groovy | 9 ++++ .../SpockMessagingMethodBodyBuilder.groovy | 3 +- ...kMethodRequestProcessingBodyBuilder.groovy | 2 +- .../WireMockResponseStubStrategy.groovy | 4 +- .../verifier/util/MapConverter.groovy | 3 ++ .../builder/MethodBodyBuilderSpec.groovy | 42 ++++++++++++++++++- .../builder/SingleTestGeneratorSpec.groovy | 10 ++--- .../verifier/util/SyntaxChecker.groovy | 2 + .../src/test/resources/classpath/request.json | 4 +- .../test/resources/classpath/response.json | 4 +- 14 files changed, 85 insertions(+), 16 deletions(-) diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromFileProperty.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromFileProperty.groovy index b472c8f3d7..b3416238cc 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromFileProperty.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/FromFileProperty.groovy @@ -33,7 +33,7 @@ import java.nio.charset.Charset class FromFileProperty implements Serializable { final File file - final Charset charset + final String charset final Class type FromFileProperty(File file, Class type) { @@ -43,7 +43,7 @@ class FromFileProperty implements Serializable { FromFileProperty(File file, Class type, Charset charset) { this.file = file this.type = type - this.charset = charset + this.charset = charset.toString() } boolean isString() { 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 887e67991b..a1a0270af1 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 @@ -91,7 +91,8 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { return "assertThat(response.getPayloadAsByteArray()).isEqualTo(" + readBytesFromFileString(value, CommunicationType.RESPONSE) + ")" } - return getResponseBodyPropertyComparisonString(property, value.asString()) + return "assertThat(response.getPayload()).isEqualTo(" + + readStringFromFileString(value, CommunicationType.RESPONSE) +")" } @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 282575ff39..c68cfe84c2 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 @@ -126,7 +126,7 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder return "assertThat(response.getBody().asByteArray()).isEqualTo(" + readBytesFromFileString(value, CommunicationType.RESPONSE) + ")" } - return getResponseBodyPropertyComparisonString(property, value.asString()) + return "assertThat(response.getBody()).isEqualTo(" + readStringFromFileString(value, CommunicationType.RESPONSE) + ")" } @Override 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 527df7ebc3..aad6c82d35 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 @@ -164,6 +164,15 @@ class JaxRsClientJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder { bb.addLine("assertThat(response.getStatus()).isEqualTo($response.status.serverValue);") } + @Override + protected String getResponseBodyPropertyComparisonString(String property, FromFileProperty value) { + if (value.isByte()) { + return "assertThat(response.readEntity(byte[].class)).isEqualTo(" + + readBytesFromFileString(value, CommunicationType.RESPONSE) + ")" + } + return "assertThat(response.readEntity(String.class)).isEqualTo(" + readStringFromFileString(value, CommunicationType.RESPONSE) + ")" + } + @Override protected void validateResponseHeadersBlock(BlockBuilder bb) { response.headers?.executeForEachHeader { Header header -> 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 abaec03f84..a92cf917df 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 @@ -77,6 +77,15 @@ class JaxRsClientSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequ } } + @Override + protected String getResponseBodyPropertyComparisonString(String property, FromFileProperty value) { + if (value.isByte()) { + return "response.readEntity(byte[]) == " + + readBytesFromFileString(value, CommunicationType.RESPONSE) + } + return "response.readEntity(String) == " + readStringFromFileString(value, CommunicationType.RESPONSE) + } + protected void appendRequestWithRequiredResponseContentType(BlockBuilder bb) { String acceptHeader = getHeader("Accept") if (acceptHeader) { 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 fd046101bb..720c050ffb 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 @@ -169,7 +169,8 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder { return "response.payloadAsByteArray == " + readBytesFromFileString(value, CommunicationType.RESPONSE) } - return getResponseBodyPropertyComparisonString(property, value.asString()) + return "response.payload == " + + readStringFromFileString(value, CommunicationType.RESPONSE) } @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 e904b2b59d..1df42b117f 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 @@ -113,7 +113,7 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing return "response.body.asByteArray() == " + readBytesFromFileString(value, CommunicationType.RESPONSE) } - return getResponseBodyPropertyComparisonString(property, value.asString()) + return "response.body == " + readStringFromFileString(value, CommunicationType.RESPONSE) } @Override diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy index 211fddd54d..4ddb43ac9f 100755 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockResponseStubStrategy.groovy @@ -90,7 +90,9 @@ class WireMockResponseStubStrategy extends BaseWireMockStubStrategy { if (contentType == ContentType.UNKNOWN) { contentType = recognizeContentTypeFromContent(body) } - if (body instanceof FromFileProperty && body.isByte()) { + if (body instanceof byte[]) { + builder.withBody(body) + } else if (body instanceof FromFileProperty && body.isByte()) { builder.withBody(body.asBytes()) } else { builder.withBody(parseBody(body, contentType)) diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy index 6b9c045806..de6b633b06 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/MapConverter.groovy @@ -18,6 +18,7 @@ package org.springframework.cloud.contract.verifier.util import groovy.json.JsonSlurper import org.springframework.cloud.contract.spec.internal.DslProperty +import org.springframework.cloud.contract.spec.internal.FromFileProperty import org.springframework.cloud.contract.verifier.template.HandlebarsTemplateProcessor import org.springframework.cloud.contract.verifier.template.TemplateProcessor /** @@ -130,6 +131,8 @@ class MapConverter { } return it }) + } else if (it instanceof FromFileProperty) { + return it.isByte() ? it.asBytes() : it.asString() } return it } 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 b1603e15a0..28b647e21e 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 @@ -785,6 +785,43 @@ DocumentContext parsedJson = JsonPath.parse(json); WebTestClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new WebTestClientJUnitMethodBodyBuilder(dsl, properties, classDataForMethod) } } + def 'should work with files that have new lines [#methodBuilderName]'() { + given: + Contract contractDsl = Contract.make { + request { + method('PUT') + headers { + contentType(applicationJson()) + } + body(file("classpath/request.json")) + url("/1") + } + response { + status OK() + body(file("classpath/response.json")) + headers { + contentType(textPlain()) + } + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(' ') + when: + builder.appendTo(blockBuilder) + then: + String test = blockBuilder.toString() + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + and: + stubMappingIsValidWireMockStub(contractDsl) + where: + methodBuilderName | methodBuilder + HttpSpockMethodRequestProcessingBodyBuilder.simpleName | { Contract dsl -> new HttpSpockMethodRequestProcessingBodyBuilder(dsl, properties, classDataForMethod) } + MockMvcJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties, classDataForMethod) } + JaxRsClientSpockMethodRequestProcessingBodyBuilder.simpleName | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties, classDataForMethod) } + JaxRsClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties, classDataForMethod) } + WebTestClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new WebTestClientJUnitMethodBodyBuilder(dsl, properties, classDataForMethod) } + } + @Issue('#509') def 'classToCheck() should return class of object'() { given: @@ -898,6 +935,7 @@ DocumentContext parsedJson = JsonPath.parse(json); String test = blockBuilder.toString() requestMatcher(test) responseMatcher(test) + SyntaxChecker.tryToCompile(methodBuilderName, test) where: methodBuilderName | methodBuilder | requestMatcher | responseMatcher HttpSpockMethodRequestProcessingBodyBuilder.simpleName | { Contract dsl -> new HttpSpockMethodRequestProcessingBodyBuilder(dsl, properties, classDataForMethod) } | { String string -> @@ -913,12 +951,12 @@ DocumentContext parsedJson = JsonPath.parse(json); JaxRsClientSpockMethodRequestProcessingBodyBuilder.simpleName | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties, classDataForMethod) } | { String string -> string.contains('entity(fileToBytes(this, "some_method_request_request.pdf")') } | { String string -> - string.contains('response.body.asByteArray() == fileToBytes(this, "some_method_response_response.pdf")') + string.contains('response.readEntity(byte[]) == fileToBytes(this, "some_method_response_response.pdf")') } JaxRsClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties, classDataForMethod) } | { String string -> string.contains('entity(fileToBytes(this, "some_method_request_request.pdf")') } | { String string -> - string.contains('assertThat(response.getBody().asByteArray()).isEqualTo(fileToBytes(this, "some_method_response_response.pdf"));') + string.contains('assertThat(response.readEntity(byte[].class)).isEqualTo(fileToBytes(this, "some_method_response_response.pdf"));') } WebTestClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new WebTestClientJUnitMethodBodyBuilder(dsl, properties, classDataForMethod) } | { String string -> string.contains('.body(fileToBytes(this, "some_method_request_request.pdf"));') diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy index 05d10f3f1b..59c858daef 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/SingleTestGeneratorSpec.groovy @@ -614,7 +614,7 @@ class SingleTestGeneratorSpec extends Specification { and: String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text test.contains('readFromFile_request_request.json') - test.contains('RESPONSE') + test.contains('readFromFile_response_response.json') where: testFramework << [JUNIT, JUNIT5, SPOCK] } @@ -639,7 +639,7 @@ class SingleTestGeneratorSpec extends Specification { and: String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text test.contains('readFromFile_request_request.json') - test.contains('RESPONSE') + test.contains('readFromFile_response_response.json') where: testFramework << [JUNIT, JUNIT5, SPOCK] } @@ -664,7 +664,7 @@ class SingleTestGeneratorSpec extends Specification { and: String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text test.contains('readFromFile_request_request.json') - test.contains('RESPONSE') + test.contains('readFromFile_response_response.json') where: testFramework << [JUNIT, JUNIT5, SPOCK] } @@ -689,7 +689,7 @@ class SingleTestGeneratorSpec extends Specification { and: String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text test.contains('readFromFile_request_request.json') - test.contains('RESPONSE') + test.contains('readFromFile_response_response.json') where: testFramework << [JUNIT, JUNIT5, SPOCK] } @@ -713,7 +713,7 @@ class SingleTestGeneratorSpec extends Specification { and: String test = new File(temp, "org/springframework/cloud/contract/verifier/tests/ContractVerifier${getTestName(testFramework)}").text test.contains('readFromFile_request_request.json') - test.contains('RESPONSE') + test.contains('readFromFile_response_response.json') where: testFramework << [JUNIT, JUNIT5, SPOCK] } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy index 600077e7f5..ffe23cf1b9 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy @@ -67,6 +67,7 @@ class SyntaxChecker { "${RestAssuredMockMvc.name}.when", "${RestAssured.name}.*", "${Entity.name}.*", + "${ContractVerifierUtil.name}.fileToBytes", "${ContractVerifierMessagingUtil.name}.headers", "${JsonAssertion.name}.assertThatJson", "${SpringCloudContractAssertions.name}.assertThat" @@ -75,6 +76,7 @@ class SyntaxChecker { private static final String WEB_TEST_CLIENT_STATIC_IMPORTS = [ "${RestAssuredWebTestClient.name}.*", "${Entity.name}.*", + "${ContractVerifierUtil.name}.fileToBytes", "${ContractVerifierMessagingUtil.name}.headers", "${JsonAssertion.name}.assertThatJson", "${SpringCloudContractAssertions.name}.assertThat" diff --git a/spring-cloud-contract-verifier/src/test/resources/classpath/request.json b/spring-cloud-contract-verifier/src/test/resources/classpath/request.json index 51674161be..47012fac7f 100644 --- a/spring-cloud-contract-verifier/src/test/resources/classpath/request.json +++ b/spring-cloud-contract-verifier/src/test/resources/classpath/request.json @@ -1 +1,3 @@ -{ "status" : "REQUEST" } \ No newline at end of file +{ + "status" : "REQUEST" +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/test/resources/classpath/response.json b/spring-cloud-contract-verifier/src/test/resources/classpath/response.json index b7561f66d1..2d75dce26d 100644 --- a/spring-cloud-contract-verifier/src/test/resources/classpath/response.json +++ b/spring-cloud-contract-verifier/src/test/resources/classpath/response.json @@ -1 +1,3 @@ -{ "status" : "RESPONSE" } \ No newline at end of file +{ + "status" : "RESPONSE" +} \ No newline at end of file