diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/DelegatingJsonVerifiable.java b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/DelegatingJsonVerifiable.java index 792ccb1d99..9fdaf5ce88 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/DelegatingJsonVerifiable.java +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/DelegatingJsonVerifiable.java @@ -16,12 +16,12 @@ package org.springframework.cloud.contract.verifier.util; -import static org.apache.commons.lang3.StringEscapeUtils.escapeJava; +import com.toomuchcoding.jsonassert.JsonVerifiable; import java.util.LinkedList; import java.util.regex.Pattern; -import com.toomuchcoding.jsonassert.JsonVerifiable; +import static org.apache.commons.lang3.StringEscapeUtils.escapeJava; /** * Implementation of the {@link MethodBufferingJsonVerifiable} that contains a list @@ -84,9 +84,9 @@ class DelegatingJsonVerifiable implements MethodBufferingJsonVerifiable { Object valueToPut = value instanceof ShouldTraverse ? ((ShouldTraverse) value).value : value; DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.field(valueToPut), this.methodsBuffer); if (this.delegate.isIteratingOverArray() && !(value instanceof ShouldTraverse)) { - verifiable.appendMethodWithQuotedValue("contains", valueToPut); + verifiable.appendMethodWithQuotedValue("contains", wrapInBrackets(valueToPut)); } else { - verifiable.appendMethodWithQuotedValue("field", valueToPut); + verifiable.appendMethodWithQuotedValue("field", wrapInBrackets(valueToPut)); } return verifiable; } @@ -103,14 +103,14 @@ class DelegatingJsonVerifiable implements MethodBufferingJsonVerifiable { @Override public MethodBufferingJsonVerifiable array(Object value) { DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.array(value), this.methodsBuffer); - verifiable.appendMethodWithQuotedValue("array", value); + verifiable.appendMethodWithQuotedValue("array", wrapInBrackets(value)); return verifiable; } @Override public MethodBufferingJsonVerifiable arrayField(Object value) { DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.field(value).arrayField(), this.methodsBuffer); - verifiable.appendMethodWithQuotedValue("array", value); + verifiable.appendMethodWithQuotedValue("array", wrapInBrackets(value)); return verifiable; } @@ -289,6 +289,14 @@ class DelegatingJsonVerifiable implements MethodBufferingJsonVerifiable { return this.delegate.isAssertingAValueInArray(); } + // Related to https://github.com/spring-cloud/spring-cloud-contract/issues/269 + private Object wrapInBrackets(Object name) { + if (name instanceof Number) { + return name; + } + return "['" + name.toString() + "']"; + } + @Override public String method() { return createMethodString(); diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy index 6d790dd757..81935cdf3f 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/ContractHttpDocsSpec.groovy @@ -279,7 +279,7 @@ class ContractHttpDocsSpec extends Specification { response.header('Content-Type') == 'application/json' and: DocumentContext parsedJson = JsonPath.parse(response.body.asString()) - assertThatJson(parsedJson).field("code").matches("(123123)?") + assertThatJson(parsedJson).field("['code']").matches("(123123)?") """ // end::optionals_test[] stripped(blockBuilder.toString()) == stripped(expectedTest) diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy index 48c81a82cc..454120961d 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy @@ -52,8 +52,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").isEqualTo("b")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").isEqualTo("b")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -86,9 +86,9 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property3").isEqualTo(false)""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").isNull()""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("true")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property3']").isEqualTo(false)""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").isNull()""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("true")""") and: stubMappingIsValidWireMockStub(new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null), contractDsl).toWireMockClientStub()) and: @@ -123,9 +123,9 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("a").isEqualTo("sth")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("b").isEqualTo("sthElse")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['a']").isEqualTo("sth")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['b']").isEqualTo("sthElse")""") and: stubMappingIsValidWireMockStub(new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null), contractDsl).toWireMockClientStub()) and: @@ -162,10 +162,10 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("a").isEqualTo("sth")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").hasSize(2)""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("b").isEqualTo("sthElse")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['a']").isEqualTo("sth")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").hasSize(2)""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['b']").isEqualTo("sthElse")""") and: stubMappingIsValidWireMockStub(new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null), contractDsl).toWireMockClientStub()) and: @@ -261,8 +261,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("property1").isEqualTo("a")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("property2").isEqualTo("b")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("['property1']").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("['property2']").isEqualTo("b")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -295,8 +295,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property1").contains("property2").isEqualTo("test1")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property1").contains("property3").isEqualTo("test2")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property1']").contains("['property2']").isEqualTo("test1")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property1']").contains("['property3']").isEqualTo("test2")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -329,8 +329,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").field("property3").isEqualTo("b")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").field("['property3']").isEqualTo("b")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -368,8 +368,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").matches("[0-9]{3}")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").matches("[0-9]{3}")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -400,8 +400,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").matches("[0-9]{3}")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").matches("[0-9]{3}")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -521,8 +521,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub test.contains(modifyStringIfRequired.call("queryParam('age', '99'")) test.contains(modifyStringIfRequired.call("queryParam('name', 'Denis.Stepanov'")) test.contains(modifyStringIfRequired.call("queryParam('email', 'bob@email.com'")) - test.contains(modifyStringIfRequired.call("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""")) - test.contains(modifyStringIfRequired.call("""assertThatJson(parsedJson).field("property2").isEqualTo("b")""")) + test.contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + test.contains("""assertThatJson(parsedJson).field("['property2']").isEqualTo("b")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -578,8 +578,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub test.contains(modifyStringIfRequired.call("queryParam('age', '99'")) test.contains(modifyStringIfRequired.call("queryParam('name', 'Denis.Stepanov'")) test.contains(modifyStringIfRequired.call("queryParam('email', 'bob@email.com'")) - test.contains(modifyStringIfRequired.call("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""")) - test.contains(modifyStringIfRequired.call("""assertThatJson(parsedJson).field("property2").isEqualTo("b")""")) + test.contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + test.contains("""assertThatJson(parsedJson).field("['property2']").isEqualTo("b")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -743,7 +743,7 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub assertThat(response.getStatus()).isEqualTo(200); // and: DocumentContext parsedJson = JsonPath.parse(responseAsString); - assertThatJson(parsedJson).field("property1").isEqualTo("a"); + assertThatJson(parsedJson).field("['property1']").isEqualTo("a"); ''' // end::jaxrs[] stripped(test) == stripped(expectedResponse) @@ -966,8 +966,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").matches("[0-9]{3}")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").matches("[0-9]{3}")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -1037,21 +1037,21 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('assertThatJson(parsedJson).field("aBoolean").matches("(true|false)")') - test.contains('assertThatJson(parsedJson).field("alpha").matches("[\\\\p{L}]*")') - test.contains('assertThatJson(parsedJson).field("hostname").matches("((http[s]?|ftp):/)/?([^:/\\\\s]+)(:[0-9]{1,5})?")') - test.contains('assertThatJson(parsedJson).field("url").matches("^(?:(?:[A-Za-z][+-.\\\\w^_]*:/{2})?(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))(?::\\\\d{2,5})?(?:/\\\\S*)?)') - test.contains('assertThatJson(parsedJson).field("number").matches("-?\\\\d*(\\\\.\\\\d+)?")') - test.contains('assertThatJson(parsedJson).field("email").matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}")') - test.contains('assertThatJson(parsedJson).field("ip").matches("([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])")') - test.contains('assertThatJson(parsedJson).field("uuid").matches("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")') - test.contains('assertThatJson(parsedJson).field("date").matches("(\\\\d\\\\d\\\\d\\\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")') - test.contains('assertThatJson(parsedJson).field("dateTime").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")') - test.contains('assertThatJson(parsedJson).field("time").matches("(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")') - test.contains('assertThatJson(parsedJson).field("iso8601WithOffset").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.\\\\d{3})?(Z|[+-][01]\\\\d:[0-5]\\\\d)")') - test.contains('assertThatJson(parsedJson).field("nonBlankString").matches(".*(\\\\S+|\\\\R).*|!^\\\\R*' + endOfLineRegexSymbol + '")') - test.contains('assertThatJson(parsedJson).field("nonEmptyString").matches(".+")') - test.contains('assertThatJson(parsedJson).field("anyOf").matches("^foo' + endOfLineRegexSymbol + '|^bar' + endOfLineRegexSymbol + '")') + test.contains('assertThatJson(parsedJson).field("[\'aBoolean\']").matches("(true|false)")') + test.contains('assertThatJson(parsedJson).field("[\'alpha\']").matches("[\\\\p{L}]*")') + test.contains('assertThatJson(parsedJson).field("[\'hostname\']").matches("((http[s]?|ftp):/)/?([^:/\\\\s]+)(:[0-9]{1,5})?")') + test.contains('assertThatJson(parsedJson).field("[\'url\']").matches("^(?:(?:[A-Za-z][+-.\\\\w^_]*:/{2})?(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))(?::\\\\d{2,5})?(?:/\\\\S*)?)') + test.contains('assertThatJson(parsedJson).field("[\'number\']").matches("-?\\\\d*(\\\\.\\\\d+)?")') + test.contains('assertThatJson(parsedJson).field("[\'email\']").matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}")') + test.contains('assertThatJson(parsedJson).field("[\'ip\']").matches("([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])")') + test.contains('assertThatJson(parsedJson).field("[\'uuid\']").matches("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")') + test.contains('assertThatJson(parsedJson).field("[\'date\']").matches("(\\\\d\\\\d\\\\d\\\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])")') + test.contains('assertThatJson(parsedJson).field("[\'dateTime\']").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")') + test.contains('assertThatJson(parsedJson).field("[\'time\']").matches("(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")') + test.contains('assertThatJson(parsedJson).field("[\'iso8601WithOffset\']").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.\\\\d{3})?(Z|[+-][01]\\\\d:[0-5]\\\\d)")') + test.contains('assertThatJson(parsedJson).field("[\'nonBlankString\']").matches(".*(\\\\S+|\\\\R).*|!^\\\\R*' + endOfLineRegexSymbol + '")') + test.contains('assertThatJson(parsedJson).field("[\'nonEmptyString\']").matches(".+")') + test.contains('assertThatJson(parsedJson).field("[\'anyOf\']").matches("^foo' + endOfLineRegexSymbol + '|^bar' + endOfLineRegexSymbol + '")') !test.contains('cursor') !test.contains('REGEXP>>') and: diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy index 3ce11ed3a8..7c15e45f2f 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy @@ -127,8 +127,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").isEqualTo("b")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").isEqualTo("b")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -161,9 +161,9 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("true")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").isNull()""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property3").isEqualTo(false)""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("true")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").isNull()""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property3']").isEqualTo(false)""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -198,9 +198,9 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("a").isEqualTo("sth")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("b").isEqualTo("sthElse")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['a']").isEqualTo("sth")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['b']").isEqualTo("sthElse")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -237,10 +237,10 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("a").isEqualTo("sth")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").hasSize(2)""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property2").contains("b").isEqualTo("sthElse")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['a']").isEqualTo("sth")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").hasSize(2)""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property2']").contains("['b']").isEqualTo("sthElse")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -336,8 +336,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property").field(7).isEqualTo(0.0)""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property").field(14).isEqualTo(0.0)""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property']").field(7).isEqualTo(0.0)""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property']").field(14).isEqualTo(0.0)""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -371,8 +371,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("property2").isEqualTo("b")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("['property2']").isEqualTo("b")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array().contains("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -405,8 +405,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property1").contains("property2").isEqualTo("test1")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).array("property1").contains("property3").isEqualTo("test2")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property1']").contains("['property2']").isEqualTo("test1")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).array("['property1']").contains("['property3']").isEqualTo("test2")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -439,8 +439,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").field("property3").isEqualTo("b")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").field("['property3']").isEqualTo("b")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -477,8 +477,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").matches("[0-9]{3}")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").matches("[0-9]{3}")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -511,8 +511,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property2").matches("[0-9]{3}")""") - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property1").isEqualTo("a")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property2']").matches("[0-9]{3}")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property1']").isEqualTo("a")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -546,7 +546,7 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub when: builder.appendTo(blockBuilder) then: - blockBuilder.toString().contains("""assertThatJson(parsedJson).field("property").matches("\\\\d+")""") + blockBuilder.toString().contains("""assertThatJson(parsedJson).field("['property']").matches("\\\\d+")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -602,8 +602,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub test.contains('''.queryParam("name","Denis.Stepanov")''') test.contains('''.queryParam("email","bob@email.com")''') test.contains('''.get("/users")''') - test.contains('assertThatJson(parsedJson).field("property1").isEqualTo("a")') - test.contains('assertThatJson(parsedJson).field("property2").isEqualTo("b")') + test.contains('assertThatJson(parsedJson).field("[\'property1\']").isEqualTo("a")') + test.contains('assertThatJson(parsedJson).field("[\'property2\']").isEqualTo("b")') and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -660,8 +660,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub test.contains('''.queryParam("name","Denis.Stepanov")''') test.contains('''.queryParam("email","bob@email.com")''') test.contains('''.get("/foo/123456")''') - test.contains('assertThatJson(parsedJson).field("property1").isEqualTo("a")') - test.contains('assertThatJson(parsedJson).field("property2").isEqualTo("b")') + test.contains('assertThatJson(parsedJson).field("[\'property1\']").isEqualTo("a")') + test.contains('assertThatJson(parsedJson).field("[\'property2\']").isEqualTo("b")') and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -844,8 +844,8 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains("""assertThatJson(parsedJson).array("errors").contains("property").isEqualTo("bank_account_number")""") - test.contains("""assertThatJson(parsedJson).array("errors").contains("message").isEqualTo("incorrect_format")""") + test.contains("""assertThatJson(parsedJson).array("['errors']").contains("['property']").isEqualTo("bank_account_number")""") + test.contains("""assertThatJson(parsedJson).array("['errors']").contains("['message']").isEqualTo("incorrect_format")""") and: stubMappingIsValidWireMockStub(contractDsl) and: @@ -923,7 +923,7 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains("""assertThatJson(parsedJson).field("message").matches("User not found by email = \\\\\\\\[[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\\\\\.[a-zA-Z]{2,4}\\\\\\\\]")""") + test.contains("""assertThatJson(parsedJson).field("['message']").matches("User not found by email = \\\\\\\\[[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\\\\\.[a-zA-Z]{2,4}\\\\\\\\]")""") and: // no static compilation due to bug in Groovy https://issues.apache.org/jira/browse/GROOVY-8055 SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, blockBuilder.toString()) @@ -943,7 +943,7 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub def test = blockBuilder.toString() then: test.contains('''"email":"abc@abc.com"''') - test.contains("""assertThatJson(parsedJson).field("code").matches("(123123)?")""") + test.contains("""assertThatJson(parsedJson).field("['code']").matches("(123123)?")""") !test.contains('''REGEXP''') !test.contains('''OPTIONAL''') !test.contains('''OptionalProperty''') @@ -963,7 +963,7 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub def test = blockBuilder.toString() then: test.contains('\\"email\\":\\"abc@abc.com\\"') - test.contains('assertThatJson(parsedJson).field("code").matches("(123123)?");') + test.contains('assertThatJson(parsedJson).field("[\'code\']").matches("(123123)?");') !test.contains('''REGEXP''') !test.contains('''OPTIONAL''') !test.contains('''OptionalProperty''') @@ -1274,7 +1274,7 @@ World.'''""" builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('''assertThatJson(parsedJson).array("authorities").arrayField().matches("^[a-zA-Z0-9_\\\\- ]+\\$").value()''') + test.contains('''assertThatJson(parsedJson).array("[\'authorities']").arrayField().matches("^[a-zA-Z0-9_\\\\- ]+\\$").value()''') and: SyntaxChecker.tryToCompileGroovy(blockBuilder.toString()) } @@ -1310,7 +1310,7 @@ World.'''""" builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('''assertThatJson(parsedJson).array("authorities").arrayField().matches("^[a-zA-Z0-9_\\\\- ]+$").value()''') + test.contains('''assertThatJson(parsedJson).array("[\'authorities']").arrayField().matches("^[a-zA-Z0-9_\\\\- ]+$").value()''') and: SyntaxChecker.tryToCompileJava(blockBuilder.toString()) } @@ -1337,7 +1337,7 @@ World.'''""" builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - !test.contains('''assertThatJson(parsedJson).field("rejectionReason").isEqualTo("assertThatRejectionReasonIsNull("''') + !test.contains('''assertThatJson(parsedJson).field("[\'rejectionReason']").isEqualTo("assertThatRejectionReasonIsNull("''') test.contains('''assertThatRejectionReasonIsNull(''') where: methodBuilderName | methodBuilder @@ -1373,7 +1373,7 @@ World.'''""" builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('assertThatJson(parsedJson).array().contains("id").matches("[0-9]+")') + test.contains('assertThatJson(parsedJson).array().contains("[\'id\']").matches("[0-9]+")') and: SyntaxChecker.tryToCompileGroovy(blockBuilder.toString()) } @@ -1540,8 +1540,8 @@ World.'''""" builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('assertThatJson(parsedJson).array("partners").array("payment_methods").arrayField().isEqualTo("BANK").value()') - test.contains('assertThatJson(parsedJson).array("partners").array("payment_methods").arrayField().isEqualTo("CASH").value()') + test.contains('assertThatJson(parsedJson).array("[\'partners\']").array("[\'payment_methods\']").arrayField().isEqualTo("BANK").value()') + test.contains('assertThatJson(parsedJson).array("[\'partners\']").array("[\'payment_methods\']").arrayField().isEqualTo("CASH").value()') and: SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString()) where: @@ -1569,7 +1569,7 @@ World.'''""" builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('assertThatJson(parsedJson).field("message").matches("^(?!\\\\s*\\$).+")') + test.contains('assertThatJson(parsedJson).field("[\'message\']").matches("^(?!\\\\s*\\$).+")') and: SyntaxChecker.tryToCompileGroovy(blockBuilder.toString(), false) } @@ -1661,7 +1661,7 @@ World.'''""" strippedTest.matches(""".*put\\("/foo/[0-9]{5}"\\).*""") strippedTest.contains("""response.header('Content-Type') ==~ java.util.regex.Pattern.compile('application/vnd\\\\.fraud\\\\.v1\\\\+json.*')""") "application/vnd.fraud.v1+json;charset=UTF-8".matches('application/vnd\\.fraud\\.v1\\+json.*') - strippedTest.contains("""assertThatJson(parsedJson).field("responseElement").matches("[0-9]{7}")""") + strippedTest.contains("""assertThatJson(parsedJson).field("['responseElement']").matches("[0-9]{7}")""") and: SyntaxChecker.tryToCompileGroovy(blockBuilder.toString()) } @@ -1938,21 +1938,21 @@ World.'''""" builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - test.contains('assertThatJson(parsedJson).field("aBoolean").matches("(true|false)")') - test.contains('assertThatJson(parsedJson).field("alpha").matches("[\\\\p{L}]*")') - test.contains('assertThatJson(parsedJson).field("hostname").matches("((http[s]?|ftp):/)/?([^:/\\\\s]+)(:[0-9]{1,5})?")') - test.contains('assertThatJson(parsedJson).field("url").matches("^(?:(?:[A-Za-z][+-.\\\\w^_]*:/{2})?(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))(?::\\\\d{2,5})?(?:/\\\\S*)?)') - test.contains('assertThatJson(parsedJson).field("number").matches("-?\\\\d*(\\\\.\\\\d+)?")') - test.contains('assertThatJson(parsedJson).field("email").matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}")') - test.contains('assertThatJson(parsedJson).field("ip").matches("([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])")') - test.contains('assertThatJson(parsedJson).field("uuid").matches("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")') - test.contains('assertThatJson(parsedJson).field("date").matches("(\\\\d\\\\d\\\\d\\\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])') - test.contains('assertThatJson(parsedJson).field("dateTime").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])') - test.contains('assertThatJson(parsedJson).field("time").matches("(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")') - test.contains('assertThatJson(parsedJson).field("iso8601WithOffset").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.\\\\d{3})?(Z|[+-][01]\\\\d:[0-5]\\\\d)")') - test.contains('assertThatJson(parsedJson).field("nonBlankString").matches(".*(\\\\S+|\\\\R).*|!^\\\\R*' + endOfLineRegExSymbol + '")') - test.contains('assertThatJson(parsedJson).field("nonEmptyString").matches(".+")') - test.contains('assertThatJson(parsedJson).field("anyOf").matches("^foo' + endOfLineRegExSymbol + '|^bar' + endOfLineRegExSymbol + '")') + test.contains('assertThatJson(parsedJson).field("[\'aBoolean\']").matches("(true|false)")') + test.contains('assertThatJson(parsedJson).field("[\'alpha\']").matches("[\\\\p{L}]*")') + test.contains('assertThatJson(parsedJson).field("[\'hostname\']").matches("((http[s]?|ftp):/)/?([^:/\\\\s]+)(:[0-9]{1,5})?")') + test.contains('assertThatJson(parsedJson).field("[\'url\']").matches("^(?:(?:[A-Za-z][+-.\\\\w^_]*:/{2})?(?:\\\\S+(?::\\\\S*)?@)?(?:(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)|(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,})))(?::\\\\d{2,5})?(?:/\\\\S*)?)') + test.contains('assertThatJson(parsedJson).field("[\'number\']").matches("-?\\\\d*(\\\\.\\\\d+)?")') + test.contains('assertThatJson(parsedJson).field("[\'email\']").matches("[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}")') + test.contains('assertThatJson(parsedJson).field("[\'ip\']").matches("([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])\\\\.([01]?\\\\d\\\\d?|2[0-4]\\\\d|25[0-5])")') + test.contains('assertThatJson(parsedJson).field("[\'uuid\']").matches("[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12}")') + test.contains('assertThatJson(parsedJson).field("[\'date\']").matches("(\\\\d\\\\d\\\\d\\\\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])') + test.contains('assertThatJson(parsedJson).field("[\'dateTime\']").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])') + test.contains('assertThatJson(parsedJson).field("[\'time\']").matches("(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])")') + test.contains('assertThatJson(parsedJson).field("[\'iso8601WithOffset\']").matches("([0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(\\\\.\\\\d{3})?(Z|[+-][01]\\\\d:[0-5]\\\\d)")') + test.contains('assertThatJson(parsedJson).field("[\'nonBlankString\']").matches(".*(\\\\S+|\\\\R).*|!^\\\\R*' + endOfLineRegExSymbol + '")') + test.contains('assertThatJson(parsedJson).field("[\'nonEmptyString\']").matches(".+")') + test.contains('assertThatJson(parsedJson).field("[\'anyOf\']").matches("^foo' + endOfLineRegExSymbol + '|^bar' + endOfLineRegExSymbol + '")') !test.contains('cursor') !test.contains('REGEXP>>') and: @@ -2066,7 +2066,7 @@ DocumentContext parsedJson = JsonPath.parse(json); builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: - !test.contains('assertThatJson(parsedJson).field("a").isEqualTo(1)') + !test.contains('assertThatJson(parsedJson).field("[\'a\']").isEqualTo(1)') test.contains(expectedAssertion) and: SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString()) @@ -2103,8 +2103,8 @@ DocumentContext parsedJson = JsonPath.parse(json); builder.appendTo(blockBuilder) def test = blockBuilder.toString() then: -// test.contains('assertThatJson(parsedJson).field("bar").matches("some value \\"with quote\\"|bar")') -// and: + test.contains('assertThatJson(parsedJson).field("[\'bar\']").matches("some value \\"with quote\\"|bar")') + and: SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString()) where: //order is inverted cause Intellij didn't parse this properly @@ -2172,8 +2172,8 @@ DocumentContext parsedJson = JsonPath.parse(json); when: SyntaxChecker.tryToCompile(methodBuilderName, test) then: - test.contains('assertThatJson(parsedJson).array("list").isEmpty()') - !test.contains('assertThatJson(parsedJson).array("foo").isEmpty()') + test.contains('assertThatJson(parsedJson).array("[\'list\']").isEmpty()') + !test.contains('assertThatJson(parsedJson).array("[\'foo\']").isEmpty()') where: methodBuilderName | methodBuilder "MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverterSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverterSpec.groovy index 962626236f..e5a1bb2e5f 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverterSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/util/JsonToJsonPathsConverterSpec.groovy @@ -38,23 +38,23 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method() == """.array().field("some").field("nested").field("json").isEqualTo("with value")""" && + it.method() == """.array().field("['some']").field("['nested']").field("['json']").isEqualTo("with value")""" && it.jsonPath() == '''$[*].some.nested[?(@.json == 'with value')]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").field("anothervalue").isEqualTo(4)""" && + it.method() == """.array().field("['some']").field("['nested']").field("['anothervalue']").isEqualTo(4)""" && it.jsonPath() == '''$[*].some.nested[?(@.anothervalue == 4)]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").array("withlist").contains("name").isEqualTo("name1")""" && + it.method() == """.array().field("['some']").field("['nested']").array("['withlist']").contains("['name']").isEqualTo("name1")""" && it.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == 'name1')]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").array("withlist").contains("name").isEqualTo("name2")""" && + it.method() == """.array().field("['some']").field("['nested']").array("['withlist']").contains("['name']").isEqualTo("name2")""" && it.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == 'name2')]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").array("withlist").field("anothernested").field("name").isEqualTo("name3")""" && + it.method() == """.array().field("['some']").field("['nested']").array("['withlist']").field("['anothernested']").field("['name']").isEqualTo("name3")""" && it.jsonPath() == '''$[*].some.nested.withlist[*].anothernested[?(@.name == 'name3')]''' } and: @@ -131,19 +131,19 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method() == """.field("some").field("nested").field("json").isEqualTo("with value")""" && + it.method() == """.field("['some']").field("['nested']").field("['json']").isEqualTo("with value")""" && it.jsonPath() == '''$.some.nested[?(@.json == 'with value')]''' } pathAndValues.find { - it.method() == """.field("some").field("nested").field("anothervalue").isEqualTo(4)""" && + it.method() == """.field("['some']").field("['nested']").field("['anothervalue']").isEqualTo(4)""" && it.jsonPath() == '''$.some.nested[?(@.anothervalue == 4)]''' } pathAndValues.find { - it.method() == """.field("some").field("nested").array("withlist").contains("name").isEqualTo("name1")""" && + it.method() == """.field("['some']").field("['nested']").array("['withlist']").contains("['name']").isEqualTo("name1")""" && it.jsonPath() == '''$.some.nested.withlist[*][?(@.name == 'name1')]''' } pathAndValues.find { - it.method() == """.field("some").field("nested").array("withlist").contains("name").isEqualTo("name2")""" && + it.method() == """.field("['some']").field("['nested']").array("['withlist']").contains("['name']").isEqualTo("name2")""" && it.jsonPath() == '''$.some.nested.withlist[*][?(@.name == 'name2')]''' } and: @@ -161,7 +161,7 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method() == """.array("items").arrayField().isEqualTo("HOP").value()""" && + it.method() == """.array("['items']").arrayField().isEqualTo("HOP").value()""" && it.jsonPath() == '''$.items[?(@ == 'HOP')]''' } and: @@ -180,11 +180,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method() == """.field("property1").isNull()""" && + it.method() == """.field("['property1']").isNull()""" && it.jsonPath() == '''$[?(@.property1 == null)]''' } pathAndValues.find { - it.method() == """.field("property2").isEqualTo(true)""" && + it.method() == """.field("['property2']").isEqualTo(true)""" && it.jsonPath() == '''$[?(@.property2 == true)]''' } } @@ -199,15 +199,15 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method() == """.field("extensions").field("7").isEqualTo(28.00)""" && + it.method() == """.field("['extensions']").field("['7']").isEqualTo(28.00)""" && it.jsonPath() == '''$.extensions[?(@.7 == 28.00)]''' } pathAndValues.find { - it.method() == """.field("extensions").field("14").isEqualTo(41.00)""" && + it.method() == """.field("['extensions']").field("['14']").isEqualTo(41.00)""" && it.jsonPath() == '''$.extensions[?(@.14 == 41.00)]''' } pathAndValues.find { - it.method() == """.field("extensions").field("30").isEqualTo(60.00)""" && + it.method() == """.field("['extensions']").field("['30']").isEqualTo(60.00)""" && it.jsonPath() == '''$.extensions[?(@.30 == 60.00)]''' } and: @@ -228,15 +228,15 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method() == """.array("errors").contains("property").isEqualTo("email")""" && + it.method() == """.array("['errors']").contains("['property']").isEqualTo("email")""" && it.jsonPath() == '''$.errors[*][?(@.property == 'email')]''' } pathAndValues.find { - it.method() == """.array("errors").contains("message").isEqualTo("inconsistent value")""" && + it.method() == """.array("['errors']").contains("['message']").isEqualTo("inconsistent value")""" && it.jsonPath() == '''$.errors[*][?(@.message == 'inconsistent value')]''' } pathAndValues.find { - it.method() == """.array("errors").contains("message").isEqualTo("inconsistent value2")""" && + it.method() == """.array("['errors']").contains("['message']").isEqualTo("inconsistent value2")""" && it.jsonPath() == '''$.errors[*][?(@.message == 'inconsistent value2')]''' } and: @@ -279,23 +279,23 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method() == """.array().field("some").field("nested").field("json").isEqualTo("with value")""" && + it.method() == """.array().field("['some']").field("['nested']").field("['json']").isEqualTo("with value")""" && it.jsonPath() == '''$[*].some.nested[?(@.json == 'with value')]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").field("anothervalue").isEqualTo(4)""" && + it.method() == """.array().field("['some']").field("['nested']").field("['anothervalue']").isEqualTo(4)""" && it.jsonPath() == '''$[*].some.nested[?(@.anothervalue == 4)]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").array("withlist").contains("name").isEqualTo("name1")""" && + it.method() == """.array().field("['some']").field("['nested']").array("['withlist']").contains("['name']").isEqualTo("name1")""" && it.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == 'name1')]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").array("withlist").contains("name").isEqualTo("name2")""" && + it.method() == """.array().field("['some']").field("['nested']").array("['withlist']").contains("['name']").isEqualTo("name2")""" && it.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == 'name2')]''' } pathAndValues.find { - it.method() == """.array().field("some").field("nested").array("withlist").field("anothernested").field("name").matches("[a-zA-Z]+")""" && + it.method() == """.array().field("['some']").field("['nested']").array("['withlist']").field("['anothernested']").field("['name']").matches("[a-zA-Z]+")""" && it.jsonPath() == '''$[*].some.nested.withlist[*].anothernested[?(@.name =~ /[a-zA-Z]+/)]''' } when: @@ -315,11 +315,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.field("property1").isEqualTo("a")""" && + it.method()== """.field("['property1']").isEqualTo("a")""" && it.jsonPath() == """\$[?(@.property1 == 'a')]""" } pathAndValues.find { - it.method()== """.field("property2").isEqualTo("b")""" && + it.method()== """.field("['property2']").isEqualTo("b")""" && it.jsonPath() == """\$[?(@.property2 == 'b')]""" } and: @@ -337,15 +337,15 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.field("property1").isEqualTo("true")""" && + it.method()== """.field("['property1']").isEqualTo("true")""" && it.jsonPath() == """\$[?(@.property1 == 'true')]""" } pathAndValues.find { - it.method()== """.field("property2").isNull()""" && + it.method()== """.field("['property2']").isNull()""" && it.jsonPath() == """\$[?(@.property2 == null)]""" } pathAndValues.find { - it.method()== """.field("property3").isEqualTo(false)""" && + it.method()== """.field("['property3']").isEqualTo(false)""" && it.jsonPath() == """\$[?(@.property3 == false)]""" } and: @@ -365,15 +365,15 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method()== """.field("property1").isEqualTo("a")""" && + it.method()== """.field("['property1']").isEqualTo("a")""" && it.jsonPath() == """\$[?(@.property1 == 'a')]""" } pathAndValues.find { - it.method()== """.array("property2").contains("a").isEqualTo("sth")""" && + it.method()== """.array("['property2']").contains("['a']").isEqualTo("sth")""" && it.jsonPath() == """\$.property2[*][?(@.a == 'sth')]""" } pathAndValues.find { - it.method()== """.array("property2").contains("b").isEqualTo("sthElse")""" && + it.method()== """.array("['property2']").contains("['b']").isEqualTo("sthElse")""" && it.jsonPath() == """\$.property2[*][?(@.b == 'sthElse')]""" } and: @@ -395,19 +395,19 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method()== """.field("property1").isEqualTo("a")""" && + it.method()== """.field("['property1']").isEqualTo("a")""" && it.jsonPath() == """\$[?(@.property1 == 'a')]""" } pathAndValues.find { - it.method()== """.array("property2").contains("a").isEqualTo("sth")""" && + it.method()== """.array("['property2']").contains("['a']").isEqualTo("sth")""" && it.jsonPath() == """\$.property2[*][?(@.a == 'sth')]""" } pathAndValues.find { - it.method()== """.array("property2").hasSize(2)""" && + it.method()== """.array("['property2']").hasSize(2)""" && it.jsonPath() == """\$.property2[*]""" } pathAndValues.find { - it.method()== """.array("property2").contains("b").isEqualTo("sthElse")""" && + it.method()== """.array("['property2']").contains("['b']").isEqualTo("sthElse")""" && it.jsonPath() == """\$.property2[*][?(@.b == 'sthElse')]""" } and: @@ -426,11 +426,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method()== """.field("property").field(7).isEqualTo(0.0)""" && + it.method()== """.field("['property']").field(7).isEqualTo(0.0)""" && it.jsonPath() == """\$.property[?(@.7 == 0.0)]""" } pathAndValues.find { - it.method()== """.field("property").field(14).isEqualTo(0.0)""" && + it.method()== """.field("['property']").field(14).isEqualTo(0.0)""" && it.jsonPath() == """\$.property[?(@.14 == 0.0)]""" } and: @@ -450,11 +450,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.array().contains("property1").isEqualTo("a")""" && + it.method()== """.array().contains("['property1']").isEqualTo("a")""" && it.jsonPath() == """\$[*][?(@.property1 == 'a')]""" } pathAndValues.find { - it.method()== """.array().contains("property2").isEqualTo("b")""" && + it.method()== """.array().contains("['property2']").isEqualTo("b")""" && it.jsonPath() == """\$[*][?(@.property2 == 'b')]""" } and: @@ -476,11 +476,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.array().contains("property1").isEqualTo("a")""" && + it.method()== """.array().contains("['property1']").isEqualTo("a")""" && it.jsonPath() == """\$[*][?(@.property1 == 'a')]""" } pathAndValues.find { - it.method()== """.array().contains("property2").isEqualTo("b")""" && + it.method()== """.array().contains("['property2']").isEqualTo("b")""" && it.jsonPath() == """\$[*][?(@.property2 == 'b')]""" } pathAndValues.find { @@ -503,11 +503,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.array("property1").contains("property2").isEqualTo("test1")""" && + it.method()== """.array("['property1']").contains("['property2']").isEqualTo("test1")""" && it.jsonPath() == """\$.property1[*][?(@.property2 == 'test1')]""" } pathAndValues.find { - it.method()== """.array("property1").contains("property3").isEqualTo("test2")""" && + it.method()== """.array("['property1']").contains("['property3']").isEqualTo("test2")""" && it.jsonPath() == """\$.property1[*][?(@.property3 == 'test2')]""" } and: @@ -528,15 +528,15 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.array("property1").contains("property2").isEqualTo("test1")""" && + it.method()== """.array("['property1']").contains("['property2']").isEqualTo("test1")""" && it.jsonPath() == """\$.property1[*][?(@.property2 == 'test1')]""" } pathAndValues.find { - it.method()== """.array("property1").contains("property3").isEqualTo("test2")""" && + it.method()== """.array("['property1']").contains("['property3']").isEqualTo("test2")""" && it.jsonPath() == """\$.property1[*][?(@.property3 == 'test2')]""" } pathAndValues.find { - it.method()== """.array("property1").hasSize(2)""" && + it.method()== """.array("['property1']").hasSize(2)""" && it.jsonPath() == """\$.property1[*]""" } and: @@ -553,11 +553,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.field("property2").field("property3").isEqualTo("b")""" && + it.method()== """.field("['property2']").field("['property3']").isEqualTo("b")""" && it.jsonPath() == """\$.property2[?(@.property3 == 'b')]""" } pathAndValues.find { - it.method()== """.field("property1").isEqualTo("a")""" && + it.method()== """.field("['property1']").isEqualTo("a")""" && it.jsonPath() == """\$[?(@.property1 == 'a')]""" } and: @@ -574,11 +574,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method()== """.field("property2").matches("[0-9]{3}")""" && + it.method()== """.field("['property2']").matches("[0-9]{3}")""" && it.jsonPath() == """\$[?(@.property2 =~ /[0-9]{3}/)]""" } pathAndValues.find { - it.method()== """.field("property1").isEqualTo("a")""" && + it.method()== """.field("['property1']").isEqualTo("a")""" && it.jsonPath() == """\$[?(@.property1 == 'a')]""" } and: @@ -594,7 +594,7 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method()== """.field("property2").matches("\\\\d+")""" && + it.method()== """.field("['property2']").matches("\\\\d+")""" && it.jsonPath() == """\$[?(@.property2 =~ /\\d+/)]""" } and: @@ -613,11 +613,11 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method()== """.array("errors").contains("property").isEqualTo("bank_account_number")""" && + it.method()== """.array("['errors']").contains("['property']").isEqualTo("bank_account_number")""" && it.jsonPath() == """\$.errors[*][?(@.property == 'bank_account_number')]""" } pathAndValues.find { - it.method()== """.array("errors").contains("message").isEqualTo("incorrect_format")""" && + it.method()== """.array("['errors']").contains("['message']").isEqualTo("incorrect_format")""" && it.jsonPath() == """\$.errors[*][?(@.message == 'incorrect_format')]""" } and: @@ -638,15 +638,15 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json) then: pathAndValues.find { - it.method()== """.array("errors").contains("property").isEqualTo("bank_account_number")""" && + it.method()== """.array("['errors']").contains("['property']").isEqualTo("bank_account_number")""" && it.jsonPath() == """\$.errors[*][?(@.property == 'bank_account_number')]""" } pathAndValues.find { - it.method()== """.array("errors").contains("message").isEqualTo("incorrect_format")""" && + it.method()== """.array("['errors']").contains("['message']").isEqualTo("incorrect_format")""" && it.jsonPath() == """\$.errors[*][?(@.message == 'incorrect_format')]""" } pathAndValues.find { - it.method()== """.array("errors").hasSize(1)""" && + it.method()== """.array("['errors']").hasSize(1)""" && it.jsonPath() == """\$.errors[*]""" } and: @@ -674,19 +674,19 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(38.995548)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(38.995548)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 38.995548)]""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(-77.119759)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(-77.119759)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -77.119759)]""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(-76.909393)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(-76.909393)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -76.909393)]""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(38.791645)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(38.791645)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 38.791645)]""" } and: @@ -720,19 +720,19 @@ class JsonToJsonPathsConverterSpec extends Specification { JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json)) then: pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(38.995548)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(38.995548)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 38.995548)]""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(-77.119759)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(-77.119759)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -77.119759)]""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(-76.909393)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(-76.909393)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -76.909393)]""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().arrayField().isEqualTo(38.791645)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().arrayField().isEqualTo(38.791645)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 38.791645)]""" } pathAndValues.find { @@ -740,11 +740,11 @@ class JsonToJsonPathsConverterSpec extends Specification { it.jsonPath() == """\$""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().hasSize(2)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").array().hasSize(2)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*]""" } pathAndValues.find { - it.method()== """.array().field("place").field("bounding_box").array("coordinates").hasSize(1)""" && + it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").hasSize(1)""" && it.jsonPath() == """\$[*].place.bounding_box.coordinates[*]""" } and: