Fixed broken response headers assertions

fixes #318
This commit is contained in:
Marcin Grzejszczak
2017-06-05 11:29:43 +02:00
parent 4631ab6ea8
commit b158ed4919
8 changed files with 131 additions and 9 deletions

View File

@@ -24,7 +24,9 @@ import org.springframework.cloud.contract.spec.internal.ExecutionProperty
import org.springframework.cloud.contract.spec.internal.Header
import org.springframework.cloud.contract.spec.internal.Input
import org.springframework.cloud.contract.spec.internal.NamedProperty
import org.springframework.cloud.contract.spec.internal.NotToEscapePattern
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.util.MapConverter
import java.util.regex.Pattern
@@ -92,6 +94,12 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
blockBuilder.addLine("assertThat(response.getHeader(\"$property\").toString()).${createHeaderComparison(value)}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Number value) {
blockBuilder.addLine("assertThat(response.getHeader(\"$property\")).isNotNull();")
blockBuilder.addLine("assertThat(response.getHeader(\"$property\")).isEqualTo(${value});")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Pattern pattern) {
blockBuilder.addLine("assertThat(response.getHeader(\"$property\")).isNotNull();")
@@ -114,7 +122,9 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
bb.addLine("""ContractVerifierMessage response = contractVerifierMessaging.receive("${outputMessage.sentTo.serverValue}");""")
bb.addLine("""assertThat(response).isNotNull();""")
outputMessage.headers?.executeForEachHeader { Header header ->
processHeaderElement(bb, header.name, header.serverValue)
processHeaderElement(bb, header.name, header.serverValue instanceof NotToEscapePattern ?
header.serverValue :
MapConverter.getTestSideValues(header.serverValue))
}
}

View File

