Extract RestDocsProperties

Extract properties used by RestDocs to their own class.
This commit is contained in:
Phillip Webb 2018-01-09 12:11:23 -08:00
parent d439b73758
commit b9bb31cfd4
5 changed files with 121 additions and 127 deletions

View File

@ -25,7 +25,6 @@ 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;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -47,13 +46,13 @@ import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation
* @since 1.4.0
*/
@Configuration
@EnableConfigurationProperties
@ConditionalOnWebApplication
public class RestDocsAutoConfiguration {
@Configuration
@ConditionalOnClass(MockMvcRestDocumentation.class)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(RestDocsProperties.class)
static class RestDocsMockMvcAutoConfiguration {
@Bean
@ -72,11 +71,11 @@ public class RestDocsAutoConfiguration {
}
@Bean
@ConfigurationProperties(prefix = "spring.test.restdocs")
public RestDocsMockMvcBuilderCustomizer restDocumentationConfigurer(
RestDocsProperties properties,
MockMvcRestDocumentationConfigurer configurer,
ObjectProvider<RestDocumentationResultHandler> resultHandler) {
return new RestDocsMockMvcBuilderCustomizer(configurer,
return new RestDocsMockMvcBuilderCustomizer(properties, configurer,
resultHandler.getIfAvailable());
}
@ -85,6 +84,7 @@ public class RestDocsAutoConfiguration {
@Configuration
@ConditionalOnClass({ RequestSpecification.class,
RestAssuredRestDocumentation.class })
@EnableConfigurationProperties(RestDocsProperties.class)
static class RestDocsRestAssuredAutoConfiguration {
@Bean
@ -103,10 +103,9 @@ public class RestDocsAutoConfiguration {
}
@Bean
@ConfigurationProperties(prefix = "spring.test.restdocs")
public RestDocsRestAssuredBuilderCustomizer restAssuredBuilderCustomizer(
RequestSpecification configurer) {
return new RestDocsRestAssuredBuilderCustomizer(configurer);
RestDocsProperties properties, RequestSpecification configurer) {
return new RestDocsRestAssuredBuilderCustomizer(properties, configurer);
}
}
@ -114,6 +113,7 @@ public class RestDocsAutoConfiguration {
@Configuration
@ConditionalOnClass(WebTestClientRestDocumentation.class)
@ConditionalOnWebApplication(type = Type.REACTIVE)
@EnableConfigurationProperties(RestDocsProperties.class)
static class RestDocsWebTestClientAutoConfiguration {
@Bean
@ -132,10 +132,10 @@ public class RestDocsAutoConfiguration {
}
@Bean
@ConfigurationProperties(prefix = "spring.test.restdocs")
public RestDocsWebTestClientBuilderCustomizer restDocumentationConfigurer(
RestDocsProperties properties,
WebTestClientRestDocumentationConfigurer configurer) {
return new RestDocsWebTestClientBuilderCustomizer(configurer);
return new RestDocsWebTestClientBuilderCustomizer(properties, configurer);
}
}

View File

@ -17,11 +17,12 @@
package org.springframework.boot.test.autoconfigure.restdocs;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.boot.test.autoconfigure.web.servlet.MockMvcBuilderCustomizer;
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer;
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
import org.springframework.restdocs.mockmvc.UriConfigurer;
import org.springframework.test.web.servlet.setup.ConfigurableMockMvcBuilder;
import org.springframework.util.StringUtils;
/**
* A {@link MockMvcBuilderCustomizer} that configures Spring REST Docs.
@ -31,57 +32,28 @@ import org.springframework.util.StringUtils;
class RestDocsMockMvcBuilderCustomizer
implements InitializingBean, MockMvcBuilderCustomizer {
private final RestDocsProperties properties;
private final MockMvcRestDocumentationConfigurer delegate;
private final RestDocumentationResultHandler resultHandler;
private String uriScheme;
private String uriHost;
private Integer uriPort;
RestDocsMockMvcBuilderCustomizer(MockMvcRestDocumentationConfigurer delegate,
RestDocsMockMvcBuilderCustomizer(RestDocsProperties properties,
MockMvcRestDocumentationConfigurer delegate,
RestDocumentationResultHandler resultHandler) {
this.properties = properties;
this.delegate = delegate;
this.resultHandler = resultHandler;
}
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)) {
this.delegate.uris().withScheme(this.uriScheme);
}
if (StringUtils.hasText(this.uriHost)) {
this.delegate.uris().withHost(this.uriHost);
}
if (this.uriPort != null) {
this.delegate.uris().withPort(this.uriPort);
}
PropertyMapper map = PropertyMapper.get();
RestDocsProperties properties = this.properties;
UriConfigurer uri = this.delegate.uris();
map.from(properties::getUriScheme).whenHasText().to(uri::withScheme);
map.from(properties::getUriHost).whenHasText().to(uri::withHost);
map.from(properties::getUriPort).whenNonNull().to(uri::withPort);
}
@Override

View File

@ -0,0 +1,71 @@
/*
* Copyright 2012-2018 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.boot.context.properties.ConfigurationProperties;
/**
* Configuration properties for Spring REST Docs.
*
* @author Andy Wilkinson
* @author Eddú Meléndez
* @author Phillip Webb
* @since 2.0.0
*/
@ConfigurationProperties("spring.test.restdocs")
public class RestDocsProperties {
/**
* The URI scheme for to use (for example http).
*/
private String uriScheme;
/**
* The URI host to use.
*/
private String uriHost;
/**
* The URI port to use.
*/
private Integer uriPort;
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;
}
}

View File

@ -19,6 +19,7 @@ package org.springframework.boot.test.autoconfigure.restdocs;
import io.restassured.specification.RequestSpecification;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.util.StringUtils;
/**
@ -28,50 +29,25 @@ import org.springframework.util.StringUtils;
*/
class RestDocsRestAssuredBuilderCustomizer implements InitializingBean {
private final RestDocsProperties properties;
private final RequestSpecification delegate;
private String uriScheme;
private String uriHost;
private Integer uriPort;
RestDocsRestAssuredBuilderCustomizer(RequestSpecification delegate) {
RestDocsRestAssuredBuilderCustomizer(RestDocsProperties properties,
RequestSpecification delegate) {
this.properties = properties;
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);
}
PropertyMapper map = PropertyMapper.get();
String host = this.properties.getUriHost();
map.from(this.properties::getUriScheme)
.when((scheme) -> StringUtils.hasText(scheme)
&& StringUtils.hasText(host))
.to((scheme) -> this.delegate.baseUri(scheme + "://" + host));
map.from(this.properties::getUriPort).whenNonNull().to(this.delegate::port);
}
}

View File

@ -29,43 +29,16 @@ import org.springframework.util.StringUtils;
*/
class RestDocsWebTestClientBuilderCustomizer implements WebTestClientBuilderCustomizer {
private final RestDocsProperties properties;
private final WebTestClientRestDocumentationConfigurer delegate;
private String uriScheme;
private String uriHost;
private Integer uriPort;
RestDocsWebTestClientBuilderCustomizer(
RestDocsWebTestClientBuilderCustomizer(RestDocsProperties properties,
WebTestClientRestDocumentationConfigurer delegate) {
this.properties = properties;
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 customize(WebTestClient.Builder builder) {
customizeBaseUrl(builder);
@ -73,21 +46,23 @@ class RestDocsWebTestClientBuilderCustomizer implements WebTestClientBuilderCust
}
private void customizeBaseUrl(WebTestClient.Builder builder) {
String scheme = StringUtils.hasText(this.uriScheme) ? this.uriScheme : "http";
String host = StringUtils.hasText(this.uriHost) ? this.uriHost : "localhost";
String baseUrl = scheme + "://" + host;
if (!isStandardPort()) {
baseUrl += ":" + this.uriPort;
String scheme = this.properties.getUriScheme();
String host = this.properties.getUriHost();
String baseUrl = (StringUtils.hasText(scheme) ? scheme : "http") + "://"
+ (StringUtils.hasText(host) ? host : "localhost");
Integer port = this.properties.getUriPort();
if (!isStandardPort(scheme, port)) {
baseUrl += ":" + port;
}
builder.baseUrl(baseUrl);
}
private boolean isStandardPort() {
if (this.uriPort == null) {
private boolean isStandardPort(String scheme, Integer port) {
if (port == null) {
return true;
}
return this.uriScheme.equals("http") && this.uriPort == 80
|| this.uriScheme.equals("https") && this.uriPort.equals(443);
return (scheme.equals("http") && port == 80)
|| (scheme.equals("https") && port == 443);
}
}