diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy index f9f10d07d5..ff627007d9 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/ExecutionProperty.groovy @@ -45,6 +45,6 @@ class ExecutionProperty { @Override public String toString() { - return executionCommand; + return executionCommand } } diff --git a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/OptionalProperty.groovy b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/OptionalProperty.groovy index 6ac232f29c..decfeebd2f 100644 --- a/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/OptionalProperty.groovy +++ b/spring-cloud-contract-spec/src/main/groovy/org/springframework/cloud/contract/spec/internal/OptionalProperty.groovy @@ -38,4 +38,10 @@ class OptionalProperty { String optionalPattern() { return "($value)?" } + + + @Override + public String toString() { + return optionalPattern() + } } diff --git a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy index bd37884257..53d2e2e55b 100644 --- a/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy +++ b/spring-cloud-contract-verifier/src/main/groovy/org/springframework/cloud/contract/verifier/builder/MethodBodyBuilder.groovy @@ -365,6 +365,13 @@ abstract class MethodBodyBuilder { return value.toString() } + /** + * Converts the query parameter DSL Property until a concrete value is reached + */ + protected String resolveParamValue(OptionalProperty value) { + return resolveParamValue(value.optionalPattern()) + } + /** * Converts the query parameter value into String */ diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy index ed65535af0..d1964a11bc 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/JaxRsClientMethodBuilderSpec.groovy @@ -24,6 +24,7 @@ import org.springframework.cloud.contract.verifier.file.ContractMetadata import spock.lang.Issue import spock.lang.Shared import spock.lang.Specification +import spock.lang.Unroll import spock.util.environment.RestoreSystemProperties class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStubVerifier { @@ -870,7 +871,8 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub } @Issue('#149') - def "should allow easier way of providing dynamic values"() { + @Unroll + def "should allow easier way of providing dynamic values for [#methodBuilderName]"() { given: Contract contractDsl = Contract.make { request { @@ -931,4 +933,40 @@ class JaxRsClientMethodBuilderSpec extends Specification implements WireMockStub private String stripped(String string) { return string.stripMargin().stripIndent().replace('\t', '').replace('\n', '').replace(' ','') } + + @Issue('#173') + @Unroll + def "should resolve Optional object when used in query parameters for [#methodBuilderName]"() { + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + urlPath('/blacklist') { + queryParameters { + parameter 'isActive': value(consumer(optional(regex('(true|false)')))) + parameter 'limit': value(consumer(optional(regex('([0-9]{1,10})')))) + parameter 'offset': value(consumer(optional(regex('([0-9]{1,10})')))) + } + } + headers { + header 'Content-Type': 'application/json' + } + } + response { + status(200) + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + def test = blockBuilder.toString() + then: + !test.contains('org.springframework.cloud.contract.spec.internal.OptionalProperty') + test.contains('(([0-9]{1,10}))?') + where: + methodBuilderName | methodBuilder + "JaxRsClientSpockMethodRequestProcessingBodyBuilder" | { org.springframework.cloud.contract.spec.Contract dsl -> new JaxRsClientSpockMethodRequestProcessingBodyBuilder(dsl, properties) } + "JaxRsClientJUnitMethodBodyBuilder" | { org.springframework.cloud.contract.spec.Contract dsl -> new JaxRsClientJUnitMethodBodyBuilder(dsl, properties) } + } } diff --git a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy index 9da432ef8f..96547413e3 100644 --- a/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy +++ b/spring-cloud-contract-verifier/src/test/groovy/org/springframework/cloud/contract/verifier/builder/MockMvcMethodBodyBuilderSpec.groovy @@ -31,7 +31,10 @@ import java.util.regex.Pattern */ class MockMvcMethodBodyBuilderSpec extends Specification implements WireMockStubVerifier { - @Shared ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties(assertJsonSize: true) + @Shared ContractVerifierConfigProperties properties = new ContractVerifierConfigProperties( + assertJsonSize: true + ) + @Shared // tag::contract_with_regex[] @@ -1803,4 +1806,39 @@ World.'''""" methodBuilder << [{ Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties)}, { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties)}] } + + @Issue('#173') + @Unroll + def "should resolve Optional object when used in query parameters"() { + given: + Contract contractDsl = Contract.make { + request { + method 'GET' + urlPath('/blacklist') { + queryParameters { + parameter 'isActive': value(consumer(optional(regex('(true|false)')))) + parameter 'limit': value(consumer(optional(regex('([0-9]{1,10})')))) + parameter 'offset': value(consumer(optional(regex('([0-9]{1,10})')))) + } + } + headers { + header 'Content-Type': 'application/json' + } + } + response { + status(200) + } + } + MethodBodyBuilder builder = methodBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + def test = blockBuilder.toString() + then: + !test.contains('org.springframework.cloud.contract.spec.internal.OptionalProperty') + test.contains('(([0-9]{1,10}))?') + where: + methodBuilder << [{ Contract dsl -> new MockMvcSpockMethodRequestProcessingBodyBuilder(dsl, properties)}, + { Contract dsl -> new MockMvcJUnitMethodBodyBuilder(dsl, properties)}] + } }