From e3d5f9bfff0d8cecc61f24cc09dd8663a8093cf6 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Tue, 31 Dec 2019 10:41:06 +0100 Subject: [PATCH] When using file(...) we can guess the content type; fixes gh-880 --- .../spec/internal/FromFileProperty.groovy | 8 +++++ .../verifier/builder/MethodBodyBuilder.groovy | 2 ++ ...vcMethodBodyBuilderWithMatchersSpec.groovy | 35 +++++++++++++++++++ .../src/test/resources/getBody.json | 17 +++++++++ .../restdocs/WireMockVerifyHelper.java | 6 ++-- 5 files changed, 65 insertions(+), 3 deletions(-) create mode 100644 spring-cloud-contract-verifier/src/test/resources/getBody.json 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 85456c1363..ed4ed5892d 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 @@ -66,6 +66,14 @@ class FromFileProperty implements Serializable { return this.file.bytes } + boolean isJson() { + return this.fileName().endsWith(".json") + } + + boolean isXml() { + return this.fileName().endsWith(".xml") + } + @Override String toString() { return asString() 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 c64c71ea13..fe0ddce1e0 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 @@ -423,6 +423,8 @@ abstract class MethodBodyBuilder implements ClassVerifier { byteResponseBodyCheck(bb, convertedResponseBody) return } + contentType = convertedResponseBody.isJson() ? JSON : + convertedResponseBody.isXml() ? XML : contentType convertedResponseBody = convertedResponseBody.asString() } if (convertedResponseBody instanceof GString) { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy index 269ad318b5..0257fbbd17 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderWithMatchersSpec.groovy @@ -661,4 +661,39 @@ class MockMvcMethodBodyBuilderWithMatchersSpec extends Specification implements WebTestClientJUnitMethodBodyBuilder.simpleName | { Contract dsl -> new WebTestClientJUnitMethodBodyBuilder(dsl, properties, generatedClassDataForMethod) } } + @Issue('#880') + def 'should not generate a null statement when there is no content type in the response [#methodBuilderName]'() { + given: + Contract contractDsl = Contract.make { + description 'Should return 200' + request { + method POST() + url("/get") + headers { + contentType("application/json;charset=UTF-8") + } + } + response { + status OK() + body(file("getBody.json")) + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + and: + builder.appendTo(blockBuilder) + String test = blockBuilder.toString() + when: + SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test) + then: + !test.contains('null') + 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) } + } + } diff --git a/spring-cloud-contract-verifier/src/test/resources/getBody.json b/spring-cloud-contract-verifier/src/test/resources/getBody.json new file mode 100644 index 0000000000..faf8d9b132 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/getBody.json @@ -0,0 +1,17 @@ +[ + { + "array": [ + "a", + "b" + ] + }, + { + "array": [ + "a", + "b" + ] + }, + { + "array": [] + } +] \ No newline at end of file diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java index a64d9ab4dd..2387f59b4d 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockVerifyHelper.java @@ -59,10 +59,10 @@ public abstract class WireMockVerifyHelper configuration = getConfiguration(result); byte[] requestBodyContent = getRequestBodyContent(result); if (requestBodyContent != null) { - String actual = new String(requestBodyContent, - Charset.forName("UTF-8")); + String actual = new String(requestBodyContent, Charset.forName("UTF-8")); for (JsonPath jsonPath : this.jsonPaths.values()) { - new JsonPathValue(jsonPath, actual).assertHasValue(Object.class, "an object"); + new JsonPathValue(jsonPath, actual).assertHasValue(Object.class, + "an object"); } } configuration.put("contract.jsonPaths", this.jsonPaths.keySet());