Add support for multiple REST Docs configuration customizers

This commit introduces support for multiple configuration customizers
for REST Docs with MockMvc, WebTestClient, and REST Assured.

Closes gh-13498
pull/14056/merge
Eddú Meléndez 7 years ago committed by Andy Wilkinson
parent 6ac6d36395
commit 4d310f0d5a

@ -16,6 +16,8 @@
package org.springframework.boot.test.autoconfigure.restdocs; package org.springframework.boot.test.autoconfigure.restdocs;
import java.util.List;
import io.restassured.builder.RequestSpecBuilder; import io.restassured.builder.RequestSpecBuilder;
import io.restassured.specification.RequestSpecification; import io.restassured.specification.RequestSpecification;
@ -58,14 +60,16 @@ public class RestDocsAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public MockMvcRestDocumentationConfigurer restDocsMockMvcConfigurer( public MockMvcRestDocumentationConfigurer restDocsMockMvcConfigurer(
ObjectProvider<RestDocsMockMvcConfigurationCustomizer> configurationCustomizerProvider, ObjectProvider<List<RestDocsMockMvcConfigurationCustomizer>> configurationCustomizerProvider,
RestDocumentationContextProvider contextProvider) { RestDocumentationContextProvider contextProvider) {
MockMvcRestDocumentationConfigurer configurer = MockMvcRestDocumentation MockMvcRestDocumentationConfigurer configurer = MockMvcRestDocumentation
.documentationConfiguration(contextProvider); .documentationConfiguration(contextProvider);
RestDocsMockMvcConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider List<RestDocsMockMvcConfigurationCustomizer> configurationCustomizers = configurationCustomizerProvider
.getIfAvailable(); .getIfAvailable();
if (configurationCustomizer != null) { if (configurationCustomizers != null) {
configurationCustomizer.customize(configurer); configurationCustomizers
.forEach((configurationCustomizer) -> configurationCustomizer
.customize(configurer));
} }
return configurer; return configurer;
} }
@ -90,14 +94,16 @@ public class RestDocsAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public RequestSpecification restDocsRestAssuredConfigurer( public RequestSpecification restDocsRestAssuredConfigurer(
ObjectProvider<RestDocsRestAssuredConfigurationCustomizer> configurationCustomizerProvider, ObjectProvider<List<RestDocsRestAssuredConfigurationCustomizer>> configurationCustomizerProvider,
RestDocumentationContextProvider contextProvider) { RestDocumentationContextProvider contextProvider) {
RestAssuredRestDocumentationConfigurer configurer = RestAssuredRestDocumentation RestAssuredRestDocumentationConfigurer configurer = RestAssuredRestDocumentation
.documentationConfiguration(contextProvider); .documentationConfiguration(contextProvider);
RestDocsRestAssuredConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider List<RestDocsRestAssuredConfigurationCustomizer> configurationCustomizers = configurationCustomizerProvider
.getIfAvailable(); .getIfAvailable();
if (configurationCustomizer != null) { if (configurationCustomizers != null) {
configurationCustomizer.customize(configurer); configurationCustomizers
.forEach((configurationCustomizer) -> configurationCustomizer
.customize(configurer));
} }
return new RequestSpecBuilder().addFilter(configurer).build(); return new RequestSpecBuilder().addFilter(configurer).build();
} }
@ -119,14 +125,16 @@ public class RestDocsAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public WebTestClientRestDocumentationConfigurer restDocsWebTestClientConfigurer( public WebTestClientRestDocumentationConfigurer restDocsWebTestClientConfigurer(
ObjectProvider<RestDocsWebTestClientConfigurationCustomizer> configurationCustomizerProvider, ObjectProvider<List<RestDocsWebTestClientConfigurationCustomizer>> configurationCustomizerProvider,
RestDocumentationContextProvider contextProvider) { RestDocumentationContextProvider contextProvider) {
WebTestClientRestDocumentationConfigurer configurer = WebTestClientRestDocumentation WebTestClientRestDocumentationConfigurer configurer = WebTestClientRestDocumentation
.documentationConfiguration(contextProvider); .documentationConfiguration(contextProvider);
RestDocsWebTestClientConfigurationCustomizer configurationCustomizer = configurationCustomizerProvider List<RestDocsWebTestClientConfigurationCustomizer> configurationCustomizers = configurationCustomizerProvider
.getIfAvailable(); .getIfAvailable();
if (configurationCustomizer != null) { if (configurationCustomizers != null) {
configurationCustomizer.customize(configurer); configurationCustomizers
.forEach((configurationCustomizer) -> configurationCustomizer
.customize(configurer));
} }
return configurer; return configurer;
} }

