From d6098bbf2daa847857619eca59c217ce2c2278de Mon Sep 17 00:00:00 2001 From: abialas Date: Fri, 24 Jan 2020 09:49:15 +0100 Subject: [PATCH] Fix StackOverflow exception when stubTrigger runs contract with body based on json file (#1311) * Fix StackOverflow exception when stubTrigger runs contract with body based on json file * Add test for extracting body value from json file * Extract value from file to map only in case file content is String --- .../verifier/util/BodyExtractor.groovy | 4 ++++ .../verifier/util/BodyExtractorSpec.groovy | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractorSpec.groovy diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractor.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractor.groovy index ed3ec98907..619007006e 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractor.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractor.groovy @@ -24,6 +24,7 @@ import groovy.transform.CompileStatic import org.springframework.cloud.contract.spec.internal.CanBeDynamic import org.springframework.cloud.contract.spec.internal.DslProperty +import org.springframework.cloud.contract.spec.internal.FromFileProperty import org.springframework.cloud.contract.spec.internal.RegexProperty import static ContentUtils.extractValue @@ -89,6 +90,9 @@ class BodyExtractor { else if (bodyValue instanceof DslProperty) { return extractClientValueFromBody(bodyValue.clientValue) } + else if (bodyValue instanceof FromFileProperty && bodyValue.isString()) { + return MapConverter.transformValues(bodyValue.asString(), Closure.IDENTITY) + } else { return MapConverter.transformValues(bodyValue, { Object prop = it instanceof DslProperty ? it.clientValue : it diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractorSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractorSpec.groovy new file mode 100644 index 0000000000..ae321b3038 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/BodyExtractorSpec.groovy @@ -0,0 +1,19 @@ +package org.springframework.cloud.contract.verifier.util + +import org.springframework.cloud.contract.spec.internal.FromFileProperty +import spock.lang.Specification + +/** + * @author Adam BiaƂas + */ +class BodyExtractorSpec extends Specification { + + def "should extract body from json file"() { + given: + def uri = BodyExtractorSpec.getResource("/classpath/response.json").toURI() + def jsonFromFile = new FromFileProperty(new File(uri), String.class) + expect: + ["status" : "RESPONSE"] == BodyExtractor.extractClientValueFromBody(jsonFromFile) + } + +}