Merge pull request #9643 from Eddú Meléndez
* gh-9643: Polish "Add auto-configuration for REST Docs with REST Assured" Add auto-configuration for REST Docs with REST Assured
This commit is contained in:
commit
d8cfae7300
|
@ -150,6 +150,7 @@
|
|||
<quartz.version>2.3.0</quartz.version>
|
||||
<querydsl.version>4.1.4</querydsl.version>
|
||||
<reactor-bom.version>Bismuth-RC1</reactor-bom.version>
|
||||
<rest-assured.version>3.0.2</rest-assured.version>
|
||||
<reactive-streams.version>1.0.1</reactive-streams.version>
|
||||
<rxjava.version>1.3.2</rxjava.version>
|
||||
<rxjava-adapter.version>1.2.1</rxjava-adapter.version>
|
||||
|
@ -906,6 +907,11 @@
|
|||
<artifactId>rxjava</artifactId>
|
||||
<version>${rxjava2.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>rest-assured</artifactId>
|
||||
<version>${rest-assured.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.searchbox</groupId>
|
||||
<artifactId>jest</artifactId>
|
||||
|
|
|
@ -55,6 +55,14 @@
|
|||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-test-autoconfigure</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>rest-assured</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.restdocs</groupId>
|
||||
<artifactId>spring-restdocs-restassured</artifactId>
|
||||
</dependency>
|
||||
<!-- Optional deps required when generating Javadoc with Java 8 -->
|
||||
<dependency>
|
||||
<groupId>ch.qos.logback</groupId>
|
||||
|
|
|
@ -6279,8 +6279,20 @@ A list of the auto-configuration that is enabled by `@RestClientTest` can be
|
|||
[[boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-docs]]
|
||||
==== Auto-configured Spring REST Docs tests
|
||||
The `@AutoConfigureRestDocs` annotation can be used if you want to use Spring REST Docs
|
||||
in your tests. It will automatically configure `MockMvc` to use Spring REST Docs and
|
||||
remove the need for Spring REST Docs' JUnit rule.
|
||||
in your tests with Mock MVC or REST Assured. It removes the need for Spring REST Docs'
|
||||
JUnit rule.
|
||||
|
||||
`@AutoConfigureRestDocs` can be used to override the default output directory
|
||||
(`target/generated-snippets` if you are using Maven or `build/generated-snippets` if you
|
||||
are using Gradle). It can also be used to configure the host, scheme, and port that will
|
||||
appear in any documented URIs.
|
||||
|
||||
[[boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-docs-mock-mvc]]
|
||||
===== Auto-configured Spring REST Docs tests with Mock MVC
|
||||
|
||||
`@AutoConfigureRestDocs` customizes the `MockMvc` bean to use Spring REST Docs, Inject it
|
||||
using `@Autowired` and use it in your tests as you normally would when using Mock MVC and
|
||||
Spring REST Docs:
|
||||
|
||||
[source,java,indent=0]
|
||||
----
|
||||
|
@ -6315,11 +6327,9 @@ remove the need for Spring REST Docs' JUnit rule.
|
|||
}
|
||||
----
|
||||
|
||||
`@AutoConfigureRestDocs` can be used to override the default output directory
|
||||
(`target/generated-snippets` if you are using Maven or `build/generated-snippets` if you
|
||||
are using Gradle). It can also be used to configure the host, scheme, and port that will
|
||||
appear in any documented URIs. If you require more control over Spring REST Docs'
|
||||
configuration a `RestDocsMockMvcConfigurationCustomizer` bean can be used:
|
||||
If you require more control over Spring REST Docs' configuration than offered by the
|
||||
attributes of `@AutoConfigureRestDocs`, a `RestDocsMockMvcConfigurationCustomizer` bean
|
||||
can be used:
|
||||
|
||||
[source,java,indent=0]
|
||||
----
|
||||
|
@ -6355,6 +6365,29 @@ automatically generate the default snippets:
|
|||
|
||||
|
||||
|
||||
[[boot-features-testing-spring-boot-applications-testing-autoconfigured-rest-docs-rest-assured]]
|
||||
===== Auto-configured Spring REST Docs tests with REST Assured
|
||||
|
||||
`@AutoConfigureRestDocs` makes a `RequestSpecification` bean, preconfigured to use Spring REST
|
||||
Docs, available to your tests. Inject it using `@Autowired` and use it in your tests as you
|
||||
normally would when using REST Assured and Spring REST Docs:
|
||||
|
||||
[source,java,indent=0]
|
||||
----
|
||||
include::{code-examples}/test/autoconfigure/restdocs/restassured/UserDocumentationTests.java[tag=source]
|
||||
----
|
||||
|
||||
If you require more control over Spring REST Docs' configuration than offered by the
|
||||
attributes of `@AutoConfigureRestDocs`, a `RestDocsRestAssuredConfigurationCustomizer`
|
||||
bean can be used:
|
||||
|
||||
[source,java,indent=0]
|
||||
----
|
||||
include::{code-examples}/test/autoconfigure/restdocs/restassured/AdvancedConfigurationExample.java[tag=configuration]
|
||||
----
|
||||
|
||||
|
||||
|
||||
[[boot-features-testing-spring-boot-applications-with-spock]]
|
||||
==== Using Spock to test Spring Boot applications
|
||||
If you wish to use Spock to test a Spring Boot application you should add a dependency
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs.restassured;
|
||||
|
||||
import org.springframework.boot.test.autoconfigure.restdocs.RestDocsRestAssuredConfigurationCustomizer;
|
||||
import org.springframework.boot.test.context.TestConfiguration;
|
||||
import org.springframework.restdocs.restassured3.RestAssuredRestDocumentationConfigurer;
|
||||
import org.springframework.restdocs.templates.TemplateFormats;
|
||||
|
||||
public class AdvancedConfigurationExample {
|
||||
|
||||
// tag::configuration[]
|
||||
@TestConfiguration
|
||||
public static class CustomizationConfiguration
|
||||
implements RestDocsRestAssuredConfigurationCustomizer {
|
||||
|
||||
@Override
|
||||
public void customize(RestAssuredRestDocumentationConfigurer configurer) {
|
||||
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
|
||||
}
|
||||
|
||||
}
|
||||
// end::configuration[]
|
||||
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs.restassured;
|
||||
|
||||
// tag::source[]
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
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.test.context.junit4.SpringRunner;
|
||||
|
||||
import static io.restassured.RestAssured.given;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
|
||||
@AutoConfigureRestDocs
|
||||
public class UserDocumentationTests {
|
||||
|
||||
@LocalServerPort
|
||||
private int port;
|
||||
|
||||
@Autowired
|
||||
private RequestSpecification documentationSpec;
|
||||
|
||||
@Test
|
||||
public void listUsers() throws Exception {
|
||||
given(this.documentationSpec).filter(document("list-users")).when()
|
||||
.port(this.port).get("/").then().assertThat().statusCode(is(200));
|
||||
}
|
||||
|
||||
}
|
||||
// end::source[]
|
|
@ -70,7 +70,7 @@
|
|||
<module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStarImportCheck" />
|
||||
<module name="com.puppycrawl.tools.checkstyle.checks.imports.AvoidStaticImportCheck">
|
||||
<property name="excludes"
|
||||
value="org.assertj.core.api.Assertions.*, org.junit.Assert.*, org.junit.Assume.*, org.junit.internal.matchers.ThrowableMessageMatcher.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.springframework.boot.configurationprocessor.ConfigurationMetadataMatchers.*, org.springframework.boot.configurationprocessor.TestCompiler.*, org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.ArgumentMatchers.*, org.mockito.Matchers.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*, org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*, org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo, org.springframework.test.web.client.ExpectedCount.*, org.springframework.test.web.client.match.MockRestRequestMatchers.*, org.springframework.test.web.client.response.MockRestResponseCreators.*" />
|
||||
value="io.restassured.RestAssured.*, org.assertj.core.api.Assertions.*, org.junit.Assert.*, org.junit.Assume.*, org.junit.internal.matchers.ThrowableMessageMatcher.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.springframework.boot.configurationprocessor.ConfigurationMetadataMatchers.*, org.springframework.boot.configurationprocessor.TestCompiler.*, org.springframework.boot.test.autoconfigure.AutoConfigurationImportedCondition.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.ArgumentMatchers.*, org.mockito.Matchers.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.operation.preprocess.Preprocessors.*, org.springframework.restdocs.restassured3.operation.preprocess.RestAssuredPreprocessors.*, org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*, org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*, org.springframework.hateoas.mvc.ControllerLinkBuilder.linkTo, org.springframework.test.web.client.ExpectedCount.*, org.springframework.test.web.client.match.MockRestRequestMatchers.*, org.springframework.test.web.client.response.MockRestResponseCreators.*" />
|
||||
</module>
|
||||
<module name="com.puppycrawl.tools.checkstyle.checks.imports.IllegalImportCheck" >
|
||||
<property name="illegalPkgs" value="com.google.common"/>
|
||||
|
|
|
@ -59,6 +59,11 @@
|
|||
<artifactId>json-path</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.rest-assured</groupId>
|
||||
<artifactId>rest-assured</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>net.sourceforge.htmlunit</groupId>
|
||||
<artifactId>htmlunit</artifactId>
|
||||
|
@ -146,6 +151,11 @@
|
|||
<artifactId>spring-restdocs-mockmvc</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.restdocs</groupId>
|
||||
<artifactId>spring-restdocs-restassured</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.security</groupId>
|
||||
<artifactId>spring-security-config</artifactId>
|
||||
|
@ -198,6 +208,11 @@
|
|||
<artifactId>commons-pool2</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.tomcat.embed</groupId>
|
||||
<artifactId>tomcat-embed-core</artifactId>
|
||||
<optional>true</optional>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.aspectj</groupId>
|
||||
<artifactId>aspectjrt</artifactId>
|
||||
|
|
|
@ -16,8 +16,12 @@
|
|||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs;
|
||||
|
||||
import io.restassured.builder.RequestSpecBuilder;
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
|
||||
import org.springframework.beans.factory.ObjectProvider;
|
||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
|
||||
|
@ -29,40 +33,79 @@ import org.springframework.restdocs.RestDocumentationContextProvider;
|
|||
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
|
||||
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer;
|
||||
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
|
||||
import org.springframework.restdocs.restassured3.RestAssuredRestDocumentation;
|
||||
import org.springframework.restdocs.restassured3.RestAssuredRestDocumentationConfigurer;
|
||||
|
||||
/**
|
||||
* {@link EnableAutoConfiguration Auto-configuration} for Spring REST Docs.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Eddú Meléndez
|
||||
* @since 1.4.0
|
||||
*/
|
||||
@Configuration
|
||||
@ConditionalOnWebApplication(type = Type.SERVLET)
|
||||
@EnableConfigurationProperties
|
||||
@ConditionalOnWebApplication
|
||||
public class RestDocsAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(MockMvcRestDocumentationConfigurer.class)
|
||||
public MockMvcRestDocumentationConfigurer restDocsMockMvcConfigurer(
|
||||
ObjectProvider<RestDocsMockMvcConfigurationCustomizer> configurationCustomizerProvider,
|
||||
RestDocumentationContextProvider contextProvider) {
|
||||
MockMvcRestDocumentationConfigurer configurer = MockMvcRestDocumentation
|
||||
.documentationConfiguration(contextProvider);
|
||||
RestDocsMockMvcConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider
|
||||
.getIfAvailable();
|
||||
if (configurationCustomizer != null) {
|
||||
configurationCustomizer.customize(configurer);
|
||||
@Configuration
|
||||
@ConditionalOnClass(MockMvcRestDocumentation.class)
|
||||
@ConditionalOnWebApplication(type = Type.SERVLET)
|
||||
static class RestDocsMockMvcAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(MockMvcRestDocumentationConfigurer.class)
|
||||
public MockMvcRestDocumentationConfigurer restDocsMockMvcConfigurer(
|
||||
ObjectProvider<RestDocsMockMvcConfigurationCustomizer> configurationCustomizerProvider,
|
||||
RestDocumentationContextProvider contextProvider) {
|
||||
MockMvcRestDocumentationConfigurer configurer = MockMvcRestDocumentation
|
||||
.documentationConfiguration(contextProvider);
|
||||
RestDocsMockMvcConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider
|
||||
.getIfAvailable();
|
||||
if (configurationCustomizer != null) {
|
||||
configurationCustomizer.customize(configurer);
|
||||
}
|
||||
return configurer;
|
||||
}
|
||||
return configurer;
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties(prefix = "spring.test.restdocs")
|
||||
public RestDocsMockMvcBuilderCustomizer restDocumentationConfigurer(
|
||||
MockMvcRestDocumentationConfigurer configurer,
|
||||
ObjectProvider<RestDocumentationResultHandler> resultHandler) {
|
||||
return new RestDocsMockMvcBuilderCustomizer(configurer,
|
||||
resultHandler.getIfAvailable());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties(prefix = "spring.test.restdocs")
|
||||
public RestDocsMockMvcBuilderCustomizer restDocumentationConfigurer(
|
||||
MockMvcRestDocumentationConfigurer configurer,
|
||||
ObjectProvider<RestDocumentationResultHandler> resultHandler) {
|
||||
return new RestDocsMockMvcBuilderCustomizer(configurer,
|
||||
resultHandler.getIfAvailable());
|
||||
@Configuration
|
||||
@ConditionalOnClass({ RequestSpecification.class,
|
||||
RestAssuredRestDocumentation.class })
|
||||
static class RestDocsRestAssuredAutoConfiguration {
|
||||
|
||||
@Bean
|
||||
@ConditionalOnMissingBean(RequestSpecification.class)
|
||||
public RequestSpecification restDocsRestAssuredConfigurer(
|
||||
ObjectProvider<RestDocsRestAssuredConfigurationCustomizer> configurationCustomizerProvider,
|
||||
RestDocumentationContextProvider contextProvider) {
|
||||
RestAssuredRestDocumentationConfigurer configurer = RestAssuredRestDocumentation
|
||||
.documentationConfiguration(contextProvider);
|
||||
RestDocsRestAssuredConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider
|
||||
.getIfAvailable();
|
||||
if (configurationCustomizer != null) {
|
||||
configurationCustomizer.customize(configurer);
|
||||
}
|
||||
return new RequestSpecBuilder().addFilter(configurer).build();
|
||||
}
|
||||
|
||||
@Bean
|
||||
@ConfigurationProperties(prefix = "spring.test.restdocs")
|
||||
public RestDocsRestAssuredBuilderCustomizer restAssuredBuilderCustomizer(
|
||||
RequestSpecification configurer) {
|
||||
return new RestDocsRestAssuredBuilderCustomizer(configurer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs;
|
||||
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
|
||||
import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
/**
|
||||
* A customizer that configures Spring REST Docs with REST Assured.
|
||||
*
|
||||
* @author Eddú Meléndez
|
||||
*/
|
||||
class RestDocsRestAssuredBuilderCustomizer implements InitializingBean {
|
||||
|
||||
private final RequestSpecification delegate;
|
||||
|
||||
private String uriScheme;
|
||||
|
||||
private String uriHost;
|
||||
|
||||
private Integer uriPort;
|
||||
|
||||
RestDocsRestAssuredBuilderCustomizer(RequestSpecification delegate) {
|
||||
this.delegate = delegate;
|
||||
}
|
||||
|
||||
public String getUriScheme() {
|
||||
return this.uriScheme;
|
||||
}
|
||||
|
||||
public void setUriScheme(String uriScheme) {
|
||||
this.uriScheme = uriScheme;
|
||||
}
|
||||
|
||||
public String getUriHost() {
|
||||
return this.uriHost;
|
||||
}
|
||||
|
||||
public void setUriHost(String uriHost) {
|
||||
this.uriHost = uriHost;
|
||||
}
|
||||
|
||||
public Integer getUriPort() {
|
||||
return this.uriPort;
|
||||
}
|
||||
|
||||
public void setUriPort(Integer uriPort) {
|
||||
this.uriPort = uriPort;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
if (StringUtils.hasText(this.uriScheme) && StringUtils.hasText(this.uriHost)) {
|
||||
this.delegate.baseUri(this.uriScheme + "://" + this.uriHost);
|
||||
}
|
||||
if (this.uriPort != null) {
|
||||
this.delegate.port(this.uriPort);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs;
|
||||
|
||||
import org.springframework.restdocs.restassured3.RestAssuredRestDocumentationConfigurer;
|
||||
|
||||
/**
|
||||
* A customizer for {@link RestAssuredRestDocumentationConfigurer}. If a
|
||||
* {@code RestDocsRestAssuredConfigurationCustomizer} bean is found in the application
|
||||
* context it will be {@link #customize called} to customize the
|
||||
* {@code RestAssuredRestDocumentationConfigurer} before it is applied. Intended for use
|
||||
* only when the attributes on {@link AutoConfigureRestDocs} do not provide sufficient
|
||||
* customization.
|
||||
*
|
||||
* @author Eddú Meléndez
|
||||
* @since 2.0.0
|
||||
*/
|
||||
@FunctionalInterface
|
||||
public interface RestDocsRestAssuredConfigurationCustomizer {
|
||||
|
||||
/**
|
||||
* Customize the given {@code configurer}.
|
||||
* @param configurer the configurer
|
||||
*/
|
||||
void customize(RestAssuredRestDocumentationConfigurer configurer);
|
||||
|
||||
}
|
|
@ -41,14 +41,15 @@ import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.li
|
|||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
|
||||
/**
|
||||
* Tests for {@link AutoConfigureRestDocs}.
|
||||
* Integration tests for advanced configuration of {@link AutoConfigureRestDocs} with Mock
|
||||
* MVC.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@WebMvcTest(controllers = RestDocsTestController.class, secure = false)
|
||||
@AutoConfigureRestDocs
|
||||
public class RestDocsAutoConfigurationAdvancedConfigurationIntegrationTests {
|
||||
public class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests {
|
||||
|
||||
@Before
|
||||
public void deleteSnippets() {
|
|
@ -34,14 +34,14 @@ import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.docu
|
|||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
|
||||
/**
|
||||
* Tests for {@link RestDocsAutoConfiguration}.
|
||||
* Integration tests for {@link RestDocsAutoConfiguration} with Mock MVC.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@WebMvcTest
|
||||
@AutoConfigureRestDocs(uriScheme = "https", uriHost = "api.example.com", uriPort = 443)
|
||||
public class RestDocsAutoConfigurationIntegrationTests {
|
||||
public class MockMvcRestDocsAutoConfigurationIntegrationTests {
|
||||
|
||||
@Before
|
||||
public void deleteSnippets() {
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
import org.assertj.core.api.Condition;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
|
||||
import org.springframework.boot.test.context.TestConfiguration;
|
||||
import org.springframework.boot.web.server.LocalServerPort;
|
||||
import org.springframework.restdocs.restassured3.RestAssuredRestDocumentationConfigurer;
|
||||
import org.springframework.restdocs.templates.TemplateFormats;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
import org.springframework.util.FileSystemUtils;
|
||||
|
||||
import static io.restassured.RestAssured.given;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
|
||||
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
|
||||
import static org.springframework.restdocs.restassured3.operation.preprocess.RestAssuredPreprocessors.modifyUris;
|
||||
|
||||
/**
|
||||
* Integration tests for advanced configuration of {@link AutoConfigureRestDocs} with REST
|
||||
* Assured.
|
||||
*
|
||||
* @author Eddú Meléndez
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
|
||||
@AutoConfigureRestDocs
|
||||
public class RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests {
|
||||
|
||||
@LocalServerPort
|
||||
private int port;
|
||||
|
||||
@Before
|
||||
public void deleteSnippets() {
|
||||
FileSystemUtils.deleteRecursively(new File("target/generated-snippets"));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private RequestSpecification documentationSpec;
|
||||
|
||||
@Test
|
||||
public void snippetGeneration() throws Exception {
|
||||
given(this.documentationSpec)
|
||||
.filter(document("default-snippets",
|
||||
preprocessRequest(modifyUris().scheme("https")
|
||||
.host("api.example.com").removePort())))
|
||||
.when().port(this.port).get("/").then().assertThat().statusCode(is(200));
|
||||
File defaultSnippetsDir = new File("target/generated-snippets/default-snippets");
|
||||
assertThat(defaultSnippetsDir).exists();
|
||||
assertThat(new File(defaultSnippetsDir, "curl-request.md"))
|
||||
.has(contentContaining("'https://api.example.com/'"));
|
||||
assertThat(new File(defaultSnippetsDir, "http-request.md"))
|
||||
.has(contentContaining("api.example.com"));
|
||||
assertThat(new File(defaultSnippetsDir, "http-response.md")).isFile();
|
||||
}
|
||||
|
||||
private Condition<File> contentContaining(String toContain) {
|
||||
return new ContentContainingCondition(toContain);
|
||||
}
|
||||
|
||||
@TestConfiguration
|
||||
public static class CustomizationConfiguration
|
||||
implements RestDocsRestAssuredConfigurationCustomizer {
|
||||
|
||||
@Override
|
||||
public void customize(RestAssuredRestDocumentationConfigurer configurer) {
|
||||
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,82 @@
|
|||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
import org.assertj.core.api.Condition;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
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.test.context.junit4.SpringRunner;
|
||||
import org.springframework.util.FileSystemUtils;
|
||||
|
||||
import static io.restassured.RestAssured.given;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
|
||||
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
|
||||
import static org.springframework.restdocs.restassured3.operation.preprocess.RestAssuredPreprocessors.modifyUris;
|
||||
|
||||
/**
|
||||
* Integration tests for {@link RestDocsAutoConfiguration} with REST Assured.
|
||||
*
|
||||
* @author Eddú Meléndez
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
|
||||
@AutoConfigureRestDocs
|
||||
public class RestAssuredRestDocsAutoConfigurationIntegrationTests {
|
||||
|
||||
@LocalServerPort
|
||||
private int port;
|
||||
|
||||
@Before
|
||||
public void deleteSnippets() {
|
||||
FileSystemUtils.deleteRecursively(new File("target/generated-snippets"));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private RequestSpecification documentationSpec;
|
||||
|
||||
@Test
|
||||
public void defaultSnippetsAreWritten() throws Exception {
|
||||
given(this.documentationSpec)
|
||||
.filter(document("default-snippets",
|
||||
preprocessRequest(modifyUris().scheme("https")
|
||||
.host("api.example.com").removePort())))
|
||||
.when().port(this.port).get("/").then().assertThat().statusCode(is(200));
|
||||
File defaultSnippetsDir = new File("target/generated-snippets/default-snippets");
|
||||
assertThat(defaultSnippetsDir).exists();
|
||||
assertThat(new File(defaultSnippetsDir, "curl-request.adoc"))
|
||||
.has(contentContaining("'https://api.example.com/'"));
|
||||
assertThat(new File(defaultSnippetsDir, "http-request.adoc"))
|
||||
.has(contentContaining("api.example.com"));
|
||||
assertThat(new File(defaultSnippetsDir, "http-response.adoc")).isFile();
|
||||
}
|
||||
|
||||
private Condition<File> contentContaining(String toContain) {
|
||||
return new ContentContainingCondition(toContain);
|
||||
}
|
||||
|
||||
}
|
|
@ -17,13 +17,14 @@
|
|||
package org.springframework.boot.test.autoconfigure.restdocs;
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration;
|
||||
|
||||
/**
|
||||
* Test application used with {@link AutoConfigureRestDocs} tests.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
*/
|
||||
@SpringBootApplication
|
||||
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
|
||||
public class RestDocsTestApplication {
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue