From 56ad74f406afdacbe4f498f3d8b78d93d345af0a Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Thu, 9 Nov 2017 19:24:18 +0200 Subject: [PATCH 01/13] Add web test client restdocs autoconfiguration --- .../restdocs/RestDocsAutoConfiguration.java | 24 +++++++ ...sWebTestClientConfigurationCustomizer.java | 42 +++++++++++ ...DocsAutoConfigurationIntegrationTests.java | 72 +++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientConfigurationCustomizer.java create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java index 7941b6cb1e7b..b593f9933af1 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java @@ -35,6 +35,8 @@ 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. @@ -108,4 +110,26 @@ public RestDocsRestAssuredBuilderCustomizer restAssuredBuilderCustomizer( } + @Configuration + @ConditionalOnClass(WebTestClientRestDocumentation.class) + @ConditionalOnWebApplication(type = Type.SERVLET) + static class RestDocsWebTestClientAutoConfiguration { + + @Bean + @ConditionalOnMissingBean(WebTestClientRestDocumentationConfigurer.class) + public WebTestClientRestDocumentationConfigurer restDocsWebTestClientConfigurer( + ObjectProvider configurationCustomizerProvider, // TODO: create web test client customizer + RestDocumentationContextProvider contextProvider) { + WebTestClientRestDocumentationConfigurer configurer = WebTestClientRestDocumentation + .documentationConfiguration(contextProvider); + RestDocsWebTestClientConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider + .getIfAvailable(); + if (configurationCustomizer != null) { + configurationCustomizer.customize(configurer); + } + return configurer; + } + + } + } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientConfigurationCustomizer.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientConfigurationCustomizer.java new file mode 100644 index 000000000000..cebff084c7c3 --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientConfigurationCustomizer.java @@ -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); + +} diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java new file mode 100644 index 000000000000..a87cea3660de --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java @@ -0,0 +1,72 @@ +/* + * 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 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.autoconfigure.web.reactive.WebFluxTest; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.util.FileSystemUtils; + + +import static org.assertj.core.api.Assertions.assertThat; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; + +/** + * Integration tests for {@link RestDocsAutoConfiguration} with WebClientTest. + * + * @author Andy Wilkinson + * @author Roman Zaynetdinov + */ +@RunWith(SpringRunner.class) +@WebFluxTest +@AutoConfigureRestDocs(uriScheme = "https", uriHost = "api.example.com", uriPort = 443) +public class WebClientTestRestDocsAutoConfigurationIntegrationTests { + + @Before + public void deleteSnippets() { + FileSystemUtils.deleteRecursively(new File("target/generated-snippets")); + } + + @Autowired + private WebClientTest mvc; + + @Test + public void defaultSnippetsAreWritten() throws Exception { + this.webClientTest.get().uri("/").exchange() + .expectBody().consumeWith(document("default-snippets")); + 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 contentContaining(String toContain) { + return new ContentContainingCondition(toContain); + } + +} From 0af9dc738771d3a4d080998098e4d84570217461 Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Thu, 9 Nov 2017 19:26:50 +0200 Subject: [PATCH 02/13] Remove comment --- .../test/autoconfigure/restdocs/RestDocsAutoConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java index b593f9933af1..936acb2d3d4d 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java @@ -118,7 +118,7 @@ static class RestDocsWebTestClientAutoConfiguration { @Bean @ConditionalOnMissingBean(WebTestClientRestDocumentationConfigurer.class) public WebTestClientRestDocumentationConfigurer restDocsWebTestClientConfigurer( - ObjectProvider configurationCustomizerProvider, // TODO: create web test client customizer + ObjectProvider configurationCustomizerProvider, RestDocumentationContextProvider contextProvider) { WebTestClientRestDocumentationConfigurer configurer = WebTestClientRestDocumentation .documentationConfiguration(contextProvider); From dfd63b2c78c80e8493f8b6b4f5ebfdc1fbe48c5b Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Thu, 9 Nov 2017 20:38:00 +0200 Subject: [PATCH 03/13] Fix checkstyle violations --- ...TestClientRestDocsAutoConfigurationIntegrationTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java index a87cea3660de..0a58afdf4046 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java @@ -42,7 +42,7 @@ @RunWith(SpringRunner.class) @WebFluxTest @AutoConfigureRestDocs(uriScheme = "https", uriHost = "api.example.com", uriPort = 443) -public class WebClientTestRestDocsAutoConfigurationIntegrationTests { +public class WebTestClientRestDocsAutoConfigurationIntegrationTests { @Before public void deleteSnippets() { @@ -50,11 +50,11 @@ public void deleteSnippets() { } @Autowired - private WebClientTest mvc; + private WebTestClient webTestClient; @Test public void defaultSnippetsAreWritten() throws Exception { - this.webClientTest.get().uri("/").exchange() + this.webTestClient.get().uri("/").exchange() .expectBody().consumeWith(document("default-snippets")); File defaultSnippetsDir = new File("target/generated-snippets/default-snippets"); assertThat(defaultSnippetsDir).exists(); From 9e449aa09f506f71dd2e79bd6f6021fa53a814ed Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Thu, 9 Nov 2017 21:15:57 +0200 Subject: [PATCH 04/13] Add restdocs webtestclient dependency --- spring-boot-project/spring-boot-test-autoconfigure/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/pom.xml b/spring-boot-project/spring-boot-test-autoconfigure/pom.xml index 00c9a685ae14..f435b8ec187b 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/pom.xml +++ b/spring-boot-project/spring-boot-test-autoconfigure/pom.xml @@ -151,6 +151,11 @@ spring-restdocs-restassured true + + org.springframework.restdocs + spring-restdocs-webtestclient + true + org.springframework.security spring-security-config From 27865219c5dd95823c102ab57135553081dbbd40 Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Thu, 9 Nov 2017 21:47:46 +0200 Subject: [PATCH 05/13] Use correct document import --- .../WebTestClientRestDocsAutoConfigurationIntegrationTests.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java index 0a58afdf4046..d0558fe566c9 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/restdocs/WebTestClientRestDocsAutoConfigurationIntegrationTests.java @@ -31,7 +31,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document; /** * Integration tests for {@link RestDocsAutoConfiguration} with WebClientTest. From 4f1c03df16e4fe6395e098d516a71a4592013a9a Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Thu, 9 Nov 2017 22:05:02 +0200 Subject: [PATCH 06/13] Use reactive type --- .../test/autoconfigure/restdocs/RestDocsAutoConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java index 936acb2d3d4d..a5c8fd5a5e0d 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java @@ -112,7 +112,7 @@ public RestDocsRestAssuredBuilderCustomizer restAssuredBuilderCustomizer( @Configuration @ConditionalOnClass(WebTestClientRestDocumentation.class) - @ConditionalOnWebApplication(type = Type.SERVLET) + @ConditionalOnWebApplication(type = Type.REACTIVE) static class RestDocsWebTestClientAutoConfiguration { @Bean From 5b0c5aa7dc78987fbd2051d27d39b7bb5ceed870 Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Thu, 9 Nov 2017 22:05:15 +0200 Subject: [PATCH 07/13] Add static webclienttest document to checkstyle --- .../spring-boot-parent/src/checkstyle/checkstyle.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-project/spring-boot-parent/src/checkstyle/checkstyle.xml b/spring-boot-project/spring-boot-parent/src/checkstyle/checkstyle.xml index fc343f4c1640..7eb65e709327 100644 --- a/spring-boot-project/spring-boot-parent/src/checkstyle/checkstyle.xml +++ b/spring-boot-project/spring-boot-parent/src/checkstyle/checkstyle.xml @@ -70,7 +70,7 @@ + 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.webtestclient.WebTestClientRestDocumentation.*, 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.*" /> From 9cccae553a36863e1977993006f7d4a5925cf49d Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Sun, 12 Nov 2017 11:16:38 +0200 Subject: [PATCH 08/13] Customize web test client --- .../restdocs/RestDocsAutoConfiguration.java | 9 ++ ...estDocsWebTestClientBuilderCustomizer.java | 90 +++++++++++++++++++ .../WebTestClientAutoConfiguration.java | 9 +- .../WebTestClientBuilderCustomizer.java | 43 +++++++++ 4 files changed, 150 insertions(+), 1 deletion(-) create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java index a5c8fd5a5e0d..47e6b59543f3 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java @@ -43,6 +43,7 @@ * * @author Andy Wilkinson * @author Eddú Meléndez + * @author Roman Zaynetdinov * @since 1.4.0 */ @Configuration @@ -99,6 +100,7 @@ public RequestSpecification restDocsRestAssuredConfigurer( configurationCustomizer.customize(configurer); } return new RequestSpecBuilder().addFilter(configurer).build(); + } @Bean @@ -130,6 +132,13 @@ public WebTestClientRestDocumentationConfigurer restDocsWebTestClientConfigurer( return configurer; } + @Bean + @ConfigurationProperties(prefix = "spring.test.restdocs") + public RestDocsWebTestClientBuilderCustomizer restDocumentationConfigurer( + WebTestClientRestDocumentationConfigurer configurer) { + return new RestDocsWebTestClientBuilderCustomizer(configurer); + } + } } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java new file mode 100644 index 000000000000..d9142171052e --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java @@ -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); + } +} diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java index 8997ebb4bdd6..2e2fca9bf452 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java @@ -18,6 +18,7 @@ import java.time.Duration; import java.util.Collection; +import java.util.List; import java.util.function.Consumer; import org.springframework.boot.autoconfigure.AutoConfigureAfter; @@ -25,11 +26,13 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration; import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.boot.test.autoconfigure.web.servlet.MockMvcBuilderCustomizer; import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.codec.ClientCodecConfigurer; +import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.Builder; import org.springframework.util.CollectionUtils; @@ -49,11 +52,15 @@ public class WebTestClientAutoConfiguration { @Bean @ConditionalOnMissingBean - public WebTestClient webTestClient(ApplicationContext applicationContext) { + public WebTestClient webTestClient(ApplicationContext applicationContext, + List customizers) { WebTestClient.Builder builder = WebTestClient .bindToApplicationContext(applicationContext).configureClient(); customizeWebTestClient(builder, applicationContext); customizeWebTestClientCodecs(builder, applicationContext); + for (WebTestClientBuilderCustomizer customizer : customizers) { + customizer.customize(builder); + } return builder.build(); } diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java new file mode 100644 index 000000000000..7ad7cafb0f67 --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java @@ -0,0 +1,43 @@ +/* + * 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.web.reactive; + +import org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.test.web.servlet.MockMvcBuilder; +import org.springframework.test.web.servlet.setup.ConfigurableMockMvcBuilder; + +/** + * A customizer for a {@link WebTestClient.Builder}. Any + * {@code WebTestClientBuilderCustomizer} beans found in the application context will be + * {@link #customize called} to customize the auto-configured {@link WebTestClient.Builder}. + * + * @author Andy Wilkinson + * @author Roman Zaynetdinov + * @since 2.0.0 + * @see WebTestClientAutoConfiguration + */ +@FunctionalInterface +public interface WebTestClientBuilderCustomizer { + + /** + * Customize the given {@code builder}. + * @param builder the builder + */ + void customize(WebTestClient.Builder builder); + +} From 973b98477c5dffdc3d3f630bdaf965d26f30b9ee Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Sun, 12 Nov 2017 11:23:33 +0200 Subject: [PATCH 09/13] Format files --- .../restdocs/RestDocsAutoConfiguration.java | 1 - .../RestDocsWebTestClientBuilderCustomizer.java | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java index 47e6b59543f3..be6c39cf7b02 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsAutoConfiguration.java @@ -100,7 +100,6 @@ public RequestSpecification restDocsRestAssuredConfigurer( configurationCustomizer.customize(configurer); } return new RequestSpecBuilder().addFilter(configurer).build(); - } @Bean diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java index d9142171052e..22e72b342b7e 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/restdocs/RestDocsWebTestClientBuilderCustomizer.java @@ -75,13 +75,13 @@ 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; - } + 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); } From bc7d33033fc12b2627fa953ae2f53239a1f4b81b Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Sun, 12 Nov 2017 11:33:12 +0200 Subject: [PATCH 10/13] Remove unused imports --- .../web/reactive/WebTestClientAutoConfiguration.java | 2 -- .../web/reactive/WebTestClientBuilderCustomizer.java | 3 --- 2 files changed, 5 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java index 2e2fca9bf452..29279405ff6a 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java @@ -26,13 +26,11 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration; import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.boot.test.autoconfigure.web.servlet.MockMvcBuilderCustomizer; import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.codec.ClientCodecConfigurer; -import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.Builder; import org.springframework.util.CollectionUtils; diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java index 7ad7cafb0f67..39ea6b189d64 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientBuilderCustomizer.java @@ -16,10 +16,7 @@ package org.springframework.boot.test.autoconfigure.web.reactive; -import org.springframework.boot.test.autoconfigure.web.servlet.MockMvcAutoConfiguration; import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.test.web.servlet.MockMvcBuilder; -import org.springframework.test.web.servlet.setup.ConfigurableMockMvcBuilder; /** * A customizer for a {@link WebTestClient.Builder}. Any From 2963eb783dc9593512f391e70a8cd13883149e04 Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Sun, 12 Nov 2017 12:29:37 +0200 Subject: [PATCH 11/13] Add default web test client builder customizer --- ...ingBootWebTestClientBuilderCustomizer.java | 82 +++++++++++++++++++ .../WebTestClientAutoConfiguration.java | 41 ++-------- 2 files changed, 91 insertions(+), 32 deletions(-) create mode 100644 spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java new file mode 100644 index 000000000000..fb1a6b8fd910 --- /dev/null +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java @@ -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.web.reactive; + +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.boot.web.codec.CodecCustomizer; +import org.springframework.context.ApplicationContext; +import org.springframework.http.codec.ClientCodecConfigurer; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; +import org.springframework.web.reactive.function.client.ExchangeStrategies; + +import java.time.Duration; +import java.util.Collection; +import java.util.function.Consumer; + +/** + * {@link WebTestClientBuilderCustomizer} for a typical Spring Boot application. Usually applied + * automatically via {@link AutoConfigureWebTestClient @AutoConfigureWebTestClient}, but may also be + * used directly. + * + * @author Phillip Webb + * @author Andy Wilkinson + * @author Roman Zaynetdinov + * @since 2.0.0 + */ +public class SpringBootWebTestClientBuilderCustomizer implements WebTestClientBuilderCustomizer { + + private final ApplicationContext context; + + /** + * Create a new {@link SpringBootWebTestClientBuilderCustomizer} instance. + * @param context the source application context + */ + public SpringBootWebTestClientBuilderCustomizer(ApplicationContext context) { + Assert.notNull(context, "Context must not be null"); + this.context = context; + } + + @Override + public void customize(WebTestClient.Builder builder) { + customizeWebTestClient(builder); + customizeWebTestClientCodecs(builder); + } + + private void customizeWebTestClient(WebTestClient.Builder builder) { + Binder.get(this.context.getEnvironment()) + .bind("spring.test.webtestclient.timeout", Duration.class) + .ifBound(builder::responseTimeout); + } + + private void customizeWebTestClientCodecs(WebTestClient.Builder builder) { + Collection customizers = this.context + .getBeansOfType(CodecCustomizer.class).values(); + if (!CollectionUtils.isEmpty(customizers)) { + builder.exchangeStrategies(ExchangeStrategies.builder() + .codecs(this.applyCustomizers(customizers)).build()); + } + } + + private Consumer applyCustomizers( + Collection customizers) { + return (codecs) -> customizers + .forEach((customizer) -> customizer.customize(codecs)); + } + +} diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java index 29279405ff6a..83a8bb399535 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java @@ -16,25 +16,16 @@ package org.springframework.boot.test.autoconfigure.web.reactive; -import java.time.Duration; -import java.util.Collection; import java.util.List; -import java.util.function.Consumer; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration; -import org.springframework.boot.context.properties.bind.Binder; -import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.http.codec.ClientCodecConfigurer; import org.springframework.test.web.reactive.server.WebTestClient; -import org.springframework.test.web.reactive.server.WebTestClient.Builder; -import org.springframework.util.CollectionUtils; -import org.springframework.web.reactive.function.client.ExchangeStrategies; import org.springframework.web.reactive.function.client.WebClient; /** @@ -48,41 +39,27 @@ @AutoConfigureAfter(CodecsAutoConfiguration.class) public class WebTestClientAutoConfiguration { + private final ApplicationContext context; + + WebTestClientAutoConfiguration(ApplicationContext context) { + this.context = context; + } + @Bean @ConditionalOnMissingBean public WebTestClient webTestClient(ApplicationContext applicationContext, List customizers) { WebTestClient.Builder builder = WebTestClient .bindToApplicationContext(applicationContext).configureClient(); - customizeWebTestClient(builder, applicationContext); - customizeWebTestClientCodecs(builder, applicationContext); for (WebTestClientBuilderCustomizer customizer : customizers) { customizer.customize(builder); } return builder.build(); } - private void customizeWebTestClient(Builder builder, - ApplicationContext applicationContext) { - Binder.get(applicationContext.getEnvironment()) - .bind("spring.test.webtestclient.timeout", Duration.class) - .ifBound(builder::responseTimeout); - } - - private void customizeWebTestClientCodecs(WebTestClient.Builder builder, - ApplicationContext applicationContext) { - Collection customizers = applicationContext - .getBeansOfType(CodecCustomizer.class).values(); - if (!CollectionUtils.isEmpty(customizers)) { - builder.exchangeStrategies(ExchangeStrategies.builder() - .codecs(applyCustomizers(customizers)).build()); - } - } - - private Consumer applyCustomizers( - Collection customizers) { - return (codecs) -> customizers - .forEach((customizer) -> customizer.customize(codecs)); + @Bean + public SpringBootWebTestClientBuilderCustomizer springBootWebTestClientBuilderCustomizer() { + return new SpringBootWebTestClientBuilderCustomizer(this.context); } } From 3b62b929b0b8bae80fcadb476d951de233b257aa Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Sun, 12 Nov 2017 12:45:01 +0200 Subject: [PATCH 12/13] Reorder imports --- .../SpringBootWebTestClientBuilderCustomizer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java index fb1a6b8fd910..6b6c2ce90208 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/SpringBootWebTestClientBuilderCustomizer.java @@ -16,6 +16,10 @@ package org.springframework.boot.test.autoconfigure.web.reactive; +import java.time.Duration; +import java.util.Collection; +import java.util.function.Consumer; + import org.springframework.boot.context.properties.bind.Binder; import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.ApplicationContext; @@ -25,10 +29,6 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.reactive.function.client.ExchangeStrategies; -import java.time.Duration; -import java.util.Collection; -import java.util.function.Consumer; - /** * {@link WebTestClientBuilderCustomizer} for a typical Spring Boot application. Usually applied * automatically via {@link AutoConfigureWebTestClient @AutoConfigureWebTestClient}, but may also be From 24e3da745294e63255fe2a54f08c4e5d4f9d0338 Mon Sep 17 00:00:00 2001 From: Roman Zaynetdinov Date: Sun, 12 Nov 2017 13:44:47 +0200 Subject: [PATCH 13/13] Use application context from field --- .../web/reactive/WebTestClientAutoConfiguration.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java index 83a8bb399535..817d5651fa1e 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/web/reactive/WebTestClientAutoConfiguration.java @@ -32,6 +32,7 @@ * Auto-configuration for {@link WebTestClient}. * * @author Stephane Nicoll + * @author Roman Zaynetdinov * @since 2.0.0 */ @Configuration @@ -47,10 +48,9 @@ public class WebTestClientAutoConfiguration { @Bean @ConditionalOnMissingBean - public WebTestClient webTestClient(ApplicationContext applicationContext, - List customizers) { + public WebTestClient webTestClient(List customizers) { WebTestClient.Builder builder = WebTestClient - .bindToApplicationContext(applicationContext).configureClient(); + .bindToApplicationContext(this.context).configureClient(); for (WebTestClientBuilderCustomizer customizer : customizers) { customizer.customize(builder); }