From 746fff410d15591b73887636ba843a1c724cd31c Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Wed, 6 Nov 2019 16:09:24 +0100 Subject: [PATCH] Supports custom charset when reading body from bytes fixes gh-1199 --- .../verifier/builder/MethodBodyBuilder.groovy | 4 ++ .../builder/SingleTestGeneratorSpec.groovy | 32 ++++++++++++++++ .../charset/readFromFileWithCharset.groovy | 38 +++++++++++++++++++ .../src/test/resources/charset/request.json | 3 ++ .../src/test/resources/charset/response.json | 3 ++ 5 files changed, 80 insertions(+) create mode 100644 spring-cloud-contract-verifier/src/test/resources/charset/readFromFileWithCharset.groovy create mode 100644 spring-cloud-contract-verifier/src/test/resources/charset/request.json create mode 100644 spring-cloud-contract-verifier/src/test/resources/charset/response.json 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 208800b244..d19271628d 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 @@ -16,6 +16,7 @@ package org.springframework.cloud.contract.verifier.builder +import java.nio.charset.Charset import java.util.regex.Pattern import groovy.transform.PackageScope @@ -119,6 +120,9 @@ abstract class MethodBodyBuilder implements ClassVerifier { } protected String readStringFromFileString(FromFileProperty property, CommunicationType side) { + if (property.charset != Charset.defaultCharset().toString()) { + return "new String(" + readBytesFromFileString(property, side) + ", \"" + property.charset + "\")" + } return "new String(" + readBytesFromFileString(property, side) + ")" } 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 62e77f54e9..e4bb963e1d 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 @@ -649,6 +649,38 @@ class SingleTestGeneratorSpec extends Specification { testFramework << [JUNIT, JUNIT5, SPOCK] } + @Issue('#1199') + def 'should generate tests with body from file with custom charset [#testFramework]'() { + given: + file = tmpFolder.newFile() + writeContract(file) + tmp = tmpFolder.newFolder() + File classpath = new File(SingleTestGeneratorSpec.class.getResource('/charset/').toURI()) + FileSystemUtils.copyRecursively(classpath, tmp) + and: + File output = new File(tmp, 'readFromFileWithCharset.groovy') + File contractLocation = output + File temp = tmpFolder.newFolder() + and: + ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties( + testFramework: testFramework, contractsDslDir: contractLocation.parentFile, + basePackageForTests: 'a.b', generatedTestSourcesDir: temp, + generatedTestResourcesDir: tmpFolder.newFolder() + ) + TestGenerator testGenerator = new TestGenerator(properties) + when: + int count = testGenerator.generate() + then: + count == 1 + and: + String test = new File(temp, "a/b/ContractVerifier${getTestName(testFramework)}").text + test.contains('readFromFileWithCharset_request_request.json') + test.contains('RESPONSE') + test.contains('body(new String(fileToBytes(this, "readFromFileWithCharset_request_request.json"), "US-ASCII"))') + where: + testFramework << [JUNIT, JUNIT5, SPOCK] + } + @Issue('#260') def "should generate tests in a folder taken from baseClassForTests's package when it is set for [#testFramework]"() { given: diff --git a/spring-cloud-contract-verifier/src/test/resources/charset/readFromFileWithCharset.groovy b/spring-cloud-contract-verifier/src/test/resources/charset/readFromFileWithCharset.groovy new file mode 100644 index 0000000000..4cb2566e69 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/charset/readFromFileWithCharset.groovy @@ -0,0 +1,38 @@ +/* + * Copyright 2013-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + +import java.nio.charset.Charset + +import org.springframework.cloud.contract.spec.Contract + +Contract.make { + request { + method('PUT') + headers { + contentType(applicationJson()) + } + body(file("request.json", Charset.forName("US-ASCII"))) + url("/1") + } + response { + status OK() + body(file("response.json", Charset.forName("US-ASCII"))) + headers { + contentType(applicationJson()) + } + } +} diff --git a/spring-cloud-contract-verifier/src/test/resources/charset/request.json b/spring-cloud-contract-verifier/src/test/resources/charset/request.json new file mode 100644 index 0000000000..26c2b2f565 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/charset/request.json @@ -0,0 +1,3 @@ +{ + "status": "REQUEST" +} diff --git a/spring-cloud-contract-verifier/src/test/resources/charset/response.json b/spring-cloud-contract-verifier/src/test/resources/charset/response.json new file mode 100644 index 0000000000..cb55e0cb2f --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/resources/charset/response.json @@ -0,0 +1,3 @@ +{ + "status": "RESPONSE" +}