Updated code and docs

This commit is contained in:
Marcin Grzejszczak
2017-04-26 12:42:33 +02:00
32 changed files with 641 additions and 447 deletions

View File

@@ -210,7 +210,7 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("Content-Type", "application/vnd.fraud.v1+json")
.body("{\"clientPesel\":\"1234567890\",\"loanAmount\":99999}");
.body("{\"client.id\":\"1234567890\",\"loanAmount\":99999}");
// when:
ResponseOptions response = given().spec(request)
@@ -221,8 +221,8 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
assertThat(response.header("Content-Type")).matches("application/vnd.fraud.v1.json.*");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).field("fraudCheckStatus").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("rejectionReason").isEqualTo("Amount too high");
assertThatJson(parsedJson).field("['fraudCheckStatus']").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("['rejection.reason']").isEqualTo("Amount too high");
}
----
@@ -449,7 +449,7 @@ The aforementioned contract is an agreement between two sides that:
- if an HTTP request is sent with
** a method `PUT` on an endpoint `/fraudcheck`
** JSON body with `clientPesel` matching the regular expression `[0-9]{10}` and `loanAmount` equal to `99999`
** JSON body with `client.id` matching the regular expression `[0-9]{10}` and `loanAmount` equal to `99999`
** and with a header `Content-Type` equal to `application/vnd.fraud.v1+json`
- then an HTTP response would be sent to the consumer that
** has status `200`
@@ -707,7 +707,7 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("Content-Type", "application/vnd.fraud.v1+json")
.body("{\"clientPesel\":\"1234567890\",\"loanAmount\":99999}");
.body("{\"client.id\":\"1234567890\",\"loanAmount\":99999}");
// when:
ResponseOptions response = given().spec(request)
@@ -718,8 +718,8 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
assertThat(response.header("Content-Type")).matches("application/vnd.fraud.v1.json.*");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).field("fraudCheckStatus").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("rejectionReason").isEqualTo("Amount too high");
assertThatJson(parsedJson).field("['fraudCheckStatus']").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("['rejection.reason']").isEqualTo("Amount too high");
}
----

View File

@@ -132,7 +132,7 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("Content-Type", "application/vnd.fraud.v1+json")
.body("{\"clientPesel\":\"1234567890\",\"loanAmount\":99999}");
.body("{\"client.id\":\"1234567890\",\"loanAmount\":99999}");
// when:
ResponseOptions response = given().spec(request)
@@ -143,8 +143,8 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
assertThat(response.header("Content-Type")).matches("application/vnd.fraud.v1.json.*");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).field("fraudCheckStatus").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("rejectionReason").isEqualTo("Amount too high");
assertThatJson(parsedJson).field("['fraudCheckStatus']").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("['rejection.reason']").isEqualTo("Amount too high");
}
----
@@ -244,7 +244,7 @@ The aforementioned contract is an agreement between two sides that:
- if an HTTP request is sent with
** a method `PUT` on an endpoint `/fraudcheck`
** JSON body with `clientPesel` matching the regular expression `[0-9]{10}` and `loanAmount` equal to `99999`
** JSON body with `client.id` matching the regular expression `[0-9]{10}` and `loanAmount` equal to `99999`
** and with a header `Content-Type` equal to `application/vnd.fraud.v1+json`
- then an HTTP response would be sent to the consumer that
** has status `200`
@@ -425,7 +425,7 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
// given:
MockMvcRequestSpecification request = given()
.header("Content-Type", "application/vnd.fraud.v1+json")
.body("{\"clientPesel\":\"1234567890\",\"loanAmount\":99999}");
.body("{\"client.id\":\"1234567890\",\"loanAmount\":99999}");
// when:
ResponseOptions response = given().spec(request)
@@ -436,8 +436,8 @@ public void validate_shouldMarkClientAsFraud() throws Exception {
assertThat(response.header("Content-Type")).matches("application/vnd.fraud.v1.json.*");
// and:
DocumentContext parsedJson = JsonPath.parse(response.getBody().asString());
assertThatJson(parsedJson).field("fraudCheckStatus").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("rejectionReason").isEqualTo("Amount too high");
assertThatJson(parsedJson).field("['fraudCheckStatus']").matches("[A-Z]{5}");
assertThatJson(parsedJson).field("['rejection.reason']").isEqualTo("Amount too high");
}
----

View File

