From 28476c2d08aae9a139f1ae152fe374e2cb1b6bd7 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Tue, 2 Feb 2016 14:09:20 +0000 Subject: [PATCH] Polish RestDocumentationConfigurer and improve its test coverage --- .../config/RestDocumentationConfigurer.java | 28 +-- .../RestDocumentationConfigurerTests.java | 180 ++++++++++++++++++ .../MockMvcRestDocumentationConfigurer.java | 21 +- ...estAssuredRestDocumentationConfigurer.java | 11 +- 4 files changed, 201 insertions(+), 39 deletions(-) create mode 100644 spring-restdocs-core/src/test/java/org/springframework/restdocs/config/RestDocumentationConfigurerTests.java diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/RestDocumentationConfigurer.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/RestDocumentationConfigurer.java index 0f0ff9b2..ee721725 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/RestDocumentationConfigurer.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/RestDocumentationConfigurer.java @@ -16,6 +16,8 @@ package org.springframework.restdocs.config; +import java.util.Arrays; +import java.util.List; import java.util.Map; import org.springframework.restdocs.RestDocumentationContext; @@ -34,7 +36,7 @@ import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine; * support chaining * @author Andy Wilkinson */ -public abstract class RestDocumentationConfigurer { +public abstract class RestDocumentationConfigurer { private final WriterResolverConfigurer writerResolverConfigurer = new WriterResolverConfigurer(); @@ -74,21 +76,19 @@ public abstract class RestDocumentationConfigurer { } /** - * Returns the configurer used to configure the context with a {@link WriterResolver}. + * Applies this configurer to the given {@code configuration} within the given + * {@code context}. * - * @return the configurer + * @param configuration the configuration + * @param context the current context */ - protected final AbstractConfigurer getWriterResolverConfigurer() { - return this.writerResolverConfigurer; - } - - /** - * Returns the configurer used to configure the context with a {@link TemplateEngine}. - * - * @return the configurer - */ - protected final AbstractConfigurer getTemplateEngineConfigurer() { - return this.templateEngineConfigurer; + protected final void apply(Map configuration, + RestDocumentationContext context) { + List configurers = Arrays.asList(snippets(), + this.templateEngineConfigurer, this.writerResolverConfigurer); + for (AbstractConfigurer configurer : configurers) { + configurer.apply(configuration, context); + } } private static final class TemplateEngineConfigurer extends AbstractConfigurer { diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/config/RestDocumentationConfigurerTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/config/RestDocumentationConfigurerTests.java new file mode 100644 index 00000000..2dad00fe --- /dev/null +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/config/RestDocumentationConfigurerTests.java @@ -0,0 +1,180 @@ +/* + * Copyright 2012-2016 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.restdocs.config; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hamcrest.Matchers; +import org.junit.Test; +import org.springframework.restdocs.RestDocumentationContext; +import org.springframework.restdocs.curl.CurlDocumentation; +import org.springframework.restdocs.curl.CurlRequestSnippet; +import org.springframework.restdocs.http.HttpRequestSnippet; +import org.springframework.restdocs.http.HttpResponseSnippet; +import org.springframework.restdocs.snippet.Snippet; +import org.springframework.restdocs.snippet.SnippetFormats; +import org.springframework.restdocs.snippet.StandardWriterResolver; +import org.springframework.restdocs.snippet.WriterResolver; +import org.springframework.restdocs.templates.TemplateEngine; +import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.Matchers.contains; +import static org.hamcrest.Matchers.hasEntry; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; + +/** + * Tests for {@link RestDocumentationConfigurer}. + * + * @author Andy Wilkinson + */ +public class RestDocumentationConfigurerTests { + + private final TestRestDocumentationConfigurer configurer = new TestRestDocumentationConfigurer(); + + @SuppressWarnings("unchecked") + @Test + public void defaultConfiguration() { + RestDocumentationContext context = new RestDocumentationContext(null, null, null); + Map configuration = new HashMap<>(); + this.configurer.apply(configuration, context); + assertThat( + configuration, + hasEntry(equalTo(TemplateEngine.class.getName()), + instanceOf(MustacheTemplateEngine.class))); + assertThat( + configuration, + hasEntry(equalTo(WriterResolver.class.getName()), + instanceOf(StandardWriterResolver.class))); + assertThat( + configuration, + hasEntry(equalTo("org.springframework.restdocs.defaultSnippets"), + instanceOf(List.class))); + List defaultSnippets = (List) configuration + .get("org.springframework.restdocs.defaultSnippets"); + assertThat( + defaultSnippets, + contains(instanceOf(CurlRequestSnippet.class), + instanceOf(HttpRequestSnippet.class), + instanceOf(HttpResponseSnippet.class))); + assertThat( + configuration, + hasEntry(equalTo(SnippetConfiguration.class.getName()), + instanceOf(SnippetConfiguration.class))); + SnippetConfiguration snippetConfiguration = (SnippetConfiguration) configuration + .get(SnippetConfiguration.class.getName()); + assertThat(snippetConfiguration.getEncoding(), is(equalTo("UTF-8"))); + assertThat(snippetConfiguration.getFormat(), + is(equalTo(SnippetFormats.asciidoctor()))); + } + + @Test + public void customTemplateEngine() { + RestDocumentationContext context = new RestDocumentationContext(null, null, null); + Map configuration = new HashMap<>(); + TemplateEngine templateEngine = mock(TemplateEngine.class); + this.configurer.templateEngine(templateEngine).apply(configuration, context); + assertThat(configuration, Matchers.hasEntry( + TemplateEngine.class.getName(), templateEngine)); + } + + @Test + public void customWriterResolver() { + RestDocumentationContext context = new RestDocumentationContext(null, null, null); + Map configuration = new HashMap<>(); + WriterResolver writerResolver = mock(WriterResolver.class); + this.configurer.writerResolver(writerResolver).apply(configuration, context); + assertThat(configuration, Matchers.hasEntry( + WriterResolver.class.getName(), writerResolver)); + } + + @Test + public void customDefaultSnippets() { + RestDocumentationContext context = new RestDocumentationContext(null, null, null); + Map configuration = new HashMap<>(); + this.configurer.snippets().withDefaults(CurlDocumentation.curlRequest()) + .apply(configuration, context); + assertThat( + configuration, + hasEntry(equalTo("org.springframework.restdocs.defaultSnippets"), + instanceOf(List.class))); + @SuppressWarnings("unchecked") + List defaultSnippets = (List) configuration + .get("org.springframework.restdocs.defaultSnippets"); + assertThat(defaultSnippets, contains(instanceOf(CurlRequestSnippet.class))); + } + + @Test + public void customSnippetEncoding() { + RestDocumentationContext context = new RestDocumentationContext(null, null, null); + Map configuration = new HashMap<>(); + this.configurer.snippets().withEncoding("ISO 8859-1") + .apply(configuration, context); + assertThat( + configuration, + hasEntry(equalTo(SnippetConfiguration.class.getName()), + instanceOf(SnippetConfiguration.class))); + SnippetConfiguration snippetConfiguration = (SnippetConfiguration) configuration + .get(SnippetConfiguration.class.getName()); + assertThat(snippetConfiguration.getEncoding(), is(equalTo("ISO 8859-1"))); + } + + @Test + public void customSnippetFormat() { + RestDocumentationContext context = new RestDocumentationContext(null, null, null); + Map configuration = new HashMap<>(); + this.configurer.snippets().withFormat(SnippetFormats.markdown()) + .apply(configuration, context); + assertThat( + configuration, + hasEntry(equalTo(SnippetConfiguration.class.getName()), + instanceOf(SnippetConfiguration.class))); + SnippetConfiguration snippetConfiguration = (SnippetConfiguration) configuration + .get(SnippetConfiguration.class.getName()); + assertThat(snippetConfiguration.getFormat(), + is(equalTo(SnippetFormats.markdown()))); + } + + private static final class TestRestDocumentationConfigurer + extends + RestDocumentationConfigurer { + + private final TestSnippetConfigurer snippetConfigurer = new TestSnippetConfigurer( + this); + + @Override + public TestSnippetConfigurer snippets() { + return this.snippetConfigurer; + } + + } + + private static final class TestSnippetConfigurer extends + SnippetConfigurer { + + private TestSnippetConfigurer(TestRestDocumentationConfigurer parent) { + super(parent); + } + + } + +} diff --git a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationConfigurer.java b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationConfigurer.java index bb7d7071..a402487f 100644 --- a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationConfigurer.java +++ b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationConfigurer.java @@ -16,15 +16,12 @@ package org.springframework.restdocs.mockmvc; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.restdocs.RestDocumentation; import org.springframework.restdocs.RestDocumentationContext; -import org.springframework.restdocs.config.AbstractConfigurer; import org.springframework.restdocs.config.RestDocumentationConfigurer; import org.springframework.test.web.servlet.request.RequestPostProcessor; import org.springframework.test.web.servlet.setup.ConfigurableMockMvcBuilder; @@ -66,9 +63,7 @@ public class MockMvcRestDocumentationConfigurer @Override public RequestPostProcessor beforeMockMvcCreated( ConfigurableMockMvcBuilder builder, WebApplicationContext context) { - return new ConfigurerApplyingRequestPostProcessor(this.restDocumentation, - Arrays.asList(snippets(), getTemplateEngineConfigurer(), - getWriterResolverConfigurer(), this.uriConfigurer)); + return new ConfigurerApplyingRequestPostProcessor(this.restDocumentation); } @Override @@ -81,17 +76,13 @@ public class MockMvcRestDocumentationConfigurer return this.snippetConfigurer; } - private static final class ConfigurerApplyingRequestPostProcessor implements + private final class ConfigurerApplyingRequestPostProcessor implements RequestPostProcessor { private final RestDocumentation restDocumentation; - private final List configurers; - - private ConfigurerApplyingRequestPostProcessor( - RestDocumentation restDocumentation, List configurers) { + private ConfigurerApplyingRequestPostProcessor(RestDocumentation restDocumentation) { this.restDocumentation = restDocumentation; - this.configurers = configurers; } @Override @@ -105,9 +96,9 @@ public class MockMvcRestDocumentationConfigurer request.getAttribute(urlTemplateAttribute)); request.setAttribute("org.springframework.restdocs.configuration", configuration); - for (AbstractConfigurer configurer : this.configurers) { - configurer.apply(configuration, context); - } + MockMvcRestDocumentationConfigurer.this.apply(configuration, context); + MockMvcRestDocumentationConfigurer.this.uriConfigurer.apply(configuration, + context); return request; } } diff --git a/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured/RestAssuredRestDocumentationConfigurer.java b/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured/RestAssuredRestDocumentationConfigurer.java index 256d6527..25afe0ec 100644 --- a/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured/RestAssuredRestDocumentationConfigurer.java +++ b/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured/RestAssuredRestDocumentationConfigurer.java @@ -16,14 +16,11 @@ package org.springframework.restdocs.restassured; -import java.util.Arrays; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.springframework.restdocs.RestDocumentation; import org.springframework.restdocs.RestDocumentationContext; -import org.springframework.restdocs.config.AbstractConfigurer; import org.springframework.restdocs.config.RestDocumentationConfigurer; import com.jayway.restassured.filter.Filter; @@ -45,14 +42,10 @@ public final class RestAssuredRestDocumentationConfigurer private final RestAssuredSnippetConfigurer snippetConfigurer = new RestAssuredSnippetConfigurer( this); - private final List configurers; - private final RestDocumentation restDocumentation; RestAssuredRestDocumentationConfigurer(RestDocumentation restDocumentation) { this.restDocumentation = restDocumentation; - this.configurers = Arrays.asList(snippets(), getTemplateEngineConfigurer(), - getWriterResolverConfigurer()); } @Override @@ -68,9 +61,7 @@ public final class RestAssuredRestDocumentationConfigurer Map configuration = new HashMap<>(); filterContext.setValue("org.springframework.restdocs.configuration", configuration); - for (AbstractConfigurer configurer : this.configurers) { - configurer.apply(configuration, context); - } + apply(configuration, context); return filterContext.next(requestSpec, responseSpec); } }