@ -38,6 +38,8 @@ import org.springframework.util.FileSystemUtils;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel; import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel;
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.links; 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; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
/** /**
@ -72,6 +74,7 @@ public class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTes
assertThat(new File(defaultSnippetsDir, "curl-request.md")) assertThat(new File(defaultSnippetsDir, "curl-request.md"))
.has(contentContaining("'http://localhost:8080/'")); .has(contentContaining("'http://localhost:8080/'"));
assertThat(new File(defaultSnippetsDir, "links.md")).isFile(); assertThat(new File(defaultSnippetsDir, "links.md")).isFile();
assertThat(new File(defaultSnippetsDir, "response-fields.md")).isFile();
} }
private Condition<File> contentContaining(String toContain) { private Condition<File> contentContaining(String toContain) {
@ -94,4 +97,16 @@ public class MockMvcRestDocsAutoConfigurationAdvancedConfigurationIntegrationTes
} }
@TestConfiguration
public static class CustomizationConfiguration2
implements RestDocsMockMvcConfigurationCustomizer {
@Override
public void customize(MockMvcRestDocumentationConfigurer configurer) {
configurer.snippets().withAdditionalDefaults(
responseFields(fieldWithPath("_links.self").description("Main URL")));
}
}
} }

@ -39,6 +39,8 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.is;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris; import static org.springframework.restdocs.operation.preprocess.Preprocessors.modifyUris;
import static org.springframework.restdocs.operation.preprocess.Preprocessors.preprocessRequest; 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; import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
/** /**
@ -77,6 +79,7 @@ public class RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegratio
assertThat(new File(defaultSnippetsDir, "http-request.md")) assertThat(new File(defaultSnippetsDir, "http-request.md"))
.has(contentContaining("api.example.com")); .has(contentContaining("api.example.com"));
assertThat(new File(defaultSnippetsDir, "http-response.md")).isFile(); assertThat(new File(defaultSnippetsDir, "http-response.md")).isFile();
assertThat(new File(defaultSnippetsDir, "response-fields.md")).isFile();
} }
private Condition<File> contentContaining(String toContain) { private Condition<File> contentContaining(String toContain) {
@ -94,4 +97,16 @@ public class RestAssuredRestDocsAutoConfigurationAdvancedConfigurationIntegratio
} }
@TestConfiguration
public static class CustomizationConfiguration2
implements RestDocsRestAssuredConfigurationCustomizer {
@Override
public void customize(RestAssuredRestDocumentationConfigurer configurer) {
configurer.snippets().withAdditionalDefaults(
responseFields(fieldWithPath("_links.self").description("Main URL")));
}
}
} }

@ -0,0 +1,99 @@
/*
* 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.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.webtestclient.WebTestClientRestDocumentationConfigurer;
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
implements RestDocsWebTestClientConfigurationCustomizer {
@Override
public void customize(WebTestClientRestDocumentationConfigurer configurer) {
configurer.snippets().withTemplateFormat(TemplateFormats.markdown());
}
}
@TestConfiguration
public static class CustomizationConfiguration2
implements RestDocsWebTestClientConfigurationCustomizer {
@Override
public void customize(WebTestClientRestDocumentationConfigurer configurer) {
configurer.snippets().withAdditionalDefaults(
responseFields(fieldWithPath("_links.self").description("Main URL")));
}
}
}
Loading…
Cancel
Save