@@ -23,7 +23,7 @@ repositories {
}
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'maven-publish'
dependencyManagement {

View File

@@ -1,9 +1,12 @@
package com.example.loan.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
public class FraudServiceRequest {
@JsonProperty("client.id")
private String clientId;
private BigDecimal loanAmount;

View File

@@ -1,9 +1,12 @@
package com.example.loan.model;
import com.fasterxml.jackson.annotation.JsonProperty;
public class FraudServiceResponse {
private FraudCheckStatus fraudCheckStatus;
@JsonProperty("rejection.reason")
private String rejectionReason;
public FraudServiceResponse() {

View File

@@ -28,7 +28,7 @@ repositories {
// end::deps_repos[]
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'spring-cloud-contract'
apply plugin: 'maven-publish'

View File

@@ -1,9 +1,12 @@
package com.example.fraud.model;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
public class FraudCheck {
@JsonProperty("client.id")
private String clientId;
private BigDecimal loanAmount;

View File

@@ -1,9 +1,12 @@
package com.example.fraud.model;
import com.fasterxml.jackson.annotation.JsonProperty;
public class FraudCheckResult {
private FraudCheckStatus fraudCheckStatus;
@JsonProperty("rejection.reason")
private String rejectionReason;
public FraudCheckResult() {

View File

@@ -5,7 +5,7 @@ org.springframework.cloud.contract.spec.Contract.make {
method 'PUT' // (2)
url '/fraudcheck' // (3)
body([ // (4)
clientId: $(regex('[0-9]{10}')),
"client.id": $(regex('[0-9]{10}')),
loanAmount: 99999
])
headers { // (5)
@@ -16,7 +16,7 @@ org.springframework.cloud.contract.spec.Contract.make {
status 200 // (7)
body([ // (8)
fraudCheckStatus: "FRAUD",
rejectionReason: "Amount too high"
"rejection.reason": "Amount too high"
])
headers { // (9)
contentType('application/json')

View File

@@ -6,7 +6,7 @@ org.springframework.cloud.contract.spec.Contract.make {
url '/fraudcheck'
body("""
{
"clientId":"${value(consumer(regex('[0-9]{10}')), producer('1234567890'))}",
"client.id":"${value(consumer(regex('[0-9]{10}')), producer('1234567890'))}",
"loanAmount":123.123
}
"""
@@ -20,7 +20,7 @@ org.springframework.cloud.contract.spec.Contract.make {
status 200
body(
fraudCheckStatus: "OK",
rejectionReason: $(consumer(null), producer(execute('assertThatRejectionReasonIsNull($it)')))
"rejection.reason": $(consumer(null), producer(execute('assertThatRejectionReasonIsNull($it)')))
)
headers {
contentType("application/json")

View File

@@ -23,7 +23,7 @@ repositories {
}
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'maven-publish'
dependencyManagement {

View File

@@ -26,7 +26,7 @@ repositories {
}
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'spring-cloud-contract'
apply plugin: 'maven-publish'

View File

@@ -23,7 +23,7 @@ repositories {
}
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'maven-publish'
dependencyManagement {

View File

@@ -28,7 +28,7 @@ repositories {
}
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'spring-cloud-contract'
apply plugin: 'maven-publish'

View File

@@ -23,7 +23,7 @@ repositories {
}
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'maven-publish'
dependencyManagement {

View File

@@ -27,7 +27,7 @@ repositories {
}
apply plugin: 'groovy'
apply plugin: 'spring-boot'
apply plugin: 'org.springframework.boot'
apply plugin: 'maven-publish'
apply plugin: 'maven'

View File

@@ -237,37 +237,37 @@ class DslToWireMockClientConverterSpec extends Specification {
"url" : "/api/12",
"method" : "PUT",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[*].place.bounding_box.coordinates[*][*][?(@ == -77.119759)]"
"matchesJsonPath" : "$[*].['place'].['bounding_box'].['coordinates'][*][*][?(@ == -77.119759)]"
}, {
"matchesJsonPath" : "$[*][?(@.text == 'Gonna see you at Warsaw')]"
"matchesJsonPath" : "$[*][?(@.['text'] == 'Gonna see you at Warsaw')]"
}, {
"matchesJsonPath" : "$[*].place[?(@.place_type == 'city')]"
"matchesJsonPath" : "$[*].['place'][?(@.['place_type'] == 'city')]"
}, {
"matchesJsonPath" : "$[*][?(@.id == 492967299297845248)]"
"matchesJsonPath" : "$[*][?(@.['id'] == 492967299297845248)]"
}, {
"matchesJsonPath" : "$[*].place.bounding_box.coordinates[*][*][?(@ == 38.791645)]"
"matchesJsonPath" : "$[*].['place'].['bounding_box'].['coordinates'][*][*][?(@ == 38.791645)]"
}, {
"matchesJsonPath" : "$[*].place[?(@.country == 'United States')]"
"matchesJsonPath" : "$[*].['place'][?(@.['country'] == 'United States')]"
}, {
"matchesJsonPath" : "$[*][?(@.id_str == '492967299297845248')]"
"matchesJsonPath" : "$[*][?(@.['id_str'] == '492967299297845248')]"
}, {
"matchesJsonPath" : "$[*].place.bounding_box.coordinates[*][*][?(@ == -76.909393)]"
"matchesJsonPath" : "$[*].['place'].['bounding_box'].['coordinates'][*][*][?(@ == -76.909393)]"
}, {
"matchesJsonPath" : "$[*].place[?(@.name == 'Washington')]"
"matchesJsonPath" : "$[*].['place'][?(@.['name'] == 'Washington')]"
}, {
"matchesJsonPath" : "$[*].place.bounding_box[?(@.type == 'Polygon')]"
"matchesJsonPath" : "$[*].['place'].['bounding_box'][?(@.['type'] == 'Polygon')]"
}, {
"matchesJsonPath" : "$[*].place[?(@.url == 'http://api.twitter.com/1/geo/id/01fbe706f872cb32.json')]"
"matchesJsonPath" : "$[*].['place'][?(@.['url'] == 'http://api.twitter.com/1/geo/id/01fbe706f872cb32.json')]"
}, {
"matchesJsonPath" : "$[*].place.bounding_box.coordinates[*][*][?(@ == 38.995548)]"
"matchesJsonPath" : "$[*].['place'].['bounding_box'].['coordinates'][*][*][?(@ == 38.995548)]"
}, {
"matchesJsonPath" : "$[*].place[?(@.country_code == 'US')]"
"matchesJsonPath" : "$[*].['place'][?(@.['country_code'] == 'US')]"
}, {
"matchesJsonPath" : "$[*].place[?(@.full_name == 'Washington, DC')]"
"matchesJsonPath" : "$[*].['place'][?(@.['full_name'] == 'Washington, DC')]"
}, {
"matchesJsonPath" : "$[*][?(@.created_at == 'Sat Jul 26 09:38:57 +0000 2014')]"
"matchesJsonPath" : "$[*][?(@.['created_at'] == 'Sat Jul 26 09:38:57 +0000 2014')]"
}, {
"matchesJsonPath" : "$[*].place[?(@.id == '01fbe706f872cb32')]"
"matchesJsonPath" : "$[*].['place'][?(@.['id'] == '01fbe706f872cb32')]"
} ],
"headers" : {
"Content-Type" : {
@@ -439,9 +439,9 @@ class DslToWireMockClientConverterSpec extends Specification {
"url" : "/users/password",
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.email =~ /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4})?/)]"
"matchesJsonPath" : "$[?(@.['email'] =~ /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4})?/)]"
}, {
"matchesJsonPath" : "$[?(@.callback_url =~ /((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?/)]"
"matchesJsonPath" : "$[?(@.['callback_url'] =~ /((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?/)]"
} ],
"headers" : {
"Content-Type" : {
@@ -598,15 +598,15 @@ class DslToWireMockClientConverterSpec extends Specification {
}
},
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.valueWithoutAMatcher == 'foo')]"
"matchesJsonPath" : "$[?(@.['valueWithoutAMatcher'] == 'foo')]"
}, {
"matchesJsonPath" : "$[?(@.valueWithTypeMatch == 'string')]"
"matchesJsonPath" : "$[?(@.['valueWithTypeMatch'] == 'string')]"
}, {
"matchesJsonPath" : "$.list.some.nested[?(@.anothervalue == 4)]"
"matchesJsonPath" : "$.['list'].['some'].['nested'][?(@.['anothervalue'] == 4)]"
}, {
"matchesJsonPath" : "$.list.someother.nested[?(@.anothervalue == 4)]"
"matchesJsonPath" : "$.['list'].['someother'].['nested'][?(@.['anothervalue'] == 4)]"
}, {
"matchesJsonPath" : "$.list.someother.nested[?(@.json == 'with value')]"
"matchesJsonPath" : "$.['list'].['someother'].['nested'][?(@.['json'] == 'with value')]"
}, {
"matchesJsonPath" : "$[?(@.duck =~ /([0-9]{3})/)]"
}, {
@@ -716,8 +716,8 @@ class DslToWireMockClientConverterSpec extends Specification {
callback_url: 'http://partners.com'
)
stubMatchers {
jsonPath('$.email', byRegex(email()))
jsonPath('$.callback_url', byRegex(hostname()))
jsonPath('$.[\\'email\\']', byRegex(email()))
jsonPath('$.[\\'callback_url\\']', byRegex(hostname()))
}
}
response {
@@ -746,9 +746,9 @@ class DslToWireMockClientConverterSpec extends Specification {
"url" : "/users/password2",
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.email =~ /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4})/)]"
"matchesJsonPath" : "$[?(@.['email'] =~ /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4})/)]"
}, {
"matchesJsonPath" : "$[?(@.callback_url =~ /(((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?)/)]"
"matchesJsonPath" : "$[?(@.['callback_url'] =~ /(((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?)/)]"
} ],
"headers" : {
"Content-Type" : {

View File

@@ -83,7 +83,7 @@ class JUnitMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, Map.Entry entry) {
processBodyElement(blockBuilder, property + "." + entry.key, entry.value)
processBodyElement(blockBuilder, property, property + "." + entry.key, entry.value)
}
@Override

View File

@@ -103,7 +103,7 @@ abstract class JUnitMethodBodyBuilder extends RequestProcessingMethodBodyBuilder
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, Map.Entry entry) {
processBodyElement(blockBuilder, getMapKeyReferenceString(property, entry), entry.value)
processBodyElement(blockBuilder, property, getMapKeyReferenceString(property, entry), entry.value)
}
private String getMapKeyReferenceString(String property, Map.Entry entry) {

View File

@@ -45,6 +45,7 @@ import org.springframework.cloud.contract.verifier.util.JsonPaths
import org.springframework.cloud.contract.verifier.util.JsonToJsonPathsConverter
import org.springframework.cloud.contract.verifier.util.MapConverter
import org.springframework.util.SerializationUtils
import org.springframework.util.StringUtils
import java.lang.invoke.MethodHandles
import java.util.regex.Pattern
@@ -367,7 +368,7 @@ abstract class MethodBodyBuilder {
}
}
}
processBodyElement(bb, "", convertedResponseBody)
processBodyElement(bb, "", "", convertedResponseBody)
}
protected String processIfTemplateIsPresent(String method, DocumentContext parsedRequestBody) {
@@ -432,7 +433,7 @@ abstract class MethodBodyBuilder {
// Doing a clone doesn't work for nested lists...
private Object cloneBody(Object object) {
if (object instanceof List) {
if (object instanceof List || object instanceof Map) {
byte[] serializedObject = SerializationUtils.serialize(object)
return SerializationUtils.deserialize(serializedObject)
}
@@ -501,6 +502,21 @@ abstract class MethodBodyBuilder {
return '"' + StringEscapeUtils.escapeJava(string) + '"'
}
protected String trailingKey(String key) {
if (key.startsWith(".")) {
return key.substring(1)
}
return key
}
private String wrappedWithBracketsForDottedProp(String key) {
String remindingKey = trailingKey(key)
if (remindingKey.contains(".")) {
return "['${remindingKey}']"
}
return remindingKey
}
/**
* Post processing of each JSON path entry
*/
@@ -520,8 +536,8 @@ abstract class MethodBodyBuilder {
* Appends to {@link BlockBuilder} processing of the given String value.
*/
protected void processText(BlockBuilder blockBuilder, String property, Object value) {
if (value instanceof String && value.startsWith('$')) {
String newValue = stripFirstChar(value).replaceAll('\\$value', "responseBody$property")
if (value instanceof String && (value as String).startsWith('$')) {
String newValue = stripFirstChar((value as String)).replaceAll('\\$value', "responseBody$property")
blockBuilder.addLine(newValue)
addColonIfRequired(blockBuilder)
} else {
@@ -545,6 +561,16 @@ abstract class MethodBodyBuilder {
protected void processBodyElement(BlockBuilder blockBuilder, String property, Object value) {
}
/**
* Appends to the {@link BlockBuilder} the assertion for the given body element
*/
protected void processBodyElement(BlockBuilder blockBuilder, String oldProp, String property, Object value) {
String propDiff = property - oldProp
String prop = wrappedWithBracketsForDottedProp(propDiff)
String mergedProp = StringUtils.hasText(property) ? "${oldProp}.${prop}" : ""
processBodyElement(blockBuilder, mergedProp, value)
}
/**
* Removes unnecessary quotes
*/
@@ -632,7 +658,7 @@ abstract class MethodBodyBuilder {
protected void processBodyElement(BlockBuilder blockBuilder, String property, List list) {
list.eachWithIndex { listElement, listIndex ->
String prop = getPropertyInListString(property, listIndex as Integer)
processBodyElement(blockBuilder, prop, listElement)
processBodyElement(blockBuilder, property, prop, listElement)
}
}

View File

@@ -67,7 +67,7 @@ class RestAssuredJUnitMethodBodyBuilder extends JUnitMethodBodyBuilder {
protected void processHeaderElement(BlockBuilder blockBuilder, String property, Object value) {
if (value instanceof NotToEscapePattern) {
blockBuilder.addLine("assertThat(response.header(\"$property\"))." +
"${createMatchesMethod(value.serverValue.pattern().replace("\\", "\\\\"))};")
"${createMatchesMethod((value as NotToEscapePattern).serverValue.pattern().replace("\\", "\\\\"))};")
}
}

View File

@@ -68,7 +68,7 @@ class SpockMessagingMethodBodyBuilder extends MessagingMethodBodyBuilder {
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, Map.Entry entry) {
processBodyElement(blockBuilder, property + "." + entry.key, entry.value)
processBodyElement(blockBuilder, property, property + "." + entry.key, entry.value)
}
@Override

View File

@@ -69,12 +69,12 @@ abstract class SpockMethodRequestProcessingBodyBuilder extends RequestProcessing
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, ExecutionProperty exec) {
blockBuilder.addLine("${exec.insertValue("parsedJson.read('\$$property')")}")
blockBuilder.addLine("${exec.insertValue("parsedJson.read('''\$$property''')")}")
}
@Override
protected void processBodyElement(BlockBuilder blockBuilder, String property, Map.Entry entry) {
processBodyElement(blockBuilder, property + "." + entry.key, entry.value)
processBodyElement(blockBuilder, property, property + "." + entry.key, entry.value)
}
@Override

View File

@@ -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
@@ -82,11 +82,12 @@ class DelegatingJsonVerifiable implements MethodBufferingJsonVerifiable {
@Override
public MethodBufferingJsonVerifiable field(Object value) {
Object valueToPut = value instanceof ShouldTraverse ? ((ShouldTraverse) value).value : value;
DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.field(valueToPut), this.methodsBuffer);
Object wrappedValue = wrapInBrackets(valueToPut);
DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.field(wrappedValue), this.methodsBuffer);
if (this.delegate.isIteratingOverArray() && !(value instanceof ShouldTraverse)) {
verifiable.appendMethodWithQuotedValue("contains", valueToPut);
verifiable.appendMethodWithQuotedValue("contains", wrappedValue);
} else {
verifiable.appendMethodWithQuotedValue("field", valueToPut);
verifiable.appendMethodWithQuotedValue("field", wrappedValue);
}
return verifiable;
}
@@ -102,15 +103,17 @@ class DelegatingJsonVerifiable implements MethodBufferingJsonVerifiable {
@Override
public MethodBufferingJsonVerifiable array(Object value) {
DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.array(value), this.methodsBuffer);
verifiable.appendMethodWithQuotedValue("array", value);
Object valueToPut = wrapInBrackets(value);
DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.array(valueToPut), this.methodsBuffer);
verifiable.appendMethodWithQuotedValue("array", valueToPut);
return verifiable;
}
@Override
public MethodBufferingJsonVerifiable arrayField(Object value) {
DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.field(value).arrayField(), this.methodsBuffer);
verifiable.appendMethodWithQuotedValue("array", value);
Object valueToPut = wrapInBrackets(value);
DelegatingJsonVerifiable verifiable = new DelegatingJsonVerifiable(this.delegate.field(valueToPut).arrayField(), this.methodsBuffer);
verifiable.appendMethodWithQuotedValue("array", valueToPut);
return verifiable;
}
@@ -289,6 +292,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();

View File

@@ -116,13 +116,25 @@ class JsonToJsonPathsConverter {
if (value == null && bodyMatcher.matchingType() != MatchingType.EQUALITY) {
return path
}
int lastIndexOfDot = path.lastIndexOf(".")
int lastIndexOfDot = lastIndexOfDot(path)
String toLastDot = path.substring(0, lastIndexOfDot)
String fromLastDot = path.substring(lastIndexOfDot + 1)
String comparison = createComparison(bodyMatcher, value, body)
return "${toLastDot}[?(@.${fromLastDot} ${comparison})]"
}
private static int lastIndexOfDot(String path) {
if (pathContainsDotSeparatedKey(path)) {
int lastIndexOfBracket = path.lastIndexOf("['")
return path.substring(0, lastIndexOfBracket).lastIndexOf(".")
}
return path.lastIndexOf(".")
}
private static boolean pathContainsDotSeparatedKey(String path) {
return path.contains("['")
}
private static String createComparison(BodyMatcher bodyMatcher, Object value, def body) {
if (bodyMatcher.matchingType() == MatchingType.EQUALITY) {
if (!body) {

View File

@@ -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)

View File

@@ -16,6 +16,8 @@
package org.springframework.cloud.contract.verifier.builder
import com.jayway.jsonpath.DocumentContext
import com.jayway.jsonpath.JsonPath
import org.springframework.cloud.contract.spec.Contract
import org.springframework.cloud.contract.verifier.config.ContractVerifierConfigProperties
import org.springframework.cloud.contract.verifier.dsl.WireMockStubVerifier
@@ -52,8 +54,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 +88,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), contractDsl).toWireMockClientStub())
and:
@@ -123,9 +125,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), contractDsl).toWireMockClientStub())
and:
@@ -162,10 +164,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), contractDsl).toWireMockClientStub())
and:
@@ -261,8 +263,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 +297,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 +331,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 +370,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 +402,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 +523,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 +580,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 +745,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)
@@ -780,6 +782,20 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
test.contains('assertThatRejectionReasonIsNull(parsedJson.read("$.rejectionReason.title"));')
}
String sampleJson = '''
[
{
"name" : "iPhone",
"number": "0123-4567-8888"
},
{
"name" : "home",
"number": "0123-4567-8910"
}
]
'''
@Issue('#85')
def "should execute custom method for more complex structures on the response side when using Spock"() {
given:
@@ -806,8 +822,11 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
builder.appendTo(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$[0].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$[1].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$.[0].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$.[1].name")''')
and:
DocumentContext context = JsonPath.parse(sampleJson)
context.read('$.[0].name') == 'iPhone'
}
@Issue('#85')
@@ -836,8 +855,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub
builder.then(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$[0].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$[1].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$.[0].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$.[1].name")''')
}
@Issue('#150')
@@ -966,8 +985,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 +1056,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:

View File

@@ -83,7 +83,7 @@ class MethodBodyBuilderSpec extends Specification implements WireMockStubVerifie
builder.appendTo(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains('$.myArray[0].anotherArrayNeededForBug[0].optionalNotEmpty')
test.contains('$.myArray.[0].anotherArrayNeededForBug.[0].optionalNotEmpty')
!test.contains('cursor')
!test.contains('REGEXP>>')
and:
@@ -106,4 +106,51 @@ DocumentContext parsedJson = JsonPath.parse(json);
"JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) }
}
@Issue('#269')
def "should work with execute and keys with dots [#methodBuilderName]"() {
given:
Contract contractDsl = Contract.make {
request {
method 'GET'
urlPath '/foo'
}
response {
status 200
body (
foo: ["my.dotted.response" : $(c('foo'), p(execute('"foo".equals($it)')))]
)
headers {
contentType(applicationJson())
}
}
}
MethodBodyBuilder builder = methodBuilder(contractDsl)
BlockBuilder blockBuilder = new BlockBuilder(" ")
when:
builder.appendTo(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains('''$.foo.['my.dotted.response']''')
!test.contains('cursor')
!test.contains('REGEXP>>')
and:
SyntaxChecker.tryToCompile(methodBuilderName, blockBuilder.toString())
and:
String jsonSample = '''\
String json = "{\\"foo\\":{\\"my.dotted.response\\":\\"foo\\"}}";
DocumentContext parsedJson = JsonPath.parse(json);
'''
and:
LinkedList<String> lines = [] as LinkedList<String>
test.eachLine { if (it.contains('"foo".equals')) lines << it else it }
lines.addFirst(jsonSample)
SyntaxChecker.tryToRun(methodBuilderName, lines.join("\n"))
where:
methodBuilderName | methodBuilder
"MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) }
"MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) }
"JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) }
"JaxRsClientJUnitMethodBodyBuilder" | { Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) }
}
}

View File

@@ -126,8 +126,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:
@@ -160,9 +160,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:
@@ -197,9 +197,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:
@@ -236,10 +236,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:
@@ -335,8 +335,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:
@@ -370,8 +370,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:
@@ -404,8 +404,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:
@@ -438,8 +438,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:
@@ -476,8 +476,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:
@@ -510,8 +510,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:
@@ -545,7 +545,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:
@@ -601,8 +601,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:
@@ -659,8 +659,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:
@@ -843,8 +843,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:
@@ -922,7 +922,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())
@@ -942,7 +942,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''')
@@ -962,7 +962,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''')
@@ -1021,7 +1021,7 @@ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStub
}
where:
methodBuilderName | methodBuilder | assertionStrings
"MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | ['''assertThatRejectionReasonIsNull(parsedJson.read('$.rejectionReason'))''', '''assertThatLocationIsNull(response.header('Location'))''']
"MockMvcSpockMethodBuilder" | { Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties) } | ['''assertThatRejectionReasonIsNull(parsedJson.read(\'\'\'$.rejectionReason\'\'\'))''', '''assertThatLocationIsNull(response.header('Location'))''']
"MockMvcJUnitMethodBuilder" | { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties) } | ['''assertThatRejectionReasonIsNull(parsedJson.read("$.rejectionReason"))''', '''assertThatLocationIsNull(response.header("Location"))''']
}
@@ -1273,7 +1273,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())
}
@@ -1309,7 +1309,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())
}
@@ -1336,7 +1336,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
@@ -1372,7 +1372,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())
}
@@ -1539,8 +1539,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:
@@ -1568,7 +1568,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)
}
@@ -1660,7 +1660,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())
}
@@ -1689,7 +1689,7 @@ World.'''"""
builder.then(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains('assertThatRejectionReasonIsNull(parsedJson.read(\'$.rejectionReason.title\'))')
test.contains('assertThatRejectionReasonIsNull(parsedJson.read(\'\'\'$.rejectionReason.title\'\'\'))')
when:
SyntaxChecker.tryToCompileGroovy(blockBuilder.toString())
then:
@@ -1723,8 +1723,8 @@ World.'''"""
builder.then(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains('''assertThatUserNameIsNotNull(parsedJson.read('$[0].name')''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read('$[1].name')''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read(\'\'\'$.[0].name\'\'\')''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read(\'\'\'$.[1].name\'\'\')''')
}
@Issue('#85')
@@ -1753,8 +1753,8 @@ World.'''"""
builder.then(blockBuilder)
def test = blockBuilder.toString()
then:
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$[0].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$[1].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$.[0].name")''')
test.contains('''assertThatUserNameIsNotNull(parsedJson.read("$.[1].name")''')
}
@Issue('#111')
@@ -1937,21 +1937,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:
@@ -2065,7 +2065,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())
@@ -2102,8 +2102,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
@@ -2171,8 +2171,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) }
@@ -2260,15 +2260,15 @@ DocumentContext parsedJson = JsonPath.parse(json);
SyntaxChecker.tryToCompileWithoutCompileStatic(methodBuilderName, test)
then:
!test.contains('''DslProperty''')
test.contains('''assertThatJson(parsedJson).field("url").isEqualTo("/api/v1/xxxx")''')
test.contains('''assertThatJson(parsedJson).field("fullBody").isEqualTo("{\\"foo\\":\\"bar\\",\\"baz\\":5}")''')
test.contains('''assertThatJson(parsedJson).field("paramIndex").isEqualTo("bar2")''')
test.contains('''assertThatJson(parsedJson).field("responseFoo").isEqualTo("bar")''')
test.contains('''assertThatJson(parsedJson).field("authorization").isEqualTo("secret")''')
test.contains('''assertThatJson(parsedJson).field("authorization2").isEqualTo("secret2")''')
test.contains('''assertThatJson(parsedJson).field("responseBaz").isEqualTo(5)''')
test.contains('''assertThatJson(parsedJson).field("responseBaz2").isEqualTo("Bla bla bar bla bla")''')
test.contains('''assertThatJson(parsedJson).field("param").isEqualTo("bar")''')
test.contains('''assertThatJson(parsedJson).field("['url']").isEqualTo("/api/v1/xxxx")''')
test.contains('''assertThatJson(parsedJson).field("['fullBody']").isEqualTo("{\\"foo\\":\\"bar\\",\\"baz\\":5}")''')
test.contains('''assertThatJson(parsedJson).field("['paramIndex']").isEqualTo("bar2")''')
test.contains('''assertThatJson(parsedJson).field("['responseFoo']").isEqualTo("bar")''')
test.contains('''assertThatJson(parsedJson).field("['authorization']").isEqualTo("secret")''')
test.contains('''assertThatJson(parsedJson).field("['authorization2']").isEqualTo("secret2")''')
test.contains('''assertThatJson(parsedJson).field("['responseBaz']").isEqualTo(5)''')
test.contains('''assertThatJson(parsedJson).field("['responseBaz2']").isEqualTo("Bla bla bar bla bla")''')
test.contains('''assertThatJson(parsedJson).field("['param']").isEqualTo("bar")''')
responseAssertion(test)
where:
methodBuilderName | methodBuilder | responseAssertion

