Add auto-configuration for using REST Docs with WebTestClient

See gh-10969
This commit is contained in:
Roman Zaynetdinov
2017-11-09 19:24:18 +02:00
committed by Andy Wilkinson
parent 16c52bce84
commit ab7c47d340
6 changed files with 242 additions and 1 deletions

View File

@@ -35,12 +35,15 @@ import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer;
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
import org.springframework.restdocs.restassured3.RestAssuredRestDocumentation;
import org.springframework.restdocs.restassured3.RestAssuredRestDocumentationConfigurer;
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation;
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer;
/**
* {@link EnableAutoConfiguration Auto-configuration} for Spring REST Docs.
*
* @author Andy Wilkinson
* @author Eddú Meléndez
* @author Roman Zaynetdinov
* @since 1.4.0
*/
@Configuration
@@ -108,4 +111,33 @@ public class RestDocsAutoConfiguration {
}
@Configuration
@ConditionalOnClass(WebTestClientRestDocumentation.class)
@ConditionalOnWebApplication(type = Type.REACTIVE)
static class RestDocsWebTestClientAutoConfiguration {
@Bean
@ConditionalOnMissingBean(WebTestClientRestDocumentationConfigurer.class)
public WebTestClientRestDocumentationConfigurer restDocsWebTestClientConfigurer(
ObjectProvider<RestDocsWebTestClientConfigurationCustomizer> configurationCustomizerProvider,
RestDocumentationContextProvider contextProvider) {
WebTestClientRestDocumentationConfigurer configurer = WebTestClientRestDocumentation
.documentationConfiguration(contextProvider);
RestDocsWebTestClientConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider
.getIfAvailable();
if (configurationCustomizer != null) {
configurationCustomizer.customize(configurer);
}
return configurer;
}
@Bean
@ConfigurationProperties(prefix = "spring.test.restdocs")
public RestDocsWebTestClientBuilderCustomizer restDocumentationConfigurer(
WebTestClientRestDocumentationConfigurer configurer) {
return new RestDocsWebTestClientBuilderCustomizer(configurer);
}
}
}

View File

@@ -0,0 +1,90 @@
/*
* 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.beans.factory.InitializingBean;
import org.springframework.boot.test.autoconfigure.web.reactive.WebTestClientBuilderCustomizer;
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.util.StringUtils;
/**
* A customizer that configures Spring REST Docs with WebTestClient.
*
* @author Eddú Meléndez
* @author Roman Zaynetdinov
*/
class RestDocsWebTestClientBuilderCustomizer implements InitializingBean, WebTestClientBuilderCustomizer {
private final WebTestClientRestDocumentationConfigurer delegate;
private String uriScheme;
private String uriHost;
private Integer uriPort;
RestDocsWebTestClientBuilderCustomizer(WebTestClientRestDocumentationConfigurer 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 {
}
@Override
public void customize(WebTestClient.Builder builder) {
if (StringUtils.hasText(this.uriScheme) && StringUtils.hasText(this.uriHost)) {
String baseUrl = this.uriScheme + "://" + this.uriHost;
if (this.uriPort == 80 && this.uriScheme.equals("http")) {
// Don't add default port
} else if (this.uriPort == 443 && this.uriScheme.equals("https")) {
// Don't add default port
} else if (this.uriPort != null) {
baseUrl += ":" + this.uriPort;
}
builder.baseUrl(baseUrl);
}
builder.filter(this.delegate);
}
}

View File

@@ -0,0 +1,42 @@
/*
* 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.webtestclient.WebTestClientRestDocumentationConfigurer;
/**
* A customizer for {@link WebTestClientRestDocumentationConfigurer}. If a
* {@code RestDocsWebTestClientConfigurationCustomizer} bean is found in the application context
* it will be {@link #customize called} to customize the
* {@code WebTestClientRestDocumentationConfigurer} before it is applied. Intended for use only
* when the attributes on {@link AutoConfigureRestDocs} do not provide sufficient
* customization.
*
* @author Andy Wilkinson
* @author Roman Zaynetdinov
* @since 2.0.0
*/
@FunctionalInterface
public interface RestDocsWebTestClientConfigurationCustomizer {
/**
* Customize the given {@code configurer}.
* @param configurer the configurer
*/
void customize(WebTestClientRestDocumentationConfigurer configurer);
}