diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/BodyReader.java b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/BodyReader.java index 5a6aa6c6d4..6e6ae84e45 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/BodyReader.java +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/BodyReader.java @@ -18,6 +18,7 @@ package org.springframework.cloud.contract.verifier.builder; import java.io.File; import java.io.IOException; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; @@ -41,6 +42,10 @@ class BodyReader { String readStringFromFileString(SingleContractMetadata metadata, FromFileProperty property, CommunicationType side) { + if (!Charset.defaultCharset().toString().equals(property.getCharset())) { + return "new String(" + readBytesFromFileString(metadata, property, side) + + ", \"" + property.getCharset() + "\")"; + } return "new String(" + readBytesFromFileString(metadata, 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 00166d3b09..b5ed0c55f4 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 @@ -624,6 +624,38 @@ class SingleTestGeneratorSpec extends Specification { testFramework << [JUNIT, JUNIT5, TESTNG, 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" +}