View File

@@ -51,7 +51,10 @@ class MockMvcMethodBodyBuilderWithMatchersSpec extends Specification implements
dateTime: "2017-01-01T01:23:45",
time: "01:02:34",
valueWithoutAMatcher: "foo",
valueWithTypeMatch: "string"
valueWithTypeMatch: "string",
key: [
'complex.key' : 'foo'
]
])
stubMatchers {
jsonPath('$.duck', byRegex("[0-9]{3}"))
@@ -63,6 +66,7 @@ class MockMvcMethodBodyBuilderWithMatchersSpec extends Specification implements
jsonPath('$.date', byDate())
jsonPath('$.dateTime', byTimestamp())
jsonPath('$.time', byTime())
jsonPath("\$.['key'].['complex.key']", byEquality())
}
headers {
contentType(applicationJson())
@@ -91,6 +95,9 @@ class MockMvcMethodBodyBuilderWithMatchersSpec extends Specification implements
],
valueWithMinEmpty: [],
valueWithMaxEmpty: [],
key: [
'complex.key' : 'foo'
]
])
testMatchers {
// asserts the jsonpath value against manual regex
@@ -131,6 +138,7 @@ class MockMvcMethodBodyBuilderWithMatchersSpec extends Specification implements
})
// will execute a method `assertThatValueIsANumber`
jsonPath('$.duck', byCommand('assertThatValueIsANumber($it)'))
jsonPath("\$.['key'].['complex.key']", byEquality())
}
headers {
contentType(applicationJson())
@@ -165,6 +173,7 @@ class MockMvcMethodBodyBuilderWithMatchersSpec extends Specification implements
test.contains('assertThat((Object) parsedJson.read("' + rootElement + '.valueWithMaxEmpty")).isInstanceOf(java.util.List.class)')
test.contains('assertThat(parsedJson.read("' + rootElement + '.valueWithMaxEmpty", java.util.Collection.class)).hasSizeLessThanOrEqualTo(0)')
test.contains('assertThatValueIsANumber(parsedJson.read("' + rootElement + '.duck")')
test.contains('assertThat(parsedJson.read("' + rootElement + '''.['key'].['complex.key']", String.class)).isEqualTo("foo")''')
!test.contains('cursor')
and:
try {

View File

@@ -275,7 +275,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"urlPattern" : "/[0-9]{2}",
"method" : "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.name == 'Jan')]"
"matchesJsonPath" : "$[?(@.['name'] == 'Jan')]"
} ]
},
"response" : {
@@ -324,13 +324,13 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"urlPattern" : "/[0-9]{2}",
"method" : "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.created == '2014-02-02 12:23:43')]"
"matchesJsonPath" : "$[?(@.['created'] == '2014-02-02 12:23:43')]"
}, {
"matchesJsonPath" : "$[?(@.surname =~ /[a-zA-Z]+/)]"
"matchesJsonPath" : "$[?(@.['surname'] =~ /[a-zA-Z]+/)]"
}, {
"matchesJsonPath" : "$[?(@.name == 'Jan')]"
"matchesJsonPath" : "$[?(@.['name'] == 'Jan')]"
}, {
"matchesJsonPath" : "$[?(@.id =~ /[0-9]+/)]"
"matchesJsonPath" : "$[?(@.['id'] =~ /[0-9]+/)]"
} ]
},
"response" : {
@@ -371,7 +371,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"url" : "/users",
"method" : "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.name == 'Jan')]"
"matchesJsonPath" : "$[?(@.['name'] == 'Jan')]"
} ],
"headers" : {
"Content-Type" : {
@@ -615,7 +615,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"urlPattern" : "/[0-9]{2}",
"method" : "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.personalId =~ /^[0-9]{11}$/)]"
"matchesJsonPath" : "$[?(@.['personalId'] =~ /^[0-9]{11}$/)]"
} ]
},
"response" : {
@@ -671,9 +671,9 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"url" : "/fraudcheck",
"method" : "PUT",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.loanAmount == 123.123)]"
"matchesJsonPath" : "$[?(@.['loanAmount'] == 123.123)]"
}, {
"matchesJsonPath" : "$[?(@.clientPesel =~ /[0-9]{10}/)]"
"matchesJsonPath" : "$[?(@.['clientPesel'] =~ /[0-9]{10}/)]"
} ],
"headers" : {
"Content-Type" : {
@@ -1065,17 +1065,17 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"urlPattern" : "/[0-9]{2}",
"method" : "GET",
"bodyPatterns" : [ {
"matchesJsonPath" : "$.errors[*][?(@.propertyName =~ /[0-9]{2}/)]"
"matchesJsonPath" : "$.['errors'][*][?(@.['propertyName'] =~ /[0-9]{2}/)]"
}, {
"matchesJsonPath" : "$.errors[*][?(@.providerValue == 'Test')]"
"matchesJsonPath" : "$.['errors'][*][?(@.['providerValue'] == 'Test')]"
}, {
"matchesJsonPath" : "$[?(@.lastName =~ /.*/)]"
"matchesJsonPath" : "$[?(@.['lastName'] =~ /.*/)]"
}, {
"matchesJsonPath" : "$[?(@.firstName =~ /.*/)]"
"matchesJsonPath" : "$[?(@.['firstName'] =~ /.*/)]"
}, {
"matchesJsonPath" : "$[?(@.birthDate =~ /[0-9]{4}-[0-9]{2}-[0-9]{2}/)]"
"matchesJsonPath" : "$[?(@.['birthDate'] =~ /[0-9]{4}-[0-9]{2}-[0-9]{2}/)]"
}, {
"matchesJsonPath" : "$[?(@.personalId =~ /[0-9]{11}/)]"
"matchesJsonPath" : "$[?(@.['personalId'] =~ /[0-9]{11}/)]"
}]
},
"response" : {
@@ -1126,17 +1126,17 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"url" : "/reissue-payment-order",
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.loanNumber == '999997001')]"
"matchesJsonPath" : "$[?(@.['loanNumber'] == '999997001')]"
}, {
"matchesJsonPath" : "$[?(@.username =~ /.*/)]"
"matchesJsonPath" : "$[?(@.['username'] =~ /.*/)]"
}, {
"matchesJsonPath" : "$[?(@.amount =~ /[0-9.]+/)]"
"matchesJsonPath" : "$[?(@.['amount'] =~ /[0-9.]+/)]"
}, {
"matchesJsonPath" : "$[?(@.cardId == 1)]"
"matchesJsonPath" : "$[?(@.['cardId'] == 1)]"
}, {
"matchesJsonPath" : "$[?(@.currency == 'DKK')]"
"matchesJsonPath" : "$[?(@.['currency'] == 'DKK')]"
}, {
"matchesJsonPath" : "$[?(@.applicationName =~ /.*/)]"
"matchesJsonPath" : "$[?(@.['applicationName'] =~ /.*/)]"
} ]
},
"response" : {
@@ -1238,7 +1238,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"request" : {
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.property == 'value')]"
"matchesJsonPath" : "$[?(@.['property'] == 'value')]"
} ]
},
"response" : {
@@ -1324,9 +1324,9 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"url" : "/users/password",
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.callback_url =~ /((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?/)]"
"matchesJsonPath" : "$[?(@.['callback_url'] =~ /((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?/)]"
}, {
"matchesJsonPath" : "$[?(@.email =~ /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}/)]"
"matchesJsonPath" : "$[?(@.['email'] =~ /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4}/)]"
} ],
"headers" : {
"Content-Type" : {
@@ -1376,7 +1376,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"urlPattern" : "/partners/^[0-9]*$/agents/11/customers/09665703Z",
"method" : "PUT",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.first_name == 'Josef')]"
"matchesJsonPath" : "$[?(@.['first_name'] == 'Josef')]"
} ],
"headers" : {
"Content-Type" : {
@@ -1405,9 +1405,9 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
"url" : "/users/password",
"method" : "POST",
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.callback_url =~ /((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?/)]"
"matchesJsonPath" : "$[?(@.['callback_url'] =~ /((http[s]?|ftp):\\\\/)\\\\/?([^:\\\\/\\\\s]+)(:[0-9]{1,5})?/)]"
}, {
"matchesJsonPath" : "$[?(@.email =~ /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4})?/)]"
"matchesJsonPath" : "$[?(@.['email'] =~ /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,4})?/)]"
} ],
"headers" : {
"Content-Type" : {
@@ -1496,7 +1496,7 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
}
String toWireMockClientJsonStub(Contract groovyDsl) {
new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null, groovyDsl), groovyDsl).toWireMockClientStub()
return new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null, groovyDsl), groovyDsl).toWireMockClientStub()
}
@Issue('180')
@@ -1545,59 +1545,6 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
stubMappingIsValidWireMockStub(wireMockStub)
}
@Issue('#30')
def "should not create a stub for a skipped contract"() {
given:
org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
ignored()
method 'GET'
urlPath ('/some/api') {
queryParameters {
parameter 'size': value(
consumer(regex('[0-9]+')),
producer(1)
)
}
}
}
response {
status 200
body('')
}
}
when:
def json = toWireMockClientJsonStub(groovyDsl)
then:
json == ''
}
@Issue('#30')
def "should not create a stub for a contract matching ignored pattern"() {
given:
org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
method 'GET'
urlPath ('/some/api') {
queryParameters {
parameter 'size': value(
consumer(regex('[0-9]+')),
producer(1)
)
}
}
}
response {
status 200
body('')
}
}
when:
def json = new WireMockStubStrategy("Test", new ContractMetadata(null, true, 0, null, groovyDsl), groovyDsl).toWireMockClientStub()
then:
json == ''
}
@Issue('#219')
def "should generate request with an optional queryParameter for client side"() {
given:
@@ -1677,42 +1624,95 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
stubMappingIsValidWireMockStub(json)
}
@Issue('#30')
def "should not create a stub for a skipped contract"() {
given:
org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
ignored()
method 'GET'
urlPath ('/some/api') {
queryParameters {
parameter 'size': value(
consumer(regex('[0-9]+')),
producer(1)
)
}
}
}
response {
status 200
body('')
}
}
when:
def json = toWireMockClientJsonStub(groovyDsl)
then:
json == ''
}
@Issue('#30')
def "should not create a stub for a contract matching ignored pattern"() {
given:
org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
method 'GET'
urlPath ('/some/api') {
queryParameters {
parameter 'size': value(
consumer(regex('[0-9]+')),
producer(1)
)
}
}
}
response {
status 200
body('')
}
}
when:
def json = new WireMockStubStrategy("Test", new ContractMetadata(null, true, 0, null, groovyDsl), groovyDsl).toWireMockClientStub()
then:
json == ''
}
@Issue('#237')
def "should generate a stub with response template"() {
given:
org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
method 'POST'
url('/api/v1/xxxx') {
queryParameters {
parameter("foo", "bar")
parameter("foo", "bar2")
}
org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
method 'POST'
url('/api/v1/xxxx') {
queryParameters {
parameter("foo", "bar")
parameter("foo", "bar2")
}
headers {
header(authorization(), "secret")
header(authorization(), "secret2")
}
body(foo: "bar", baz: 5)
}
response {
status 200
headers {
header(authorization(), fromRequest().header(authorization()))
}
body(
url: fromRequest().url(),
param: fromRequest().query("foo"),
paramIndex: fromRequest().query("foo", 1),
authorization: fromRequest().header("Authorization"),
authorization2: fromRequest().header("Authorization", 1),
fullBody: fromRequest().body(),
responseFoo: fromRequest().body('$.foo'),
responseBaz: fromRequest().body('$.baz'),
responseBaz2: "Bla bla ${fromRequest().body('$.foo')} bla bla"
)
headers {
header(authorization(), "secret")
header(authorization(), "secret2")
}
body(foo: "bar", baz: 5)
}
response {
status 200
headers {
header(authorization(), fromRequest().header(authorization()))
}
body(
url: fromRequest().url(),
param: fromRequest().query("foo"),
paramIndex: fromRequest().query("foo", 1),
authorization: fromRequest().header("Authorization"),
authorization2: fromRequest().header("Authorization", 1),
fullBody: fromRequest().body(),
responseFoo: fromRequest().body('$.foo'),
responseBaz: fromRequest().body('$.baz'),
responseBaz2: "Bla bla ${fromRequest().body('$.foo')} bla bla"
)
}
}
when:
def json = toWireMockClientJsonStub(groovyDsl)
then:
@@ -1732,9 +1732,9 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
}
},
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.baz == 5)]"
"matchesJsonPath" : "$[?(@.['baz'] == 5)]"
}, {
"matchesJsonPath" : "$[?(@.foo == 'bar')]"
"matchesJsonPath" : "$[?(@.['foo'] == 'bar')]"
} ]
},
"response" : {
@@ -1775,6 +1775,55 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie
server?.shutdown()
}
@Issue('#269')
def "should create a stub for dot separated keys"() {
given:
Contract groovyDsl = org.springframework.cloud.contract.spec.Contract.make {
request {
method 'PUT'
url '/fraudcheck'
body([ // (4)
"client.id": $(regex('[0-9]{10}')),
loanAmount: 99999
])
headers {
contentType('application/vnd.fraud.v1+json')
}
}
response {
status 200
}
}
when:
String wireMockStub = new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null, groovyDsl), groovyDsl).toWireMockClientStub()
then:
AssertionUtil.assertThatJsonsAreEqual('''
{
"request" : {
"url" : "/fraudcheck",
"method" : "PUT",
"headers" : {
"Content-Type" : {
"matches" : "application/vnd\\\\.fraud\\\\.v1\\\\+json.*"
}
},
"bodyPatterns" : [ {
"matchesJsonPath" : "$[?(@.['loanAmount'] == 99999)]"
}, {
"matchesJsonPath" : "$[?(@.['client.id'] =~ /[0-9]{10}/)]"
} ]
}
},
"response" : {
"status" : 200
}
}
''', wireMockStub)
and:
stubMappingIsValidWireMockStub(wireMockStub)
}
WireMockConfiguration config() {
return new WireMockConfiguration().extensions(responseTemplateTransformer())
}

