Merge pull request #13498 from Eddú Meléndez
* gh-13498: Polish "Add support for multiple REST Docs configuration customizers" Add support for multiple REST Docs configuration customizers
This commit is contained in:
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.boot.test.autoconfigure.restdocs;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.restassured.builder.RequestSpecBuilder;
|
||||
import io.restassured.specification.RequestSpecification;
|
||||
|
||||
@@ -58,14 +60,16 @@ public class RestDocsAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public MockMvcRestDocumentationConfigurer restDocsMockMvcConfigurer(
|
||||
ObjectProvider<RestDocsMockMvcConfigurationCustomizer> configurationCustomizerProvider,
|
||||
ObjectProvider<List<RestDocsMockMvcConfigurationCustomizer>> configurationCustomizerProvider,
|
||||
RestDocumentationContextProvider contextProvider) {
|
||||
MockMvcRestDocumentationConfigurer configurer = MockMvcRestDocumentation
|
||||
.documentationConfiguration(contextProvider);
|
||||
RestDocsMockMvcConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider
|
||||
List<RestDocsMockMvcConfigurationCustomizer> configurationCustomizers = configurationCustomizerProvider
|
||||
.getIfAvailable();
|
||||
if (configurationCustomizer != null) {
|
||||
configurationCustomizer.customize(configurer);
|
||||
if (configurationCustomizers != null) {
|
||||
configurationCustomizers
|
||||
.forEach((configurationCustomizer) -> configurationCustomizer
|
||||
.customize(configurer));
|
||||
}
|
||||
return configurer;
|
||||
}
|
||||
@@ -90,14 +94,16 @@ public class RestDocsAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public RequestSpecification restDocsRestAssuredConfigurer(
|
||||
ObjectProvider<RestDocsRestAssuredConfigurationCustomizer> configurationCustomizerProvider,
|
||||
ObjectProvider<List<RestDocsRestAssuredConfigurationCustomizer>> configurationCustomizerProvider,
|
||||
RestDocumentationContextProvider contextProvider) {
|
||||
RestAssuredRestDocumentationConfigurer configurer = RestAssuredRestDocumentation
|
||||
.documentationConfiguration(contextProvider);
|
||||
RestDocsRestAssuredConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider
|
||||
List<RestDocsRestAssuredConfigurationCustomizer> configurationCustomizers = configurationCustomizerProvider
|
||||
.getIfAvailable();
|
||||
if (configurationCustomizer != null) {
|
||||
configurationCustomizer.customize(configurer);
|
||||
if (configurationCustomizers != null) {
|
||||
configurationCustomizers
|
||||
.forEach((configurationCustomizer) -> configurationCustomizer
|
||||
.customize(configurer));
|
||||
}
|
||||
return new RequestSpecBuilder().addFilter(configurer).build();
|
||||
}
|
||||
@@ -119,14 +125,16 @@ public class RestDocsAutoConfiguration {
|
||||
@Bean
|
||||
@ConditionalOnMissingBean
|
||||
public WebTestClientRestDocumentationConfigurer restDocsWebTestClientConfigurer(
|
||||
ObjectProvider<RestDocsWebTestClientConfigurationCustomizer> configurationCustomizerProvider,
|
||||
ObjectProvider<List<RestDocsWebTestClientConfigurationCustomizer>> configurationCustomizerProvider,
|
||||
RestDocumentationContextProvider contextProvider) {
|
||||
WebTestClientRestDocumentationConfigurer configurer = WebTestClientRestDocumentation
|
||||
.documentationConfiguration(contextProvider);
|
||||
RestDocsWebTestClientConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider
|
||||
List<RestDocsWebTestClientConfigurationCustomizer> configurationCustomizers = configurationCustomizerProvider
|
||||
.getIfAvailable();
|
||||
if (configurationCustomizer != null) {
|
||||
configurationCustomizer.customize(configurer);
|
||||
if (configurationCustomizers != null) {
|
||||
configurationCustomizers
|
||||
.forEach((configurationCustomizer) -> configurationCustomizer
|
||||
.customize(configurer));
|
||||
}
|
||||
return configurer;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2017 the original author or authors.
|
||||
* 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.
|
||||
@@ -28,7 +28,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
|
||||
import org.springframework.boot.test.context.TestConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
|
||||
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationConfigurer;
|
||||
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
|
||||
import org.springframework.restdocs.templates.TemplateFormats;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
@@ -38,6 +37,8 @@ import org.springframework.util.FileSystemUtils;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel;
|
||||
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.links;
|
||||
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
|
||||
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
|
||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||
|
||||
/**
|
||||
@@ -45,6 +46,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder
|
||||
* MVC.
|
||||
*
|
||||
* @author Andy Wilkinson
|
||||
* @author Eddú Meléndez
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@WebMvcTest(controllers = RestDocsTestController.class, secure = false)
|
||||
@@ -72,6 +74,7 @@ public class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTes
|
||||
assertThat(new File(defaultSnippetsDir, "curl-request.md"))
|
||||
.has(contentContaining("'http://localhost:8080/'"));
|
||||
assertThat(new File(defaultSnippetsDir, "links.md")).isFile();
|
||||
assertThat(new File(defaultSnippetsDir, "response-fields.md")).isFile();
|
||||
}
|
||||
|
||||
private Condition<File> contentContaining(String toContain) {
|
||||
@@ -79,17 +82,23 @@ public class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTes
|
||||
}
|
||||
|
||||
@TestConfiguration
|
||||
public static class CustomizationConfiguration
|
||||
implements RestDocsMockMvcConfigurationCustomizer {
|
||||
public static class CustomizationConfiguration {
|
||||
|
||||
@Bean
|
||||
public RestDocumentationResultHandler restDocumentation() {
|
||||
return MockMvcRestDocumentation.document("{method-name}");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void customize(MockMvcRestDocumentationConfigurer configurer) {
|
||||
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
|
||||
@Bean
|
||||
public RestDocsMockMvcConfigurationCustomizer templateFormatCustomizer() {
|
||||
return (configurer) -> configurer.snippets()
|
||||
.withTemplateFormat(TemplateFormats.markdown());
|
||||
}
|
||||
|
||||
@Bean
|
||||
public RestDocsMockMvcConfigurationCustomizer defaultSnippetsCustomizer() {
|
||||
return (configurer) -> configurer.snippets().withAdditionalDefaults(
|
||||
responseFields(fieldWithPath("_links.self").description("Main URL")));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -29,7 +29,9 @@ 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.context.annotation.Bean;
|
||||
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
|
||||
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
|
||||
import org.springframework.restdocs.templates.TemplateFormats;
|
||||
import org.springframework.test.context.junit4.SpringRunner;
|
||||
import org.springframework.util.FileSystemUtils;
|
||||
@@ -39,6 +41,8 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.hamcrest.CoreMatchers.is;
|
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris;
|
||||
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest;
|
||||
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
|
||||
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
|
||||
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
|
||||
|
||||
/**
|
||||
@@ -77,6 +81,7 @@ public class RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegratio
|
||||
assertThat(new File(defaultSnippetsDir, "http-request.md"))
|
||||
.has(contentContaining("api.example.com"));
|
||||
assertThat(new File(defaultSnippetsDir, "http-response.md")).isFile();
|
||||
assertThat(new File(defaultSnippetsDir, "response-fields.md")).isFile();
|
||||
}
|
||||
|
||||
private Condition<File> contentContaining(String toContain) {
|
||||
@@ -84,12 +89,23 @@ public class RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegratio
|
||||
}
|
||||
|
||||
@TestConfiguration
|
||||
public static class CustomizationConfiguration
|
||||
implements RestDocsRestAssuredConfigurationCustomizer {
|
||||
public static class CustomizationConfiguration {
|
||||
|
||||
@Override
|
||||
public void customize(RestAssuredRestDocumentationConfigurer configurer) {
|
||||
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
|
||||
@Bean
|
||||
public RestDocumentationResultHandler restDocumentation() {
|
||||
return MockMvcRestDocumentation.document("{method-name}");
|
||||
}
|
||||
|
||||
@Bean
|
||||
public RestDocsRestAssuredConfigurationCustomizer templateFormatCustomizer() {
|
||||
return (configurer) -> configurer.snippets()
|
||||
.withTemplateFormat(TemplateFormats.markdown());
|
||||
}
|
||||
|
||||
@Bean
|
||||
public RestDocsRestAssuredConfigurationCustomizer defaultSnippetsCustomizer() {
|
||||
return (configurer) -> configurer.snippets().withAdditionalDefaults(
|
||||
responseFields(fieldWithPath("_links.self").description("Main URL")));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* 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 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.boot.test.context.TestConfiguration;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentation;
|
||||
import org.springframework.restdocs.mockmvc.RestDocumentationResultHandler;
|
||||
import org.springframework.restdocs.templates.TemplateFormats;
|
||||
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.payload.PayloadDocumentation.fieldWithPath;
|
||||
import static org.springframework.restdocs.payload.PayloadDocumentation.responseFields;
|
||||
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;
|
||||
|
||||
/**
|
||||
* Integration tests for {@link RestDocsAutoConfiguration} with {@link WebTestClient}.
|
||||
*
|
||||
* @author Eddú Meléndez
|
||||
*/
|
||||
@RunWith(SpringRunner.class)
|
||||
@WebFluxTest
|
||||
@AutoConfigureRestDocs(uriScheme = "https", uriHost = "api.example.com", uriPort = 443)
|
||||
public class WebTestClientRestDocsAutoConfigurationAdvancedConfigurationIntegrationTests {
|
||||
|
||||
@Before
|
||||
public void deleteSnippets() {
|
||||
FileSystemUtils.deleteRecursively(new File("target/generated-snippets"));
|
||||
}
|
||||
|
||||
@Autowired
|
||||
private WebTestClient webTestClient;
|
||||
|
||||
@Test
|
||||
public void defaultSnippetsAreWritten() throws Exception {
|
||||
this.webTestClient.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.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();
|
||||
assertThat(new File(defaultSnippetsDir, "response-fields.md")).isFile();
|
||||
}
|
||||
|
||||
private Condition<File> contentContaining(String toContain) {
|
||||
return new ContentContainingCondition(toContain);
|
||||
}
|
||||
|
||||
@TestConfiguration
|
||||
public static class CustomizationConfiguration {
|
||||
|
||||
@Bean
|
||||
public RestDocumentationResultHandler restDocumentation() {
|
||||
return MockMvcRestDocumentation.document("{method-name}");
|
||||
}
|
||||
|
||||
@Bean
|
||||
public RestDocsWebTestClientConfigurationCustomizer templateFormatCustomizer() {
|
||||
return (configurer) -> configurer.snippets()
|
||||
.withTemplateFormat(TemplateFormats.markdown());
|
||||
}
|
||||
|
||||
@Bean
|
||||
public RestDocsWebTestClientConfigurationCustomizer defaultSnippetsCustomizer() {
|
||||
return (configurer) -> configurer.snippets().withAdditionalDefaults(
|
||||
responseFields(fieldWithPath("_links.self").description("Main URL")));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user