From 870e42f565a9721360efccaa596a09e08b5b2a2f Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Tue, 11 Oct 2016 13:57:36 +0200 Subject: [PATCH] Fix mock server when path is empty When the path is empty "/" is a better default than "null". --- .../wiremock/WireMockRestServiceServer.java | 25 +++++++++++-------- .../WiremockMockServerApplicationTests.java | 10 ++++++++ .../mappings/resource-with-empty-path.json | 14 +++++++++++ 3 files changed, 39 insertions(+), 10 deletions(-) create mode 100644 spring-cloud-contract-wiremock/src/test/resources/mappings/resource-with-empty-path.json diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java index 7df1e89aab..c513d4fa37 100644 --- a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/WireMockRestServiceServer.java @@ -16,15 +16,6 @@ package org.springframework.cloud.contract.wiremock; -import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; -import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; - -import java.io.IOException; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.http.HttpHeaders; @@ -38,6 +29,12 @@ import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; import org.springframework.web.client.RestTemplate; +import java.io.IOException; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + import com.github.tomakehurst.wiremock.common.Json; import com.github.tomakehurst.wiremock.http.HttpHeader; import com.github.tomakehurst.wiremock.http.ResponseDefinition; @@ -45,6 +42,9 @@ import com.github.tomakehurst.wiremock.matching.MultiValuePattern; import com.github.tomakehurst.wiremock.matching.RequestPattern; import com.github.tomakehurst.wiremock.stubbing.StubMapping; +import static org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo; +import static org.springframework.test.web.client.response.MockRestResponseCreators.withStatus; + /** * Convenience class for loading WireMock stubs into a {@link MockRestServiceServer}. In * this way using a {@link RestTemplate} can mock the responses from a server using @@ -150,7 +150,8 @@ public class WireMockRestServiceServer { try { for (Resource resource : this.resolver.getResources(pattern(location))) { StubMapping mapping = mapping(resource); - ResponseActions expect = server.expect(requestTo(this.baseUrl + mapping.getRequest().getUrlPath())); + ResponseActions expect = server.expect( + requestTo(request(mapping.getRequest()))); requestHeaders(expect, mapping.getRequest()); expect.andRespond(response(mapping.getResponse())); } @@ -162,6 +163,10 @@ public class WireMockRestServiceServer { return server; } + private String request(RequestPattern request) { + return this.baseUrl + (request.getUrlPath() == null ? "/" : request.getUrlPath()); + } + private String pattern(String location) { if (!StringUtils.getFilename(location).contains(".") && !location.contains("*")) { if (!location.endsWith("/")) { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockMockServerApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockMockServerApplicationTests.java index 3de1f9f8db..ed7d2a86fa 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockMockServerApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockMockServerApplicationTests.java @@ -22,6 +22,16 @@ public class WiremockMockServerApplicationTests { server.verify(); } + @Test + public void simpleGetWithEmptyPath() throws Exception { + MockRestServiceServer server = WireMockRestServiceServer.with(this.restTemplate) // + .baseUrl("http://example.org") // + .stubs("classpath:/mappings/resource-with-empty-path.json").build(); + assertThat(this.restTemplate.getForObject("http://example.org/", String.class)) + .isEqualTo("Hello World"); + server.verify(); + } + @Test public void simpleGetWithContentType() throws Exception { MockRestServiceServer server = WireMockRestServiceServer.with(this.restTemplate) // diff --git a/spring-cloud-contract-wiremock/src/test/resources/mappings/resource-with-empty-path.json b/spring-cloud-contract-wiremock/src/test/resources/mappings/resource-with-empty-path.json new file mode 100644 index 0000000000..c416067363 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/resources/mappings/resource-with-empty-path.json @@ -0,0 +1,14 @@ +{ + "request" : { + "method" : "GET" + }, + "response" : { + "status" : 200, + "body" : "Hello World", + "headers" : { + "ETag" : "\"356b53e9c9e124a7772d88f087a58838\"", + "Content-Type" : "application/json", + "Cache-Control" : "max-age=604800" + } + } +} \ No newline at end of file