diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java index 94ef5e72d8..55043e60d6 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippet.java @@ -157,7 +157,8 @@ public class WireMockSnippet implements Snippet { } for (String queryPair : rawQuery.split("&")) { String[] splitQueryPair = queryPair.split("="); - request = request.withQueryParam(splitQueryPair[0], WireMock.equalTo(splitQueryPair[1])); + String value = splitQueryPair.length > 1 ? splitQueryPair[1] : "" ; + request = request.withQueryParam(splitQueryPair[0], WireMock.equalTo(value)); } return request; } diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java index 5be8ce7c7d..37078b92cc 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java @@ -139,6 +139,19 @@ public class WireMockSnippetTests { .isEqualTo(HttpStatus.ACCEPTED.value()); } + @Test + public void should_accept_empty_value_for_query_params() throws IOException { + this.operation = operation(requestPostWithEmptyQueryParamValue(), response(), this.context); + WireMockSnippet snippet = new WireMockSnippet(); + + snippet.document(this.operation); + + File stub = new File(this.outputFolder, "stubs/foo.json"); + assertThat(stub).exists(); + WireMockStubMapping + .buildFrom(new String(Files.readAllBytes(stub.toPath()))); + } + private Operation operation(OperationRequest request, OperationResponse response, RestDocumentationContext context) { return operation("foo", request, response, context); @@ -385,4 +398,53 @@ public class WireMockSnippetTests { } }; } + + private OperationRequest requestPostWithEmptyQueryParamValue() { + return new OperationRequest() { + @Override + public byte[] getContent() { + return new byte[0]; + } + + @Override + public String getContentAsString() { + return ""; + } + + @Override + public HttpHeaders getHeaders() { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders + .add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); + return httpHeaders; + } + + @Override + public HttpMethod getMethod() { + return HttpMethod.POST; + } + + @Override + public Parameters getParameters() { + Parameters parameters = new Parameters(); + parameters.put("myParam", Collections.singletonList("")); + return parameters; + } + + @Override + public Collection getParts() { + return null; + } + + @Override + public URI getUri() { + return URI.create("http://foo/bar?myParam="); + } + + @Override + public Collection getCookies() { + return Collections.emptySet(); + } + }; + } } \ No newline at end of file