From 4464800512c9e0c2f2acd35a1c32f28ba13e92f8 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Sun, 16 Dec 2018 23:10:30 +0100 Subject: [PATCH] Improved reading from file --- .../spec/internal/FromFileProperty.groovy | 4 +- .../JaxRsClientJUnitMethodBodyBuilder.groovy | 9 ++++ ...kMethodRequestProcessingBodyBuilder.groovy | 9 ++++ .../verifier/builder/MethodBodyBuilder.groovy | 7 ++- .../WireMockResponseStubStrategy.groovy | 4 +- .../verifier/util/MapConverter.groovy | 3 ++ .../builder/MethodBodyBuilderSpec.groovy | 44 ++++++++++++++++++- .../verifier/util/SyntaxChecker.groovy | 4 +- .../resources/classpath/readFromFile.groovy | 2 +- .../src/test/resources/classpath/request.json | 4 +- .../test/resources/classpath/response.json | 4 +- 11 files changed, 83 insertions(+), 11 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/JaxRsClientJUnitMethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientJUnitMethodBodyBuilder.groovy index 527df7ebc3..4c9122ec00 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 @@ -108,6 +108,15 @@ class JaxRsClientJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder { } } + @Override + protected String getResponseBodyPropertyComparisonString(String property, FromFileProperty value) { + if (value.isByte()) { + return "assertThat(response.readEntity(byte[].class)).isEqualTo(" + + readBytesFromFileString(value, CommunicationType.RESPONSE) + ")" + } + return getResponseBodyPropertyComparisonString(property, value.asString()) + } + protected void appendMethodAndBody(BlockBuilder bb) { String method = request.method.serverValue.toString().toLowerCase() if (request.body) { 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..a9d4af4e8f 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 @@ -113,6 +113,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 getResponseBodyPropertyComparisonString(property, value.asString()) + } + protected void appendMethodAndBody(BlockBuilder bb) { String method = request.method.serverValue.toString().toLowerCase() if (request.body) { 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 8541fb1199..3602c61a64 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 @@ -377,8 +377,11 @@ abstract class MethodBodyBuilder { ContentType contentType = getResponseContentType() Object convertedResponseBody = responseBody if (convertedResponseBody instanceof FromFileProperty) { - byteResponseBodyCheck(bb, convertedResponseBody) - return + if (convertedResponseBody.isByte()) { + byteResponseBodyCheck(bb, convertedResponseBody) + return + } + convertedResponseBody = convertedResponseBody.asString() } if (convertedResponseBody instanceof GString) { convertedResponseBody = extractValue(convertedResponseBody as GString, contentType, { Object o -> o instanceof DslProperty ? o.serverValue : o }) 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..4d56401a5d 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..a397f58cf6 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,45 @@ 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(applicationJson()) + } + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(' ') + when: + builder.appendTo(blockBuilder) + then: + String test = blockBuilder.toString() + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + test.contains('''assertThatJson(parsedJson).field("['status']").isEqualTo("RESPONSE")''') + 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 +937,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 +953,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/util/SyntaxChecker.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/SyntaxChecker.groovy index 600077e7f5..5dd38775dc 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" @@ -165,4 +167,4 @@ class SyntaxChecker { return true } -} +} \ No newline at end of file diff --git a/spring-cloud-contract-verifier/src/test/resources/classpath/readFromFile.groovy b/spring-cloud-contract-verifier/src/test/resources/classpath/readFromFile.groovy index 7060ee74d5..406715c92f 100644 --- a/spring-cloud-contract-verifier/src/test/resources/classpath/readFromFile.groovy +++ b/spring-cloud-contract-verifier/src/test/resources/classpath/readFromFile.groovy @@ -13,7 +13,7 @@ Contract.make { status OK() body(file("response.json")) headers { - contentType(textPlain()) + contentType(applicationJson()) } } } 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..ec71b368de 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..377bb1eb71 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