From a8b964884ec2140aed94c188e6ee1dcf9c81a839 Mon Sep 17 00:00:00 2001 From: Jakub Kubrynski Date: Mon, 13 Apr 2015 18:42:41 +0200 Subject: [PATCH] Fix #48 - Assertions for array in response body --- .../builder/SpockMethodBodyBuilder.groovy | 25 +++++- ...pec.groovy => GeneratorScannerSpec.groovy} | 2 +- .../builder/SpockMethodBuilderSpec.groovy | 87 +++++++++++++++++++ 3 files changed, 110 insertions(+), 4 deletions(-) rename accurest-core/src/test/groovy/io/codearte/accurest/{TestGeneratorSpec.groovy => GeneratorScannerSpec.groovy} (97%) create mode 100644 accurest-core/src/test/groovy/io/coderate/accurest/builder/SpockMethodBuilderSpec.groovy diff --git a/accurest-core/src/main/groovy/io/coderate/accurest/builder/SpockMethodBodyBuilder.groovy b/accurest-core/src/main/groovy/io/coderate/accurest/builder/SpockMethodBodyBuilder.groovy index fc7abc910f..f8b9a62eff 100644 --- a/accurest-core/src/main/groovy/io/coderate/accurest/builder/SpockMethodBodyBuilder.groovy +++ b/accurest-core/src/main/groovy/io/coderate/accurest/builder/SpockMethodBodyBuilder.groovy @@ -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) + } + } + } } diff --git a/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy b/accurest-core/src/test/groovy/io/codearte/accurest/GeneratorScannerSpec.groovy similarity index 97% rename from accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy rename to accurest-core/src/test/groovy/io/codearte/accurest/GeneratorScannerSpec.groovy index 84eb77ab58..97aa6df799 100644 --- a/accurest-core/src/test/groovy/io/codearte/accurest/TestGeneratorSpec.groovy +++ b/accurest-core/src/test/groovy/io/codearte/accurest/GeneratorScannerSpec.groovy @@ -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) diff --git a/accurest-core/src/test/groovy/io/coderate/accurest/builder/SpockMethodBuilderSpec.groovy b/accurest-core/src/test/groovy/io/coderate/accurest/builder/SpockMethodBuilderSpec.groovy new file mode 100644 index 0000000000..6aad086cd2 --- /dev/null +++ b/accurest-core/src/test/groovy/io/coderate/accurest/builder/SpockMethodBuilderSpec.groovy @@ -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\"") + } +}