Added regex support for text based response

without this change any assertion on a text based response wouldn't work
with this change we start doing regex checks

fixes #150
This commit is contained in:
Marcin Grzejszczak
2016-11-17 12:55:48 +01:00
parent fa3c0035e0
commit d683d3d6f0
8 changed files with 132 additions and 13 deletions

View File

@@ -56,9 +56,19 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
return "contractVerifierMessaging.send(inputMessage, \"${request.messageFrom.serverValue}\")"
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Object value) {
return ""
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, String value) {
return "responseBody$property == \"${value}\""
return ""
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Pattern value) {
return ""
}
@Override
@@ -158,7 +168,7 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
@Override
protected String getBodyString(String bodyAsString) {
return ''
return ""
}
@Override
@@ -172,11 +182,11 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
}
protected String convertHeaderComparison(String headerValue) {
return " == '$headerValue'"
return ""
}
protected String convertHeaderComparison(Pattern headerValue) {
return "==~ java.util.regex.Pattern.compile('$headerValue')"
return ""
}
protected String createHeaderComparison(Object headerValue) {
@@ -189,4 +199,7 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
return "matches(\"$escapedHeader\");"
}
private String patternText(Pattern value) {
return "==~ java.util.regex.Pattern.compile('$value')"
}
}

View File

@@ -71,6 +71,16 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder
return "assertThat(responseBody${property}).isEqualTo(\"${value}\")"
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Object value) {
return getResponseBodyPropertyComparisonString(property, value as String)
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Pattern value) {
return "assertThat(responseBody${property}).${buildEscapedMatchesMethod(value)}"
}
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) {
blockBuilder.addLine("${exec.insertValue("parsedJson.read(\"\\\$$property\")")};")
@@ -149,8 +159,12 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder
}
protected String createHeaderComparison(Pattern headerValue) {
return buildEscapedMatchesMethod(headerValue) + ";"
}
private String buildEscapedMatchesMethod(Pattern headerValue) {
String escapedHeader = convertUnicodeEscapesIfRequired("$headerValue")
return "matches(\"$escapedHeader\");"
return "matches(\"$escapedHeader\")"
}
}

View File

@@ -75,10 +75,22 @@ abstract class MethodBodyBuilder {
/**
* Builds the code that for the given {@code property} will compare it to
* the given {@code value}
* the given Object {@code value}
*/
protected abstract String getResponseBodyPropertyComparisonString(String property, Object value)
/**
* Builds the code that for the given {@code property} will compare it to
* the given String {@code value}
*/
protected abstract String getResponseBodyPropertyComparisonString(String property, String value)
/**
* Builds the code that for the given {@code property} will match it to
* the given regular expression {@code value}
*/
protected abstract String getResponseBodyPropertyComparisonString(String property, Pattern value)
/**
* Appends to the {@link BlockBuilder} the assertion for the given body element
*/
@@ -263,7 +275,7 @@ abstract class MethodBodyBuilder {
// TODO xml validation
} else {
bb.addLine(getSimpleResponseBodyString(getResponseAsString()))
processText(bb, "", convertedResponseBody as String)
processText(bb, "", convertedResponseBody)
addColonIfRequired(bb)
}
}
@@ -286,10 +298,10 @@ abstract class MethodBodyBuilder {
/**
* Appends to {@link BlockBuilder} processing of the given String value.
*/
protected void processText(BlockBuilder blockBuilder, String property, String value) {
if (value.startsWith('$')) {
value = stripFirstChar(value).replaceAll('\\$value', "responseBody$property")
blockBuilder.addLine(value)
protected void processText(BlockBuilder blockBuilder, String property, Object value) {
if (value instanceof String && value.startsWith('$')) {
String newValue = stripFirstChar(value).replaceAll('\\$value', "responseBody$property")
blockBuilder.addLine(newValue)
addColonIfRequired(blockBuilder)
} else {
blockBuilder.addLine(getResponseBodyPropertyComparisonString(property, value))

View File

@@ -52,6 +52,16 @@ class MockMvcJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder {
}
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Object value) {
return null
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Pattern value) {
return null
}
@Override
protected void processHeaderElement(BlockBuilder blockBuilder, String property, String value) {
blockBuilder.addLine("assertThat(response.header(\"$property\")).${createHeaderComparison(value)}")

View File

@@ -51,6 +51,11 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
return "responseBody$property == \"${value}\""
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Pattern value) {
return null
}
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) {
blockBuilder.addLine("${exec.insertValue("parsedJson.read('\\\$$property')")}")
@@ -108,9 +113,14 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
return blockBuilder
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Object value) {
return ""
}
@Override
protected String getPropertyInListString(String property, Integer listIndex) {
"$property[$listIndex]" ?: ''
return "$property[$listIndex]" ?: ''
}
@Override

View File

@@ -50,6 +50,16 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing
return "responseBody$property == \"${value}\""
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Object value) {
return getResponseBodyPropertyComparisonString(property, value as String)
}
@Override
protected String getResponseBodyPropertyComparisonString(String property, Pattern value) {
return "responseBody$property ${patternComparison(value)}"
}
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) {
blockBuilder.addLine("${exec.insertValue("parsedJson.read('\\\$$property')")}")
@@ -129,7 +139,11 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing
}
protected String convertHeaderComparison(Pattern headerValue) {
return "==~ java.util.regex.Pattern.compile('$headerValue')"
return patternComparison(headerValue)
}
private String patternComparison(Pattern pattern) {
return "==~ java.util.regex.Pattern.compile('$pattern')"
}
}

View File

@@ -743,6 +743,29 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
test.contains('assertThatRejectionReasonIsNull(parsedJson.read("$.get("rejectionReason").title"));')
}
@Issue('#150')
def "should support body matching in response"() {
given:
Contract contractDsl = Contract.make {
request {
method 'GET'
url '/get'
}
response {
status 200
status 200
body(value(stub("HELLO FROM STUB"), server(regex(".*"))))
}
}
MethodBodyBuilder builder = new JaxRsClientJUnitMethodBodyBuilder(contractDsl, properties)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.then(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains("assertThat(responseBody).matches(\".*\");")
}
private String stripped(String string) {
return string.stripMargin().stripIndent().replace('\t', '').replace('\n', '').replace(' ','')
}

View File

@@ -1622,4 +1622,27 @@ World.'''"""
test.contains('.header("authorization", getOAuthTokenHeader())')
}
@Issue('#150')
def "should support body matching in response"() {
given:
Contract contractDsl = Contract.make {
request {
method 'GET'
url '/get'
}
response {
status 200
status 200
body(value(stub("HELLO FROM STUB"), server(regex(".*"))))
}
}
MethodBodyBuilder builder = new MockMvcSpockMethodRequestProcessingBodyBuilder(contractDsl, properties)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.then(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains("responseBody ==~ java.util.regex.Pattern.compile('.*')")
}
}