From 99ac8d36c6468c006fefc5109176c51451dd3bab Mon Sep 17 00:00:00 2001 From: buildmaster Date: Thu, 18 Aug 2022 00:22:10 +0000 Subject: [PATCH 1/2] Bumping versions --- .../project/gradle.properties | 2 +- .../complete/contract-rest-client/pom.xml | 2 +- .../complete/contract-rest-service/pom.xml | 2 +- .../gs-contract-rest/initial/contract-rest-client/pom.xml | 2 +- .../initial/contract-rest-service/pom.xml | 2 +- .../cloud/contract/stubrunner/util/ZipCategory.java | 8 ++++---- .../functionalTest/scenarioProject/gradle.properties | 2 +- .../scenarioProjectKotlin/gradle.properties | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docker/spring-cloud-contract-docker/project/gradle.properties b/docker/spring-cloud-contract-docker/project/gradle.properties index 93887f80f3..06cd8f2675 100644 --- a/docker/spring-cloud-contract-docker/project/gradle.properties +++ b/docker/spring-cloud-contract-docker/project/gradle.properties @@ -1,4 +1,4 @@ org.gradle.daemon=false verifierVersion=3.1.4-SNAPSHOT -springBootVersion=2.6.7 +springBootVersion=2.6.8 camelVersion=3.11.0 \ No newline at end of file diff --git a/guides/gs-contract-rest/complete/contract-rest-client/pom.xml b/guides/gs-contract-rest/complete/contract-rest-client/pom.xml index 9420004df5..82b9e9c588 100644 --- a/guides/gs-contract-rest/complete/contract-rest-client/pom.xml +++ b/guides/gs-contract-rest/complete/contract-rest-client/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.7 + 2.6.8 diff --git a/guides/gs-contract-rest/complete/contract-rest-service/pom.xml b/guides/gs-contract-rest/complete/contract-rest-service/pom.xml index 32d8ce7c88..fc7e98e329 100644 --- a/guides/gs-contract-rest/complete/contract-rest-service/pom.xml +++ b/guides/gs-contract-rest/complete/contract-rest-service/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.7 + 2.6.8 diff --git a/guides/gs-contract-rest/initial/contract-rest-client/pom.xml b/guides/gs-contract-rest/initial/contract-rest-client/pom.xml index 238b04c7d3..a6a8a6d209 100644 --- a/guides/gs-contract-rest/initial/contract-rest-client/pom.xml +++ b/guides/gs-contract-rest/initial/contract-rest-client/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.7 + 2.6.8 diff --git a/guides/gs-contract-rest/initial/contract-rest-service/pom.xml b/guides/gs-contract-rest/initial/contract-rest-service/pom.xml index ef84518ac7..ab935c79b4 100644 --- a/guides/gs-contract-rest/initial/contract-rest-service/pom.xml +++ b/guides/gs-contract-rest/initial/contract-rest-service/pom.xml @@ -11,7 +11,7 @@ org.springframework.boot spring-boot-starter-parent - 2.6.7 + 2.6.8 diff --git a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/util/ZipCategory.java b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/util/ZipCategory.java index 7340e75f54..40dba8d898 100644 --- a/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/util/ZipCategory.java +++ b/spring-cloud-contract-stub-runner/src/main/java/org/springframework/cloud/contract/stubrunner/util/ZipCategory.java @@ -68,13 +68,13 @@ public final class ZipCategory { if (!entry.isDirectory()) { final File destinationFile = new File(destination, entry.getName()); /* - * If we see the relative traversal string of ".." we need to make sure - * that the outputdir + name doesn't leave the outputdir. + * If we see the relative traversal string of ".." we need to make + * sure that the outputdir + name doesn't leave the outputdir. */ String zipEntryName = entry.getName(); if (!destinationFile.toPath().normalize().startsWith(destination.toPath())) { - throw new ZipException("The file " + zipEntryName + - " is trying to leave the target output directory of " + destination); + throw new ZipException("The file " + zipEntryName + + " is trying to leave the target output directory of " + destination); } if (destinationFile.getParentFile() != null) { destinationFile.getParentFile().mkdirs(); diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties index d8e32711ed..d13c6b8b0f 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProject/gradle.properties @@ -16,5 +16,5 @@ wiremockVersion=2.30.1 jsonAssertVersion=0.6.2 verifierVersion=3.1.4-SNAPSHOT -bootVersion=2.6.7 +bootVersion=2.6.8 groovyVersion=2.4.17 diff --git a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProjectKotlin/gradle.properties b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProjectKotlin/gradle.properties index d8e32711ed..d13c6b8b0f 100644 --- a/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProjectKotlin/gradle.properties +++ b/spring-cloud-contract-tools/spring-cloud-contract-gradle-plugin/src/test/resources/functionalTest/scenarioProjectKotlin/gradle.properties @@ -16,5 +16,5 @@ wiremockVersion=2.30.1 jsonAssertVersion=0.6.2 verifierVersion=3.1.4-SNAPSHOT -bootVersion=2.6.7 +bootVersion=2.6.8 groovyVersion=2.4.17 From 9db7023ec7c1b67727c2348905156cd7aed7d8ed Mon Sep 17 00:00:00 2001 From: Artem Makarov Date: Fri, 19 Aug 2022 10:54:58 +0200 Subject: [PATCH 2/2] Fix improperly accessed optional values; ServerDslProperty incorrectly wrapped by OptionalProperty (#1809) Fixes gh-1808 --- .../spec/internal/OptionalProperty.java | 3 + .../verifier/util/ContentUtils.groovy | 2 +- .../builder/MethodBodyBuilderSpec.groovy | 64 +++++++++++++++++ .../dsl/wiremock/WireMockGroovyDslSpec.groovy | 68 +++++++++++++++++++ 4 files changed, 136 insertions(+), 1 deletion(-) diff --git a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java index 7d7d51b5d0..b4f9065184 100644 --- a/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java +++ b/specs/spring-cloud-contract-spec-java/src/main/java/org/springframework/cloud/contract/spec/internal/OptionalProperty.java @@ -54,6 +54,9 @@ public class OptionalProperty implements Serializable, CanBeDynamic { else if (value instanceof ClientDslProperty) { return valueToCheck(((ClientDslProperty) value).getClientValue()); } + else if (value instanceof ServerDslProperty) { + return valueToCheck(((ServerDslProperty) value).getServerValue()); + } else if (value instanceof RegexProperty || value instanceof Pattern) { return new RegexProperty(value).pattern(); } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy index f1b0c532ff..200955a616 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContentUtils.groovy @@ -321,7 +321,7 @@ class ContentUtils { } protected static Object transformJSONStringValue(OptionalProperty optional, Closure valueProvider) { - return String.format(JSON_VALUE_PATTERN_FOR_OPTIONAL, optional.value) + return String.format(JSON_VALUE_PATTERN_FOR_OPTIONAL, optional.value()) } protected static Object transformJSONStringValue(ExecutionProperty property, Closure valueProvider) { diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy index 0526672946..438ac76587 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilderSpec.groovy @@ -2174,4 +2174,68 @@ response: } } + @Issue("1808") + def "should correctly process optional of DslProperty parameters"() { + given: + Contract contractDsl = Contract.make { + request { + method('GET') + url("/api/foo") + headers { + header 'Content-Type': 'application/json' + header 'Accept': 'application/json' + } + body([ + key1: $(client(optional(anyOf("foo", "bar"))), server("bar")), + key2: $(client(optional(anyNonBlankString())), server("bar")), + key3: $(client(optional(anyEmail())), server("foo@bar.com")), + key4: $(optional(anyNumber())) + ]) + } + response { + status OK() + headers { + header 'Content-Type': 'application/json' + } + body([ + key1: $(client("bar"), server(optional(anyOf("foo", "bar")))), + key2: $(client("bar"), server(optional(anyNonBlankString()))), + key3: $(client("foo@bar.com"), server(optional(anyEmail()))), + key4: $(optional(anyNumber())) + ]) + } + } + methodBuilder() + when: + String test = singleTestGenerator(contractDsl) + then: + SyntaxChecker.tryToCompile(methodBuilderName, test) + then: + test.contains('assertThatJson(parsedJson).field("[\'key1\']").matches("(^foo' + endOfLineRegexSymbol + '|^bar' + endOfLineRegexSymbol + ')?")') + test.contains('assertThatJson(parsedJson).field("[\'key2\']").matches("(^\\\\s*\\\\S[\\\\S\\\\s]*)?")') + test.contains('assertThatJson(parsedJson).field("[\'key3\']").matches("([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,6})?")') + test.contains('assertThatJson(parsedJson).field("[\'key4\']").matches("(-?(\\\\d*\\\\.\\\\d+|\\\\d+))?")') + and: + stubMappingIsValidWireMockStub(contractDsl) + where: + methodBuilderName | methodBuilder | endOfLineRegexSymbol + "spock" | { + properties.testFramework = TestFramework.SPOCK + } | '\\$' + "mockmvc" | { + properties.testMode = TestMode.MOCKMVC + } | '\$' + "jaxrs-spock" | { + properties.testFramework = TestFramework.SPOCK; properties.testMode = TestMode.JAXRSCLIENT + } | '\\$' + "jaxrs" | { + properties.testFramework = TestFramework.JUNIT; properties.testMode = TestMode.JAXRSCLIENT + } | '\$' + "webclient" | { + properties.testMode = TestMode.WEBTESTCLIENT + } | '\$' + "testNG" | { + properties.testFramework = TestFramework.TESTNG + } | '\$' + } } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy index 5fcf4ba8c1..044cd35a11 100755 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/dsl/wiremock/WireMockGroovyDslSpec.groovy @@ -3130,6 +3130,74 @@ class WireMockGroovyDslSpec extends Specification implements WireMockStubVerifie stubMappingIsValidWireMockStub(wireMockStub) } + @Issue("1808") + def "should correctly process optional of DslProperty parameters"() { + given: + org.springframework.cloud.contract.spec.Contract groovyDsl = org.springframework.cloud.contract.spec.Contract. + make { + request { + method('GET') + url("/api/foo") + headers { + header("Content-Type", "application/json") + header("Accept", "application/json") + } + body( + key1: $(client(optional(anyOf("foo", "bar"))), server("bar")), + key2: $(client(optional(anyNonBlankString())), server("bar")), + key3: $(client(optional(anyEmail())), server("foo@bar.com")), + key4: $(optional(anyNumber())), + ) + } + response { + status OK() + body("ok") + headers { + header 'Content-Type': 'text/plain' + } + } + } + when: + String wireMockStub = new WireMockStubStrategy("Test", new ContractMetadata(null, false, 0, null, groovyDsl), groovyDsl). + toWireMockClientStub() + then: + AssertionUtil.assertThatJsonsAreEqual(''' + { + "request" : { + "url" : "/api/foo", + "method" : "GET", + "headers" : { + "Content-Type" : { + "equalTo" : "application/json" + }, + "Accept" : { + "equalTo" : "application/json" + } + }, + "bodyPatterns" : [ { + "matchesJsonPath" : "$[?(@.['key1'] =~ /(^foo$|^bar$)?/)]" + }, { + "matchesJsonPath" : "$[?(@.['key2'] =~ /(^\\\\s*\\\\S[\\\\S\\\\s]*)?/)]" + }, { + "matchesJsonPath" : "$[?(@.['key3'] =~ /([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\\\.[a-zA-Z]{2,6})?/)]" + }, { + "matchesJsonPath" : "$[?(@.['key4'] =~ /(-?(\\\\d*\\\\.\\\\d+|\\\\d+))?/)]" + } ] + }, + "response" : { + "status" : 200, + "body" : "ok", + "headers" : { + "Content-Type" : "text/plain" + }, + "transformers" : [ "response-template", "foo-transformer" ] + } + } + ''', wireMockStub) + and: + stubMappingIsValidWireMockStub(wireMockStub) + } + WireMockConfiguration config() { return new WireMockConfiguration().extensions(responseTemplateTransformer()) }