diff --git a/.circleci/config.yml b/.circleci/config.yml index e49cc159ca..3ea9e1ab9d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -32,7 +32,7 @@ jobs: command: rm -rf ~/.m2/repository/org/springframework/cloud/contract && rm -rf ~/.m2/repository/com/example - run: name: "Running build" - command: ./mvnw -s .settings.xml clean org.jacoco:jacoco-maven-plugin:prepare-agent install -U -Pdocs,fast,integration,sonar -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn + command: ./mvnw -s .settings.xml clean install -U -Pdocs,fast,integration -nsu --batch-mode -Dmaven.test.redirectTestOutputToFile=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn - run: name: "Aggregate test results" when: always 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 6e19b1482c..bafd2ad923 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 @@ -44,8 +44,15 @@ public class OptionalProperty implements Serializable, CanBeDynamic { } public String value() { - return this.value instanceof RegexProperty - ? ((RegexProperty) this.value).pattern() : this.value.toString(); + if (this.value == null) { + return ""; + } + else if (this.value instanceof RegexProperty) { + return ((RegexProperty) this.value).pattern(); + } + else { + return this.value.toString(); + } } protected Pattern optionalPatternValue() { diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java index 4a58847066..461f8a45a9 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolver.java @@ -34,12 +34,12 @@ interface QueryParamsResolver { return resolveParamValue(((OptionalProperty) value).optionalPattern()); } else if (value instanceof MatchingStrategy) { - return ((MatchingStrategy) value).getServerValue().toString(); + return resolveParamValue(((MatchingStrategy) value).getServerValue()); } else if (value instanceof DslProperty) { return resolveParamValue(((DslProperty) value).getServerValue()); } - return value.toString(); + return value == null ? "null" : value.toString(); } } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.groovy index e2841d49d6..f5590a8159 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/util/ContractVerifierDslConverter.groovy @@ -128,16 +128,19 @@ class ContractVerifierDslConverter implements ContractConverter constructor = classConstructor(dsl) Object newInstance = constructor.newInstance() if (!newInstance instanceof Supplier) { @@ -158,7 +161,7 @@ class ContractVerifierDslConverter implements ContractConverter clazz = compilationResult.compiledClasses.find { it.name == fqn } + Class clazz = compilationResult.compiledClasses.find { it.name == fqn} if (clazz == null) { throw new IllegalStateException("Class with name [" + fqn + "] not found") } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolverSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolverSpec.groovy new file mode 100644 index 0000000000..4a0fd0dba6 --- /dev/null +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/QueryParamsResolverSpec.groovy @@ -0,0 +1,84 @@ +package org.springframework.cloud.contract.verifier.builder + +import org.springframework.cloud.contract.spec.internal.DslProperty +import org.springframework.cloud.contract.spec.internal.MatchingStrategy +import org.springframework.cloud.contract.spec.internal.OptionalProperty +import org.springframework.cloud.contract.spec.internal.QueryParameter +import org.springframework.cloud.contract.spec.internal.RegexProperty +import spock.lang.Specification + +import java.util.regex.Pattern + +class QueryParamsResolverSpec extends Specification { + + def 'should return serverValue for QueryParameter'() { + given: + Object parameter = new QueryParameter("some_param", dslProperty) + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + dslProperty | expected + new DslProperty("client", "server") | "server" + new DslProperty(null, "server") | "server" + new DslProperty("client", null) | "null" + new DslProperty(null, null) | "null" + } + + def 'should return optionalPattern for OptionalProperty'() { + given: + Object parameter = new OptionalProperty(value) + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + value | expected + "server" | "(server)?" + null | "()?" + new RegexProperty(Pattern.compile(".*")) | "(.*)?" + new RegexProperty(null, Pattern.compile(".*")) | "(.*)?" + new RegexProperty(Pattern.compile(".*"), null) | "(.*)?" + new RegexProperty("", Pattern.compile(".*")) | "(.*)?" + new RegexProperty(Pattern.compile(".*"), "") | "(.*)?" + } + + def 'should return serverValue for MatchingStrategy'() { + given: + Object parameter = new MatchingStrategy(value, MatchingStrategy.Type.EQUAL_TO) + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + value | expected + "server" | "server" + null | "null" + new DslProperty("client", "server") | "server" + new DslProperty(null, "server") | "server" + new DslProperty("client", null) | "null" + new DslProperty(null, null) | "null" + } + + def 'should return serverValue for DslProperty'() { + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(parameter) + then: + resolved == expected + where: + parameter | expected + new DslProperty("client", "server") | "server" + new DslProperty(null, "server") | "server" + new DslProperty("client", null) | "null" + new DslProperty(null, null) | "null" + } + + def 'should return \"null\" for null'() { + when: + String resolved = new QueryParamsResolver() {}.resolveParamValue(null) + then: + resolved == "null" + } + +}