From ed30fc6aa52692e20f682125bb565f6a4bd1da3f Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Thu, 26 Jan 2017 13:11:37 +0100 Subject: [PATCH] Fixed the not setting of response status for rest docs without this change the status recorded in the test was not properly placed in the stub with this change it gets fixed fixes #199 --- .../wiremock/restdocs/WireMockSnippet.java | 3 +- ...iremockServerRestDocsApplicationTests.java | 19 ++- .../restdocs/WireMockSnippetTests.java | 121 ++++++++++++++++++ 3 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java 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 f657ff4ff9..a8b405e90f 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 @@ -94,7 +94,8 @@ public class WireMockSnippet implements Snippet { private ResponseDefinitionBuilder response(Operation operation) { return aResponse().withHeaders(responseHeaders(operation)) - .withBody(operation.getResponse().getContentAsString()); + .withBody(operation.getResponse().getContentAsString()) + .withStatus(operation.getResponse().getStatus().value()); } private RemoteMappingBuilder request(Operation operation) { diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java index bbebe103c0..5aa69bbd22 100644 --- a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestDocsApplicationTests.java @@ -1,5 +1,6 @@ package org.springframework.cloud.contract.wiremock; +import org.eclipse.jetty.http.HttpStatus; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -8,6 +9,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMock import org.springframework.boot.test.context.SpringBootTest; import org.springframework.cloud.contract.wiremock.WiremockServerRestDocsApplicationTests.TestConfiguration; import org.springframework.context.annotation.Configuration; +import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; @@ -26,8 +28,7 @@ import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.docu @DirtiesContext public class WiremockServerRestDocsApplicationTests { - @Autowired - private MockMvc mockMvc; + @Autowired private MockMvc mockMvc; @Test public void contextLoads() throws Exception { @@ -36,6 +37,14 @@ public class WiremockServerRestDocsApplicationTests { .andDo(document("resource")); } + @Test + public void statusIsMaintained() throws Exception { + this.mockMvc.perform(MockMvcRequestBuilders.get("/status")) + .andExpect(MockMvcResultMatchers.content().string("Hello World")) + .andExpect(MockMvcResultMatchers.status().is(HttpStatus.ACCEPTED_202)) + .andDo(document("status")); + } + @Configuration @RestController protected static class TestConfiguration { @@ -46,6 +55,12 @@ public class WiremockServerRestDocsApplicationTests { return "Hello World"; } + @ResponseBody + @RequestMapping("/status") + public ResponseEntity status() { + return ResponseEntity.status(HttpStatus.ACCEPTED_202).body("Hello World"); + } + } } 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 new file mode 100644 index 0000000000..fe9d28c7e6 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockSnippetTests.java @@ -0,0 +1,121 @@ +package org.springframework.cloud.contract.wiremock.restdocs; + +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Files; +import java.util.Collection; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.Answers; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.restdocs.RestDocumentationContext; +import org.springframework.restdocs.operation.Operation; +import org.springframework.restdocs.operation.OperationRequest; +import org.springframework.restdocs.operation.OperationRequestPart; +import org.springframework.restdocs.operation.OperationResponse; +import org.springframework.restdocs.operation.Parameters; + +import com.github.tomakehurst.wiremock.stubbing.StubMapping; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.mockito.Matchers.anyString; + +/** + * @author Marcin Grzejszczak + */ +@RunWith(MockitoJUnitRunner.class) +public class WireMockSnippetTests { + + @Mock(answer = Answers.RETURNS_DEEP_STUBS) Operation operation; + @Rule public TemporaryFolder tmp = new TemporaryFolder(); + File outputFolder; + + @Before + public void setup() throws IOException { + this.outputFolder = this.tmp.newFolder(); + } + + @Test + public void should_maintain_the_response_status_when_generating_stub() throws Exception { + WireMockSnippet snippet = new WireMockSnippet(); + RestDocumentationContext context = new RestDocumentationContext(this.getClass(), + "method", this.outputFolder); + given(this.operation.getName()).willReturn("foo"); + given(this.operation.getAttributes().get(anyString())).willReturn(null); + given(this.operation.getAttributes().get(RestDocumentationContext.class.getName())).willReturn(context); + given(this.operation.getRequest()).willReturn(request()); + given(this.operation.getResponse()).willReturn(response()); + + snippet.document(this.operation); + + File stub = new File(this.outputFolder, "stubs/foo.json"); + assertThat(stub).exists(); + StubMapping stubMapping = StubMapping.buildFrom(new String(Files.readAllBytes(stub.toPath()))); + assertThat(stubMapping.getResponse().getStatus()).isEqualTo(HttpStatus.ACCEPTED.value()); + } + + private OperationResponse response() { + return new OperationResponse() { + + @Override public HttpStatus getStatus() { + return HttpStatus.ACCEPTED; + } + + @Override public HttpHeaders getHeaders() { + return new HttpHeaders(); + } + + @Override public byte[] getContent() { + return new byte[0]; + } + + @Override public String getContentAsString() { + return null; + } + }; + } + + private OperationRequest request() { + return new OperationRequest() { + + @Override public byte[] getContent() { + return new byte[0]; + } + + @Override public String getContentAsString() { + return null; + } + + @Override public HttpHeaders getHeaders() { + return new HttpHeaders(); + } + + @Override public HttpMethod getMethod() { + return HttpMethod.GET; + } + + @Override public Parameters getParameters() { + return null; + } + + @Override public Collection getParts() { + return null; + } + + @Override public URI getUri() { + return URI.create("http://foo/bar"); + } + }; + } + +} \ No newline at end of file