Fix #48 - Assertions for array in response body

This commit is contained in:
Jakub Kubrynski
2015-04-13 18:42:41 +02:00
parent dca1fbcf30
commit a8b964884e
3 changed files with 110 additions and 4 deletions

View File

@@ -1,4 +1,5 @@
package io.coderate.accurest.builder
import groovy.json.JsonOutput
import groovy.transform.PackageScope
import io.coderate.accurest.dsl.GroovyDsl
@@ -46,8 +47,11 @@ class SpockMethodBodyBuilder {
blockBuilder.endBlock()
blockBuilder.addLine('and:').startBlock()
blockBuilder.addLine('def responseBody = new JsonSlurper().parseText(response.body.asString())')
stubDefinition.response.body.serverValue.each {
processBodyElement(blockBuilder, "", it)
def responseBody = stubDefinition.response.body.serverValue
if (responseBody instanceof List) {
processArrayElements(responseBody, "", blockBuilder)
} else {
processMapElement(responseBody, blockBuilder, "")
}
}
blockBuilder.endBlock()
@@ -66,9 +70,24 @@ class SpockMethodBodyBuilder {
blockBuilder.addLine("responseBody$property == \"${value}\"")
}
} else if (value instanceof Map) {
value.each { entry -> processBodyElement(blockBuilder, property, entry) }
processMapElement(value, blockBuilder, property)
} else if (value instanceof List) {
processArrayElements(value, property, blockBuilder)
} else {
blockBuilder.addLine("responseBody$property == ${value}")
}
}
private void processMapElement(def value, BlockBuilder blockBuilder, String property) {
value.each { entry -> processBodyElement(blockBuilder, property, entry) }
}
private void processArrayElements(List responseBody, String property, BlockBuilder blockBuilder) {
responseBody.eachWithIndex {
listElement, listIndex ->
listElement.each {
entry -> processBodyElement(blockBuilder, property + "[$listIndex]", entry)
}
}
}
}

View File

@@ -6,7 +6,7 @@ import io.coderate.accurest.TestGenerator
import io.coderate.accurest.config.AccurestConfigProperties
import spock.lang.Specification
class TestGeneratorSpec extends Specification {
class GeneratorScannerSpec extends Specification {
private SingleTestGenerator classGenerator = Mock(SingleTestGenerator)

View File

@@ -0,0 +1,87 @@
package io.coderate.accurest.builder
import io.coderate.accurest.dsl.GroovyDsl
import spock.lang.Specification
/**
* @author Jakub Kubrynski
*/
class SpockMethodBuilderSpec extends Specification {
def "should generate assertions for simple response body"() {
given:
GroovyDsl contractDsl = GroovyDsl.make {
request {
method "GET"
url "test"
}
response {
status 200
body """{
"property1": "a",
"property2": "b"
}"""
}
}
SpockMethodBodyBuilder builder = new SpockMethodBodyBuilder(contractDsl)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.appendTo(blockBuilder)
then:
blockBuilder.toString().contains("responseBody.property1 == \"a\"")
blockBuilder.toString().contains("responseBody.property2 == \"b\"")
}
def "should generate assertions for array in response body"() {
given:
GroovyDsl contractDsl = GroovyDsl.make {
request {
method "GET"
url "test"
}
response {
status 200
body """[
{
"property1": "a"
},
{
"property2": "b"
}]"""
}
}
SpockMethodBodyBuilder builder = new SpockMethodBodyBuilder(contractDsl)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.appendTo(blockBuilder)
then:
blockBuilder.toString().contains("responseBody[0].property1 == \"a\"")
blockBuilder.toString().contains("responseBody[1].property2 == \"b\"")
}
def "should generate assertions for array inside response body element"() {
given:
GroovyDsl contractDsl = GroovyDsl.make {
request {
method "GET"
url "test"
}
response {
status 200
body """{
"property1": [
{ "property2": "test1"},
{ "property3": "test2"}
]
}"""
}
}
SpockMethodBodyBuilder builder = new SpockMethodBodyBuilder(contractDsl)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.appendTo(blockBuilder)
then:
blockBuilder.toString().contains("responseBody.property1[0].property2 == \"test1\"")
blockBuilder.toString().contains("responseBody.property1[1].property3 == \"test2\"")
}
}