From 4a9fb4805608fe13cb072af063908d43cd0d98f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 16 Oct 2017 03:02:40 -0500 Subject: [PATCH] Add support for restassured with restdocs (#431) fixes gh-334 --- spring-cloud-contract-wiremock/pom.xml | 15 ++++ .../WireMockRestAssuredConfiguration.java | 26 ++++++ .../main/resources/META-INF/spring.factories | 3 +- ...mockServerRestAssuredApplicationTests.java | 83 +++++++++++++++++++ 4 files changed, 126 insertions(+), 1 deletion(-) create mode 100644 spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockRestAssuredConfiguration.java create mode 100644 spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestAssuredApplicationTests.java diff --git a/spring-cloud-contract-wiremock/pom.xml b/spring-cloud-contract-wiremock/pom.xml index 4d563b00eb..dde0ef9318 100644 --- a/spring-cloud-contract-wiremock/pom.xml +++ b/spring-cloud-contract-wiremock/pom.xml @@ -17,6 +17,16 @@ com.github.tomakehurst wiremock-standalone + + io.rest-assured + rest-assured + true + + + javax.servlet + javax.servlet-api + true + org.apache.httpcomponents httpclient @@ -39,6 +49,11 @@ spring-restdocs-mockmvc true + + org.springframework.restdocs + spring-restdocs-restassured + true + org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockRestAssuredConfiguration.java b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockRestAssuredConfiguration.java new file mode 100644 index 0000000000..132d233c40 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/main/java/org/springframework/cloud/contract/wiremock/restdocs/WireMockRestAssuredConfiguration.java @@ -0,0 +1,26 @@ +package org.springframework.cloud.contract.wiremock.restdocs; + +import org.springframework.boot.test.autoconfigure.restdocs.RestDocsRestAssuredConfigurationCustomizer; +import org.springframework.context.annotation.Configuration; +import org.springframework.restdocs.restassured3.RestAssuredRestDocumentationConfigurer; + +/** + * Custom configuration for Spring RestDocs that adds a WireMock snippet (for generating + * JSON stubs). Applied automatically if you use + * {@link org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs @AutoConfigureRestDocs} in your test case and this class + * is available. JSON stubs are generated and added to the restdocs path under "stubs". + * + * @see WireMockRestDocs for a convenient entry point for customizing and asserting the + * stub behaviour + * + * @author EddĂș MelĂ©ndez + */ +@Configuration +public class WireMockRestAssuredConfiguration implements RestDocsRestAssuredConfigurationCustomizer { + + @Override + public void customize(RestAssuredRestDocumentationConfigurer configurer) { + configurer.snippets().withDefaults(new WireMockSnippet()); + } + +} diff --git a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories index 9ac5aa6677..c0e49b7d51 100644 --- a/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-contract-wiremock/src/main/resources/META-INF/spring.factories @@ -4,4 +4,5 @@ org.springframework.cloud.contract.wiremock.WireMockApplicationListener # RestDocs Auto Configuration org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs=\ -org.springframework.cloud.contract.wiremock.restdocs.WireMockRestDocsConfiguration +org.springframework.cloud.contract.wiremock.restdocs.WireMockRestDocsConfiguration,\ +org.springframework.cloud.contract.wiremock.restdocs.WireMockRestAssuredConfiguration diff --git a/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestAssuredApplicationTests.java b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestAssuredApplicationTests.java new file mode 100644 index 0000000000..d0830fd5d3 --- /dev/null +++ b/spring-cloud-contract-wiremock/src/test/java/org/springframework/cloud/contract/wiremock/WiremockServerRestAssuredApplicationTests.java @@ -0,0 +1,83 @@ +package org.springframework.cloud.contract.wiremock; + +import io.restassured.specification.RequestSpecification; +import org.junit.Test; +import org.junit.runner.RunWith; +import wiremock.org.eclipse.jetty.http.HttpStatus; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration; +import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration; +import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = {ServletWebServerFactoryAutoConfiguration.EmbeddedTomcat.class, DispatcherServletAutoConfiguration.class}, + webEnvironment = WebEnvironment.RANDOM_PORT) +@AutoConfigureRestDocs(outputDir = "target/snippets") +public class WiremockServerRestAssuredApplicationTests { + + @Autowired + private RequestSpecification documentationSpec; + + @LocalServerPort + private int port; + + @Test + public void contextLoads() throws Exception { + given() + .port(this.port) + .when() + .get("/resource") + .then() + .assertThat() + .statusCode(is(200)) + .content(equalTo("Hello World")); + } + + @Test + public void statusIsMaintained() throws Exception { + given(this.documentationSpec) + .filter(document("status")) + .when() + .get("/status") + .then() + .assertThat() + .statusCode(is(202)) + .content(equalTo("Hello World")); + } + + @Configuration + @EnableWebMvc + @RestController + protected static class TestConfiguration { + + @ResponseBody + @RequestMapping("/resource") + public String resource() { + return "Hello World"; + } + + @ResponseBody + @RequestMapping("/status") + public ResponseEntity status() { + return ResponseEntity.status(HttpStatus.ACCEPTED_202).body("Hello World"); + } + + } + +}