@@ -21,6 +21,7 @@ import groovy.transform.TypeChecked
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.spec.internal.DslProperty
import org.springframework.cloud.contract.spec.internal.Header
import org.springframework.cloud.contract.spec.internal.NotToEscapePattern
import org.springframework.cloud.contract.spec.internal.QueryParameter
import org.springframework.cloud.contract.spec.internal.ExecutionProperty
import org.springframework.cloud.contract.spec.internal.QueryParameters
@@ -136,7 +137,9 @@ class JaxRsClientJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder {
@Override
protected void validateResponseHeadersBlock(BlockBuilder bb) {
response.headers?.executeForEachHeader { Header header ->
processHeaderElement(bb, header.name, header.serverValue)
processHeaderElement(bb, header.name, header.serverValue instanceof NotToEscapePattern ?
header.serverValue :
MapConverter.getTestSideValues(header.serverValue))
}
}
@@ -149,11 +152,26 @@ class JaxRsClientJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder {
return 'responseAsString'
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Object value) {
if (value instanceof NotToEscapePattern) {
blockBuilder.addLine("assertThat(response.getHeaderString(\"$property\")).${createHeaderComparison(((NotToEscapePattern) value).serverValue)}")
} else {
// fallback
processHeaderElement(blockBuilder, property, value.toString())
}
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, String value) {
blockBuilder.addLine("assertThat(response.getHeaderString(\"$property\")).${createHeaderComparison(value)}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Number value) {
blockBuilder.addLine("assertThat(response.getHeaderString(\"$property\")).isEqualTo(${value});")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Pattern pattern) {
blockBuilder.addLine("assertThat(response.getHeaderString(\"$property\")).${createHeaderComparison(pattern)}")

View File

@@ -21,6 +21,7 @@ import groovy.transform.TypeChecked
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.spec.internal.DslProperty
import org.springframework.cloud.contract.spec.internal.Header
import org.springframework.cloud.contract.spec.internal.NotToEscapePattern
import org.springframework.cloud.contract.spec.internal.QueryParameter
import org.springframework.cloud.contract.spec.internal.QueryParameters
import org.springframework.cloud.contract.spec.internal.ExecutionProperty
@@ -136,7 +137,9 @@ class JaxRsClientSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequ
@Override
protected void validateResponseHeadersBlock(BlockBuilder bb) {
response.headers?.executeForEachHeader { Header header ->
processHeaderElement(bb, header.name, header.serverValue)
processHeaderElement(bb, header.name, header.serverValue instanceof NotToEscapePattern ?
header.serverValue :
MapConverter.getTestSideValues(header.serverValue))
}
}
@@ -145,6 +148,16 @@ class JaxRsClientSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequ
return 'responseAsString'
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Object value) {
if (value instanceof NotToEscapePattern) {
blockBuilder.addLine("response.getHeaderString('$property') ${convertHeaderComparison(((NotToEscapePattern) value).serverValue)}")
} else {
// fallback
processHeaderElement(blockBuilder, property, value.toString())
}
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) {
blockBuilder.addLine("${exec.insertValue("response.getHeaderString(\'$property\')")}")
@@ -155,6 +168,11 @@ class JaxRsClientSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequ
blockBuilder.addLine("response.getHeaderString('$property') ${convertHeaderComparison(value)}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Number value) {
blockBuilder.addLine("response.getHeaderString('$property') == ${value}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Pattern value) {
blockBuilder.addLine("response.getHeaderString('$property') ${convertHeaderComparison(value)}")

View File

@@ -165,6 +165,11 @@ abstract class MethodBodyBuilder {
*/
protected abstract void processHeaderElement(BlockBuilder blockBuilder, String property, GString value)
/**
* Appends to the {@link BlockBuilder} the assertion for the given header path
*/
protected abstract void processHeaderElement(BlockBuilder blockBuilder, String property, Number value)
/**
* Appends to the {@link BlockBuilder} the code to retrieve a value for a property
* from the list with the given index

View File

@@ -23,6 +23,7 @@ import org.springframework.cloud.contract.spec.internal.ExecutionProperty
import org.springframework.cloud.contract.spec.internal.Header
import org.springframework.cloud.contract.spec.internal.NotToEscapePattern
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.util.MapConverter
import java.util.regex.Pattern
/**
@@ -46,7 +47,9 @@ class MockMvcSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequestP
@Override
protected void validateResponseHeadersBlock(BlockBuilder bb) {
response.headers?.executeForEachHeader { Header header ->
processHeaderElement(bb, header.name, header.serverValue)
processHeaderElement(bb, header.name, header.serverValue instanceof NotToEscapePattern ?
header.serverValue :
MapConverter.getTestSideValues(header.serverValue))
}
}
@@ -59,10 +62,18 @@ class MockMvcSpockMethodRequestProcessingBodyBuilder extends SpockMethodRequestP
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Object value) {
if (value instanceof NotToEscapePattern) {
blockBuilder.addLine("response.header('$property') " +
"${patternComparison(value.serverValue.pattern().replace("\\", "\\\\"))}")
"${patternComparison(((NotToEscapePattern) value).serverValue.pattern().replace("\\", "\\\\"))}")
} else {
// fallback
processHeaderElement(blockBuilder, property, value.toString())
}
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Number number) {
blockBuilder.addLine("response.header('$property') == ${number}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) {
blockBuilder.addLine("${exec.insertValue("response.header(\'$property\')")}")

View File

@@ -23,9 +23,9 @@ import org.springframework.cloud.contract.spec.internal.ExecutionProperty
import org.springframework.cloud.contract.spec.internal.Header
import org.springframework.cloud.contract.spec.internal.NotToEscapePattern
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.util.MapConverter
import java.util.regex.Pattern
/**
* A {@link JUnitMethodBodyBuilder} implementation that uses Rest Assured.
*
@@ -48,8 +48,10 @@ class RestAssuredJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder {
@Override
protected void validateResponseHeadersBlock(BlockBuilder bb) {
response.headers?.executeForEachHeader { Header header ->\
processHeaderElement(bb, header.name, header.serverValue)
response.headers?.executeForEachHeader { Header header ->
processHeaderElement(bb, header.name, header.serverValue instanceof NotToEscapePattern ?
header.serverValue :
MapConverter.getTestSideValues(header.serverValue))
}
}
@@ -68,6 +70,9 @@ class RestAssuredJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder {
if (value instanceof NotToEscapePattern) {
blockBuilder.addLine("assertThat(response.header(\"$property\"))." +
"${createMatchesMethod((value as NotToEscapePattern).serverValue.pattern().replace("\\", "\\\\"))};")
} else {
// fallback
processHeaderElement(blockBuilder, property, value.toString())
}
}
@@ -76,6 +81,11 @@ class RestAssuredJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder {
blockBuilder.addLine("assertThat(response.header(\"$property\")).${createHeaderComparison(value)}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Number value) {
blockBuilder.addLine("assertThat(response.header(\"$property\")).isEqualTo(${value});")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Pattern pattern) {
blockBuilder.addLine("assertThat(response.header(\"$property\")).${createHeaderComparison(pattern)}")

View File

@@ -24,7 +24,9 @@ import org.springframework.cloud.contract.spec.internal.ExecutionProperty
import org.springframework.cloud.contract.spec.internal.Header
import org.springframework.cloud.contract.spec.internal.Input
import org.springframework.cloud.contract.spec.internal.NamedProperty
import org.springframework.cloud.contract.spec.internal.NotToEscapePattern
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.util.MapConverter
import java.util.regex.Pattern
/**
@@ -81,6 +83,11 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
blockBuilder.addLine("response.getHeader('$property')?.toString() ${convertHeaderComparison(value)}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Number value) {
blockBuilder.addLine("response.getHeader('$property') == ${value}")
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Pattern value) {
blockBuilder.addLine("response.getHeader('$property')?.toString() ${convertHeaderComparison(value)}")
@@ -99,7 +106,9 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
@Override
protected void validateResponseHeadersBlock(BlockBuilder bb) {
outputMessage.headers?.executeForEachHeader { Header header ->
processHeaderElement(bb, header.name, header.serverValue)
processHeaderElement(bb, header.name, header.serverValue instanceof NotToEscapePattern ?
header.serverValue :
MapConverter.getTestSideValues(header.serverValue))
}
}

View File

@@ -240,4 +240,45 @@ DocumentContext parsedJson = JsonPath.parse(json);
"JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) }
}
@Issue('#318')
def "should assert the response headers properly [#methodBuilderName]"() {
given:
def contractDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
method 'POST'
urlPath '/documents/app_statement_v1'
headers {
contentType(applicationPdf())
}
body([
PESEL: "77100604360",
CLIENT_NAME: "STANISLAW STASZIC",
STATEMENT_NUMBER: "00200001/C4/2017/1"
])
}
response {
status 200
headers {
contentType(applicationPdf())
header('Content-Length': 4)
}
}
}
MethodBodyBuilder builder = methodBuilder(contractDsl)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.appendTo(blockBuilder)
def test = blockBuilder.toString()
then:
SyntaxChecker.tryToCompile(methodBuilderName, test)
asserter(test)
where:
methodBuilderName | methodBuilder | asserter
"MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | { String testBody -> testBody.contains("response.header('Content-Length') == 4") && testBody.contains("response.header('Content-Type') ==~ java.util.regex.Pattern.compile('application/pdf.*')") }
"MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } | { String testBody -> testBody.contains('assertThat(response.header("Content-Length")).isEqualTo(4);') && testBody.contains('assertThat(response.header("Content-Type")).matches("application/pdf.*");') }
"JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | { String testBody -> testBody.contains("response.getHeaderString('Content-Length') == 4") && testBody.contains(" response.getHeaderString('Content-Type') ==~ java.util.regex.Pattern.compile('application/pdf.*')") }
"JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } | { String testBody -> testBody.contains('assertThat(response.getHeaderString("Content-Length")).isEqualTo(4);') && testBody.contains('assertThat(response.getHeaderString("Content-Type")).matches("application/pdf.*");') }
}
}