From 72b00f6ac86b508709d45612cc3fb32e46ce3996 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Fri, 12 Jun 2015 13:40:54 +0200 Subject: [PATCH] [#79] Fixed the bug with exception with a json and map --- .../builder/SpockMethodBodyBuilder.groovy | 24 ++++++++------- .../builder/SpockMethodBuilderSpec.groovy | 30 +++++++++++++++++++ 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy b/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy index 41734b0a3a..3d44123212 100644 --- a/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy +++ b/accurest-core/src/main/groovy/io/codearte/accurest/builder/SpockMethodBodyBuilder.groovy @@ -3,6 +3,7 @@ package io.codearte.accurest.builder import groovy.json.JsonOutput import groovy.transform.PackageScope import io.codearte.accurest.dsl.GroovyDsl +import io.codearte.accurest.dsl.internal.DslProperty import io.codearte.accurest.dsl.internal.ExecutionProperty import io.codearte.accurest.dsl.internal.Header import io.codearte.accurest.dsl.internal.MatchingStrategy @@ -12,7 +13,6 @@ import io.codearte.accurest.dsl.internal.Response import io.codearte.accurest.dsl.internal.UrlPath import java.util.regex.Pattern - /** * @author Jakub Kubrynski */ @@ -102,9 +102,7 @@ class SpockMethodBodyBuilder { matchingStrategy.serverValue.toString() } - private void processBodyElement(BlockBuilder blockBuilder, String rootProperty, def element) { - def value = element.value - String property = rootProperty + "." + element.key + private void processBodyElement(BlockBuilder blockBuilder, String property, def value) { if (value instanceof String) { if (value.startsWith('$')) { value = value.substring(1).replaceAll('\\$value', "responseBody$property") @@ -114,10 +112,14 @@ class SpockMethodBodyBuilder { } } else if (value instanceof Map) { processMapElement(value, blockBuilder, property) + }else if (value instanceof Map.Entry) { + processEntryElement(blockBuilder, property, value) } else if (value instanceof List) { processArrayElements(value, property, blockBuilder) } else if (value instanceof Pattern) { blockBuilder.addLine("responseBody$property ==~ java.util.regex.Pattern.compile('${value}')") + } else if (value instanceof DslProperty) { + processBodyElement(blockBuilder, property, value.serverValue) } else if (value instanceof ExecutionProperty) { ExecutionProperty exec = (ExecutionProperty) value blockBuilder.addLine("${exec.insertValue("responseBody$property")}") @@ -127,18 +129,20 @@ class SpockMethodBodyBuilder { } private void processMapElement(def value, BlockBuilder blockBuilder, String property) { - value.each { entry -> processBodyElement(blockBuilder, property, entry) } + value.each { entry -> processEntryElement(blockBuilder, property, entry) } + } + + private def processEntryElement(BlockBuilder blockBuilder, String property, def entry) { + return processBodyElement(blockBuilder, property + "." + entry.key, entry.value) } private void processArrayElements(List responseBody, String property, BlockBuilder blockBuilder) { responseBody.eachWithIndex { listElement, listIndex -> - listElement.each { - entry -> processBodyElement(blockBuilder, property + "[$listIndex]", entry) + listElement.each { entry -> + String prop = "$property[$listIndex]" ?: '' + processBodyElement(blockBuilder, prop, entry) } } } - private void processClosure(Closure value, BlockBuilder blockBuilder, String property) { - blockBuilder.addLine() - } } diff --git a/accurest-core/src/test/groovy/io/codearte/accurest/builder/SpockMethodBuilderSpec.groovy b/accurest-core/src/test/groovy/io/codearte/accurest/builder/SpockMethodBuilderSpec.groovy index 0aff49357f..a2d03358a2 100644 --- a/accurest-core/src/test/groovy/io/codearte/accurest/builder/SpockMethodBuilderSpec.groovy +++ b/accurest-core/src/test/groovy/io/codearte/accurest/builder/SpockMethodBuilderSpec.groovy @@ -1,6 +1,7 @@ package io.codearte.accurest.builder import io.codearte.accurest.dsl.GroovyDsl +import spock.lang.Issue import spock.lang.Specification /** @@ -32,6 +33,35 @@ class SpockMethodBuilderSpec extends Specification { blockBuilder.toString().contains("responseBody.property2 == \"b\"") } + @Issue("#79") + def "should generate assertions for simple response body constructed from map"() { + given: + GroovyDsl contractDsl = GroovyDsl.make { + request { + method "GET" + url "test" + } + response { + status 200 + body ( + property1: 'a', + property2: [ + [a: 'sth'], + [b: 'sthElse'] + ] + ) + } + } + 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[0].a == \"sth\"") + blockBuilder.toString().contains("responseBody.property2[1].b == \"sthElse\"") + } + def "should generate assertions for array in response body"() { given: GroovyDsl contractDsl = GroovyDsl.make {