diff --git a/accurest-core/src/main/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBodyBuilder.groovy b/accurest-core/src/main/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBodyBuilder.groovy index 91ba58e4f0..d17b8a4b84 100644 --- a/accurest-core/src/main/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBodyBuilder.groovy +++ b/accurest-core/src/main/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBodyBuilder.groovy @@ -1,10 +1,10 @@ package io.codearte.accurest.builder - import groovy.transform.PackageScope import groovy.transform.TypeChecked import io.codearte.accurest.dsl.GroovyDsl import io.codearte.accurest.dsl.internal.Header import io.codearte.accurest.dsl.internal.QueryParameter +import io.codearte.accurest.dsl.internal.QueryParameters @PackageScope @TypeChecked @@ -46,11 +46,19 @@ class JaxRsClientSpockMethodBodyBuilder extends SpockMethodBodyBuilder { protected void appendUrlPathAndQueryParameters(BlockBuilder bb) { if (request.url) { bb.addLine(".path('$request.url.serverValue')") + appendQueryParams(request.url.queryParameters, bb) } else if (request.urlPath) { bb.addLine(".path('$request.urlPath.serverValue')") - request.urlPath.queryParameters?.parameters.findAll(this.&allowedQueryParameter).each { QueryParameter param -> - bb.addLine(".queryParam('$param.name', '${resolveParamValue(param).toString()}')") - } + appendQueryParams(request.urlPath.queryParameters, bb) + } + } + + private void appendQueryParams(QueryParameters queryParameters, BlockBuilder bb) { + if (!queryParameters?.parameters) { + return + } + queryParameters.parameters.findAll(this.&allowedQueryParameter).each { QueryParameter param -> + bb.addLine(".queryParam('$param.name', '${resolveParamValue(param).toString()}')") } } diff --git a/accurest-core/src/test/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBuilderSpec.groovy b/accurest-core/src/test/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBuilderSpec.groovy index aa5a26cb5d..e93e9e5035 100644 --- a/accurest-core/src/test/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBuilderSpec.groovy +++ b/accurest-core/src/test/groovy/io/codearte/accurest/builder/JaxRsClientSpockMethodBuilderSpec.groovy @@ -364,6 +364,57 @@ class JaxRsClientSpockMethodBuilderSpec extends Specification implements WireMoc stubMappingIsValidWireMockStub(new WireMockStubStrategy(contractDsl).toWireMockClientStub()) } + @Issue('#169') + def "should generate a call with an url path and query parameters with url containing a pattern"() { + given: + GroovyDsl contractDsl = GroovyDsl.make { + request { + method 'GET' + url($(stub(regex('/foo/[0-9]+')), test('/foo/123456'))){ + queryParameters { + parameter 'limit': $(client(equalTo("20")), server(equalTo("10"))) + parameter 'offset': $(client(containing("20")), server(equalTo("20"))) + parameter 'filter': "email" + parameter 'sort': equalTo("name") + parameter 'search': $(client(notMatching(~/^\/[0-9]{2}$/)), server("55")) + parameter 'age': $(client(notMatching("^\\w*\$")), server("99")) + parameter 'name': $(client(matching("Denis.*")), server("Denis.Stepanov")) + parameter 'email': "bob@email.com" + parameter 'hello': $(client(matching("Denis.*")), server(absent())) + parameter 'hello': absent() + } + } + } + response { + status 200 + body """ + { + "property1": "a", + "property2": "b" + } + """ + } + } + JaxRsClientSpockMethodBodyBuilder builder = new JaxRsClientSpockMethodBodyBuilder(contractDsl) + BlockBuilder blockBuilder = new BlockBuilder(" ") + when: + builder.appendTo(blockBuilder) + def spockTest = blockBuilder.toString() + then: + spockTest.contains("queryParam('limit', '10'") + spockTest.contains("queryParam('offset', '20'") + spockTest.contains("queryParam('filter', 'email'") + spockTest.contains("queryParam('sort', 'name'") + spockTest.contains("queryParam('search', '55'") + spockTest.contains("queryParam('age', '99'") + spockTest.contains("queryParam('name', 'Denis.Stepanov'") + spockTest.contains("queryParam('email', 'bob@email.com'") + spockTest.contains('$[?(@.property2 == \'b\')]') + spockTest.contains('$[?(@.property1 == \'a\')]') + and: + stubMappingIsValidWireMockStub(new WireMockStubStrategy(contractDsl).toWireMockClientStub()) + } + def "should generate test for empty body"() { given: GroovyDsl contractDsl = GroovyDsl.make {