View File

@@ -38,24 +38,24 @@ 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.jsonPath() == '''$[*].some.nested[?(@.json == '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.jsonPath() == '''$[*].some.nested[?(@.anothervalue == 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.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == '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.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == '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.jsonPath() == '''$[*].some.nested.withlist[*].anothernested[?(@.name == '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:
assertThatJsonPathsInMapAreValid(json, pathAndValues)
@@ -131,20 +131,20 @@ 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.jsonPath() == '''$.some.nested[?(@.json == '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.jsonPath() == '''$.some.nested[?(@.anothervalue == 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.jsonPath() == '''$.some.nested.withlist[*][?(@.name == '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.jsonPath() == '''$.some.nested.withlist[*][?(@.name == 'name2')]'''
it.method() == """.field("['some']").field("['nested']").array("['withlist']").contains("['name']").isEqualTo("name2")""" &&
it.jsonPath() == '''$.['some'].['nested'].['withlist'][*][?(@.['name'] == 'name2')]'''
}
and:
assertThatJsonPathsInMapAreValid(json, pathAndValues)
@@ -161,8 +161,8 @@ 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.jsonPath() == '''$.items[?(@ == 'HOP')]'''
it.method() == """.array("['items']").arrayField().isEqualTo("HOP").value()""" &&
it.jsonPath() == '''$.['items'][?(@ == 'HOP')]'''
}
and:
assertThatJsonPathsInMapAreValid(json, pathAndValues)
@@ -180,12 +180,12 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json))
then:
pathAndValues.find {
it.method() == """.field("property1").isNull()""" &&
it.jsonPath() == '''$[?(@.property1 == null)]'''
it.method() == """.field("['property1']").isNull()""" &&
it.jsonPath() == '''$[?(@.['property1'] == null)]'''
}
pathAndValues.find {
it.method() == """.field("property2").isEqualTo(true)""" &&
it.jsonPath() == '''$[?(@.property2 == true)]'''
it.method() == """.field("['property2']").isEqualTo(true)""" &&
it.jsonPath() == '''$[?(@.['property2'] == true)]'''
}
}
@@ -199,16 +199,16 @@ 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.jsonPath() == '''$.extensions[?(@.7 == 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.jsonPath() == '''$.extensions[?(@.14 == 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.jsonPath() == '''$.extensions[?(@.30 == 60.00)]'''
it.method() == """.field("['extensions']").field("['30']").isEqualTo(60.00)""" &&
it.jsonPath() == '''$.['extensions'][?(@.['30'] == 60.00)]'''
}
and:
assertThatJsonPathsInMapAreValid(json, pathAndValues)
@@ -228,16 +228,16 @@ 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.jsonPath() == '''$.errors[*][?(@.property == '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.jsonPath() == '''$.errors[*][?(@.message == '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.jsonPath() == '''$.errors[*][?(@.message == 'inconsistent value2')]'''
it.method() == """.array("['errors']").contains("['message']").isEqualTo("inconsistent value2")""" &&
it.jsonPath() == '''$.['errors'][*][?(@.['message'] == 'inconsistent value2')]'''
}
and:
assertThatJsonPathsInMapAreValid(json, pathAndValues)
@@ -279,31 +279,31 @@ 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.jsonPath() == '''$[*].some.nested[?(@.json == '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.jsonPath() == '''$[*].some.nested[?(@.anothervalue == 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.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == '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.jsonPath() == '''$[*].some.nested.withlist[*][?(@.name == '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.jsonPath() == '''$[*].some.nested.withlist[*].anothernested[?(@.name =~ /[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:
json.some.nested.withlist[0][2].anothernested.name = "Kowalski"
then:
assertThatJsonPathsInMapAreValid(JsonOutput.prettyPrint(JsonOutput.toJson(json)), pathAndValues)
}
def "should generate assertions for simple response body"() {
given:
@@ -315,12 +315,12 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json))
then:
pathAndValues.find {
it.method()== """.field("property1").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.property1 == 'a')]"""
it.method()== """.field("['property1']").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.['property1'] == 'a')]"""
}
pathAndValues.find {
it.method()== """.field("property2").isEqualTo("b")""" &&
it.jsonPath() == """\$[?(@.property2 == 'b')]"""
it.method()== """.field("['property2']").isEqualTo("b")""" &&
it.jsonPath() == """\$[?(@.['property2'] == 'b')]"""
}
and:
pathAndValues.size() == 2
@@ -337,16 +337,16 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json))
then:
pathAndValues.find {
it.method()== """.field("property1").isEqualTo("true")""" &&
it.jsonPath() == """\$[?(@.property1 == 'true')]"""
it.method()== """.field("['property1']").isEqualTo("true")""" &&
it.jsonPath() == """\$[?(@.['property1'] == 'true')]"""
}
pathAndValues.find {
it.method()== """.field("property2").isNull()""" &&
it.jsonPath() == """\$[?(@.property2 == null)]"""
it.method()== """.field("['property2']").isNull()""" &&
it.jsonPath() == """\$[?(@.['property2'] == null)]"""
}
pathAndValues.find {
it.method()== """.field("property3").isEqualTo(false)""" &&
it.jsonPath() == """\$[?(@.property3 == false)]"""
it.method()== """.field("['property3']").isEqualTo(false)""" &&
it.jsonPath() == """\$[?(@.['property3'] == false)]"""
}
and:
pathAndValues.size() == 3
@@ -365,16 +365,16 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json)
then:
pathAndValues.find {
it.method()== """.field("property1").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.property1 == 'a')]"""
it.method()== """.field("['property1']").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.['property1'] == 'a')]"""
}
pathAndValues.find {
it.method()== """.array("property2").contains("a").isEqualTo("sth")""" &&
it.jsonPath() == """\$.property2[*][?(@.a == '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.jsonPath() == """\$.property2[*][?(@.b == 'sthElse')]"""
it.method()== """.array("['property2']").contains("['b']").isEqualTo("sthElse")""" &&
it.jsonPath() == """\$.['property2'][*][?(@.['b'] == 'sthElse')]"""
}
and:
pathAndValues.size() == 3
@@ -395,20 +395,20 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json)
then:
pathAndValues.find {
it.method()== """.field("property1").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.property1 == 'a')]"""
it.method()== """.field("['property1']").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.['property1'] == 'a')]"""
}
pathAndValues.find {
it.method()== """.array("property2").contains("a").isEqualTo("sth")""" &&
it.jsonPath() == """\$.property2[*][?(@.a == 'sth')]"""
it.method()== """.array("['property2']").contains("['a']").isEqualTo("sth")""" &&
it.jsonPath() == """\$.['property2'][*][?(@.['a'] == 'sth')]"""
}
pathAndValues.find {
it.method()== """.array("property2").hasSize(2)""" &&
it.jsonPath() == """\$.property2[*]"""
it.method()== """.array("['property2']").hasSize(2)""" &&
it.jsonPath() == """\$.['property2'][*]"""
}
pathAndValues.find {
it.method()== """.array("property2").contains("b").isEqualTo("sthElse")""" &&
it.jsonPath() == """\$.property2[*][?(@.b == 'sthElse')]"""
it.method()== """.array("['property2']").contains("['b']").isEqualTo("sthElse")""" &&
it.jsonPath() == """\$.['property2'][*][?(@.['b'] == 'sthElse')]"""
}
and:
pathAndValues.size() == 4
@@ -426,12 +426,12 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json)
then:
pathAndValues.find {
it.method()== """.field("property").field(7).isEqualTo(0.0)""" &&
it.jsonPath() == """\$.property[?(@.7 == 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.jsonPath() == """\$.property[?(@.14 == 0.0)]"""
it.method()== """.field("['property']").field(14).isEqualTo(0.0)""" &&
it.jsonPath() == """\$.['property'][?(@.14 == 0.0)]"""
}
and:
pathAndValues.size() == 2
@@ -450,12 +450,12 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json))
then:
pathAndValues.find {
it.method()== """.array().contains("property1").isEqualTo("a")""" &&
it.jsonPath() == """\$[*][?(@.property1 == 'a')]"""
it.method()== """.array().contains("['property1']").isEqualTo("a")""" &&
it.jsonPath() == """\$[*][?(@.['property1'] == 'a')]"""
}
pathAndValues.find {
it.method()== """.array().contains("property2").isEqualTo("b")""" &&
it.jsonPath() == """\$[*][?(@.property2 == 'b')]"""
it.method()== """.array().contains("['property2']").isEqualTo("b")""" &&
it.jsonPath() == """\$[*][?(@.['property2'] == 'b')]"""
}
and:
pathAndValues.size() == 2
@@ -476,12 +476,12 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(new JsonSlurper().parseText(json))
then:
pathAndValues.find {
it.method()== """.array().contains("property1").isEqualTo("a")""" &&
it.jsonPath() == """\$[*][?(@.property1 == 'a')]"""
it.method()== """.array().contains("['property1']").isEqualTo("a")""" &&
it.jsonPath() == """\$[*][?(@.['property1'] == 'a')]"""
}
pathAndValues.find {
it.method()== """.array().contains("property2").isEqualTo("b")""" &&
it.jsonPath() == """\$[*][?(@.property2 == 'b')]"""
it.method()== """.array().contains("['property2']").isEqualTo("b")""" &&
it.jsonPath() == """\$[*][?(@.['property2'] == 'b')]"""
}
pathAndValues.find {
it.method()== """.hasSize(2)""" &&
@@ -503,12 +503,12 @@ 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.jsonPath() == """\$.property1[*][?(@.property2 == '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.jsonPath() == """\$.property1[*][?(@.property3 == 'test2')]"""
it.method()== """.array("['property1']").contains("['property3']").isEqualTo("test2")""" &&
it.jsonPath() == """\$.['property1'][*][?(@.['property3'] == 'test2')]"""
}
and:
pathAndValues.size() == 2
@@ -528,16 +528,16 @@ 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.jsonPath() == """\$.property1[*][?(@.property2 == '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.jsonPath() == """\$.property1[*][?(@.property3 == 'test2')]"""
it.method()== """.array("['property1']").contains("['property3']").isEqualTo("test2")""" &&
it.jsonPath() == """\$.['property1'][*][?(@.['property3'] == 'test2')]"""
}
pathAndValues.find {
it.method()== """.array("property1").hasSize(2)""" &&
it.jsonPath() == """\$.property1[*]"""
it.method()== """.array("['property1']").hasSize(2)""" &&
it.jsonPath() == """\$.['property1'][*]"""
}
and:
pathAndValues.size() == 3
@@ -553,12 +553,12 @@ 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.jsonPath() == """\$.property2[?(@.property3 == 'b')]"""
it.method()== """.field("['property2']").field("['property3']").isEqualTo("b")""" &&
it.jsonPath() == """\$.['property2'][?(@.['property3'] == 'b')]"""
}
pathAndValues.find {
it.method()== """.field("property1").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.property1 == 'a')]"""
it.method()== """.field("['property1']").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.['property1'] == 'a')]"""
}
and:
pathAndValues.size() == 2
@@ -574,12 +574,12 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json)
then:
pathAndValues.find {
it.method()== """.field("property2").matches("[0-9]{3}")""" &&
it.jsonPath() == """\$[?(@.property2 =~ /[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.jsonPath() == """\$[?(@.property1 == 'a')]"""
it.method()== """.field("['property1']").isEqualTo("a")""" &&
it.jsonPath() == """\$[?(@.['property1'] == 'a')]"""
}
and:
pathAndValues.size() == 2
@@ -594,8 +594,8 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json)
then:
pathAndValues.find {
it.method()== """.field("property2").matches("\\\\d+")""" &&
it.jsonPath() == """\$[?(@.property2 =~ /\\d+/)]"""
it.method()== """.field("['property2']").matches("\\\\d+")""" &&
it.jsonPath() == """\$[?(@.['property2'] =~ /\\d+/)]"""
}
and:
pathAndValues.size() == 1
@@ -613,12 +613,12 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json)
then:
pathAndValues.find {
it.method()== """.array("errors").contains("property").isEqualTo("bank_account_number")""" &&
it.jsonPath() == """\$.errors[*][?(@.property == '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.jsonPath() == """\$.errors[*][?(@.message == 'incorrect_format')]"""
it.method()== """.array("['errors']").contains("['message']").isEqualTo("incorrect_format")""" &&
it.jsonPath() == """\$.['errors'][*][?(@.['message'] == 'incorrect_format')]"""
}
and:
pathAndValues.size() == 2
@@ -638,16 +638,16 @@ class JsonToJsonPathsConverterSpec extends Specification {
JsonPaths pathAndValues = new JsonToJsonPathsConverter().transformToJsonPathWithTestsSideValues(json)
then:
pathAndValues.find {
it.method()== """.array("errors").contains("property").isEqualTo("bank_account_number")""" &&
it.jsonPath() == """\$.errors[*][?(@.property == '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.jsonPath() == """\$.errors[*][?(@.message == '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.jsonPath() == """\$.errors[*]"""
it.method()== """.array("['errors']").hasSize(1)""" &&
it.jsonPath() == """\$.['errors'][*]"""
}
and:
pathAndValues.size() == 3
@@ -674,20 +674,20 @@ 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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 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:
pathAndValues.size() == 4
@@ -720,32 +720,32 @@ 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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == -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.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*][?(@ == 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 {
it.method()== """.hasSize(1)""" &&
it.jsonPath() == """\$"""
}
pathAndValues.find {
it.method()== """.array().field("place").field("bounding_box").array("coordinates").array().hasSize(2)""" &&
it.jsonPath() == """\$[*].place.bounding_box.coordinates[*][*]"""
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.jsonPath() == """\$[*].place.bounding_box.coordinates[*]"""
it.method()== """.array().field("['place']").field("['bounding_box']").array("['coordinates']").hasSize(1)""" &&
it.jsonPath() == """\$[*].['place'].['bounding_box'].['coordinates'][*]"""
}
and:
pathAndValues.size() == 7
@@ -780,6 +780,15 @@ class JsonToJsonPathsConverterSpec extends Specification {
'$.a.b.c[?(@.d == 1234)]' == JsonToJsonPathsConverter.convertJsonPathAndRegexToAJsonPath(matcher(MatchingType.EQUALITY, jsonPath, null), body)
}
def "should convert a json path with value to a equality checking for a key with dots"() {
given:
String jsonPath = '$.a.b.c.[\'d.e\']'
and:
def body = [ a: [ b: [ c: [ "d.e" : 1234 ] ] ] ]
expect:
'$.a.b.c[?(@.[\'d.e\'] == 1234)]' == JsonToJsonPathsConverter.convertJsonPathAndRegexToAJsonPath(matcher(MatchingType.EQUALITY, jsonPath, null), body)
}
def "should convert a json path with value to a equality checking json path with quotes for strings"() {
given:
String jsonPath = '$.a.b.c.d'