Improved reading from file

This commit is contained in:
Marcin Grzejszczak
2018-12-16 23:10:30 +01:00
parent e68448281f
commit 4464800512
11 changed files with 83 additions and 11 deletions

View File

@@ -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() {

View File

@@ -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) {

View File

@@ -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) {

View File

@@ -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 })

View File

@@ -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))

View File

@@ -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
}

View File

@@ -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"));')

View File

@@ -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
}
}
}

View File

@@ -13,7 +13,7 @@ Contract.make {
status OK()
body(file("response.json"))
headers {
contentType(textPlain())
contentType(applicationJson())
}
}
}

View File

@@ -1 +1,3 @@
{ "status" : "REQUEST" }
{
"status": "REQUEST"
}

View File

@@ -1 +1,3 @@
{ "status" : "RESPONSE" }
{
"status": "RESPONSE"
}