diff --git a/docs/src/docs/asciidoc/configuration.adoc b/docs/src/docs/asciidoc/configuration.adoc index 35490f79..1e6fca5e 100644 --- a/docs/src/docs/asciidoc/configuration.adoc +++ b/docs/src/docs/asciidoc/configuration.adoc @@ -116,21 +116,25 @@ include::{examples-dir}/com/example/restassured/CustomDefaultSnippets.java[tags= ---- [[configuration-default-preprocessors]] -=== Operation preprocessors +=== Default operation preprocessors -You can configure default Request / Response preprocessors during setup using the +You can configure default request and response preprocessors during setup using the `RestDocumentationConfigurer` API. For example, to remove the `Foo` headers from all requests and pretty print all responses: [source,java,indent=0,role="primary"] .MockMvc ---- -include::{examples-dir}/com/example/mockmvc/CustomDefaultOperationPreprocessors.java[tags=custom-default-preprocessors] +include::{examples-dir}/com/example/mockmvc/CustomDefaultOperationPreprocessors.java[tags=custom-default-operation-preprocessors] ---- +<1> Apply a request preprocessor that will remove the header named `Foo`. +<2> Apply a response preprocessor that will pretty print its content. [source,java,indent=0,role="secondary"] .REST Assured ---- -include::{examples-dir}/com/example/restassured/CustomDefaultOperationPreprocessors.java[tags=custom-default-preprocessors] +include::{examples-dir}/com/example/restassured/CustomDefaultOperationPreprocessors.java[tags=custom-default-operation-preprocessors] ---- +<1> Apply a request preprocessor that will remove the header named `Foo`. +<2> Apply a response preprocessor that will pretty print its content. diff --git a/docs/src/docs/asciidoc/customizing-requests-and-responses.adoc b/docs/src/docs/asciidoc/customizing-requests-and-responses.adoc index d68f7314..4cc2625b 100644 --- a/docs/src/docs/asciidoc/customizing-requests-and-responses.adoc +++ b/docs/src/docs/asciidoc/customizing-requests-and-responses.adoc @@ -27,20 +27,25 @@ include::{examples-dir}/com/example/restassured/PerTestPreprocessing.java[tags=p <2> Apply a response preprocessor that will pretty print its content. Alternatively, you may want to apply the same preprocessors to every test. You can do -so by configuring the preprocessors using the `RestDocumentationConfigurer` API. -For example to remove the `Foo` header from all requests and pretty print all responses: +so by configuring the preprocessors using the `RestDocumentationConfigurer` API in your +`@Before` method. For example to remove the `Foo` header from all requests and pretty print +all responses: [source,java,indent=0,role="primary"] .MockMvc ---- include::{examples-dir}/com/example/mockmvc/EveryTestPreprocessing.java[tags=setup] ---- +<1> Apply a request preprocessor that will remove the header named `Foo`. +<2> Apply a response preprocessor that will pretty print its content. [source,java,indent=0,role="secondary"] .REST Assured ---- include::{examples-dir}/com/example/restassured/EveryTestPreprocessing.java[tags=setup] ---- +<1> Apply a request preprocessor that will remove the header named `Foo`. +<2> Apply a response preprocessor that will pretty print its content. Then, in each test, any configuration specific to that test can be performed. For example: diff --git a/docs/src/test/java/com/example/mockmvc/CustomDefaultOperationPreprocessors.java b/docs/src/test/java/com/example/mockmvc/CustomDefaultOperationPreprocessors.java index 786c050e..c6cd2fa0 100644 --- a/docs/src/test/java/com/example/mockmvc/CustomDefaultOperationPreprocessors.java +++ b/docs/src/test/java/com/example/mockmvc/CustomDefaultOperationPreprocessors.java @@ -35,16 +35,19 @@ public class CustomDefaultOperationPreprocessors { private WebApplicationContext context; + @SuppressWarnings("unused") private MockMvc mockMvc; @Before public void setup() { - // tag::custom-default-preprocessors[] + // tag::custom-default-operation-preprocessors[] this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) - .apply(documentationConfiguration(this.restDocumentation).operationPreprocessors() - .withDefaultRequestPreprocessors(removeHeaders("Foo")) - .withDefaultResponsePreprocessors(prettyPrint())) + .apply(documentationConfiguration(this.restDocumentation) + .operationPreprocessors() + .withRequestDefaults(removeHeaders("Foo")) // <1> + .withResponseDefaults(prettyPrint())) // <2> .build(); - // end::custom-default-preprocessors[] + // end::custom-default-operation-preprocessors[] } + } diff --git a/docs/src/test/java/com/example/mockmvc/EveryTestPreprocessing.java b/docs/src/test/java/com/example/mockmvc/EveryTestPreprocessing.java index 279a3310..3b46bb21 100644 --- a/docs/src/test/java/com/example/mockmvc/EveryTestPreprocessing.java +++ b/docs/src/test/java/com/example/mockmvc/EveryTestPreprocessing.java @@ -45,19 +45,18 @@ public class EveryTestPreprocessing { @Before public void setup() { this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context) - .apply(documentationConfiguration(this.restDocumentation).operationPreprocessors() - .withDefaultRequestPreprocessors(removeHeaders("Foo")) - .withDefaultResponsePreprocessors(prettyPrint())) - .build(); + .apply(documentationConfiguration(this.restDocumentation).operationPreprocessors() + .withRequestDefaults(removeHeaders("Foo")) // <1> + .withResponseDefaults(prettyPrint())) // <2> + .build(); } - // end::setup[] public void use() throws Exception { // tag::use[] - this.mockMvc.perform(get("/")) // <1> + this.mockMvc.perform(get("/")) .andExpect(status().isOk()) - .andDo(document("{method-name}", + .andDo(document("index", links(linkWithRel("self").description("Canonical self link")) )); // end::use[] diff --git a/docs/src/test/java/com/example/restassured/CustomDefaultOperationPreprocessors.java b/docs/src/test/java/com/example/restassured/CustomDefaultOperationPreprocessors.java index c4ebd8ff..262f9680 100644 --- a/docs/src/test/java/com/example/restassured/CustomDefaultOperationPreprocessors.java +++ b/docs/src/test/java/com/example/restassured/CustomDefaultOperationPreprocessors.java @@ -1,5 +1,5 @@ /* - * Copyright 2014-2018 the original author or authors. + * Copyright 2014-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. @@ -18,7 +18,6 @@ package com.example.restassured; import io.restassured.builder.RequestSpecBuilder; import io.restassured.specification.RequestSpecification; - import org.junit.Before; import org.junit.Rule; @@ -38,12 +37,13 @@ public class CustomDefaultOperationPreprocessors { @Before public void setup() { - // tag::custom-default-preprocessors[] + // tag::custom-default-operation-preprocessors[] this.spec = new RequestSpecBuilder() - .addFilter(documentationConfiguration(this.restDocumentation).operationPreprocessors() - .withDefaultRequestPreprocessors(removeHeaders("Foo")) - .withDefaultResponsePreprocessors(prettyPrint())) - .build(); - // end::custom-default-preprocessors[] + .addFilter(documentationConfiguration(this.restDocumentation).operationPreprocessors() + .withRequestDefaults(removeHeaders("Foo")) // <1> + .withResponseDefaults(prettyPrint())) // <2> + .build(); + // end::custom-default-operation-preprocessors[] } + } diff --git a/docs/src/test/java/com/example/restassured/EveryTestPreprocessing.java b/docs/src/test/java/com/example/restassured/EveryTestPreprocessing.java index fa14f5c2..05bc3a61 100644 --- a/docs/src/test/java/com/example/restassured/EveryTestPreprocessing.java +++ b/docs/src/test/java/com/example/restassured/EveryTestPreprocessing.java @@ -43,19 +43,18 @@ public class EveryTestPreprocessing { @Before public void setup() { this.spec = new RequestSpecBuilder() - .addFilter(documentationConfiguration(this.restDocumentation).operationPreprocessors() - .withDefaultRequestPreprocessors(removeHeaders("Foo")) - .withDefaultResponsePreprocessors(prettyPrint())) - .build(); + .addFilter(documentationConfiguration(this.restDocumentation).operationPreprocessors() + .withRequestDefaults(removeHeaders("Foo")) // <1> + .withResponseDefaults(prettyPrint())) // <2> + .build(); } - // end::setup[] public void use() throws Exception { // tag::use[] RestAssured.given(this.spec) - .filter(document("{method-name]", - links(linkWithRel("self").description("Canonical self link")))) + .filter(document("index", + links(linkWithRel("self").description("Canonical self link")))) .when().get("/") .then().assertThat().statusCode(is(200)); // end::use[] diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/OperationPreprocessorsConfigurer.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/OperationPreprocessorsConfigurer.java index afb21cc5..a0126dee 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/OperationPreprocessorsConfigurer.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/config/OperationPreprocessorsConfigurer.java @@ -26,21 +26,24 @@ import org.springframework.restdocs.operation.preprocess.OperationResponsePrepro import org.springframework.restdocs.operation.preprocess.Preprocessors; /** - * A configurer that can be used to configure the default operation preprocessors that need to be used. + * A configurer that can be used to configure the default operation preprocessors. * * @param The type of the configurer's parent * @param The concrete type of the configurer to be returned from chained methods * @author Filip Hrisafov + * @author Andy Wilkinson * @since 2.0.0 */ public abstract class OperationPreprocessorsConfigurer extends AbstractNestedConfigurer { private OperationRequestPreprocessor defaultOperationRequestPreprocessor; + private OperationResponsePreprocessor defaultOperationResponsePreprocessor; /** - * Creates a new {@code OperationPreprocessorConfigurer} with the given {@code parent}. + * Creates a new {@code OperationPreprocessorConfigurer} with the given + * {@code parent}. * * @param parent the parent */ @@ -49,34 +52,40 @@ public abstract class OperationPreprocessorsConfigurer } @Override - public void apply(Map configuration, RestDocumentationContext context) { - configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR, + public void apply(Map configuration, + RestDocumentationContext context) { + configuration.put( + RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR, this.defaultOperationRequestPreprocessor); - configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR, + configuration.put( + RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR, this.defaultOperationResponsePreprocessor); } /** - * Configures the default documentation operation request preprocessors. + * Configures the default operation request preprocessors. * * @param preprocessors the preprocessors * @return {@code this} */ @SuppressWarnings("unchecked") - public TYPE withDefaultRequestPreprocessors(OperationPreprocessor... preprocessors) { - this.defaultOperationRequestPreprocessor = Preprocessors.preprocessRequest(preprocessors); + public TYPE withRequestDefaults(OperationPreprocessor... preprocessors) { + this.defaultOperationRequestPreprocessor = Preprocessors + .preprocessRequest(preprocessors); return (TYPE) this; } /** - * Configures the default documentation operation response preprocessors. + * Configures the default operation response preprocessors. * * @param preprocessors the preprocessors * @return {@code this} */ @SuppressWarnings("unchecked") - public TYPE withDefaultResponsePreprocessors(OperationPreprocessor... preprocessors) { - this.defaultOperationResponsePreprocessor = Preprocessors.preprocessResponse(preprocessors); + public TYPE withResponseDefaults(OperationPreprocessor... preprocessors) { + this.defaultOperationResponsePreprocessor = Preprocessors + .preprocessResponse(preprocessors); return (TYPE) this; } + } 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 75b69352..0f9c67d2 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 @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 the original author or authors. + * Copyright 2014-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. @@ -35,7 +35,7 @@ import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine; /** * Abstract base class for the configuration of Spring REST Docs. * - * @param The concrete type of the {@link SnippetConfigurer}. + * @param The concrete type of the {@link SnippetConfigurer} * @param

The concrete type of the {@link OperationPreprocessorsConfigurer} * @param The concrete type of this configurer, to be returned from methods that * support chaining @@ -58,8 +58,8 @@ public abstract class RestDocumentationConfigurer configuration, RestDocumentationContext context) { List configurers = Arrays.asList(snippets(), - operationPreprocessors(), - this.templateEngineConfigurer, this.writerResolverConfigurer); + operationPreprocessors(), this.templateEngineConfigurer, + this.writerResolverConfigurer); for (AbstractConfigurer configurer : configurers) { configurer.apply(configuration, context); } diff --git a/spring-restdocs-core/src/main/java/org/springframework/restdocs/generate/RestDocumentationGenerator.java b/spring-restdocs-core/src/main/java/org/springframework/restdocs/generate/RestDocumentationGenerator.java index d239ffc4..b69bae2f 100644 --- a/spring-restdocs-core/src/main/java/org/springframework/restdocs/generate/RestDocumentationGenerator.java +++ b/spring-restdocs-core/src/main/java/org/springframework/restdocs/generate/RestDocumentationGenerator.java @@ -57,17 +57,16 @@ public final class RestDocumentationGenerator { public static final String ATTRIBUTE_NAME_DEFAULT_SNIPPETS = "org.springframework.restdocs.defaultSnippets"; /** - * Name of the operation attribute used to hold the default operation request preprocessor. + * Name of the operation attribute used to hold the default operation request + * preprocessor. */ - public static final String ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR = - "org.springframework.restdocs.defaultOperationRequestPreprocessor"; + public static final String ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR = "org.springframework.restdocs.defaultOperationRequestPreprocessor"; /** - * Name of the operation attribute used to hold the default operation response preprocessor. + * Name of the operation attribute used to hold the default operation response + * preprocessor. */ - public static final String ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR = - "org.springframework.restdocs.defaultOperationResponsePreprocessor"; - + public static final String ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR = "org.springframework.restdocs.defaultOperationResponsePreprocessor"; private final String identifier; @@ -198,8 +197,10 @@ public final class RestDocumentationGenerator { */ public void handle(REQ request, RESP response, Map configuration) { Map attributes = new HashMap<>(configuration); - OperationRequest operationRequest = preprocessRequest(request, attributes); - OperationResponse operationResponse = preprocessResponse(response, attributes); + OperationRequest operationRequest = preprocessRequest( + this.requestConverter.convert(request), attributes); + OperationResponse operationResponse = preprocessResponse( + this.responseConverter.convert(response), attributes); Operation operation = new StandardOperation(this.identifier, operationRequest, operationResponse, attributes); try { @@ -239,40 +240,45 @@ public final class RestDocumentationGenerator { return combinedSnippets; } - private OperationRequest preprocessRequest(REQ request, Map configuration) { - List requestPreprocessors = getRequestPreprocessors(configuration); - OperationRequest operationRequest = this.requestConverter.convert(request); + private OperationRequest preprocessRequest(OperationRequest request, + Map configuration) { + List requestPreprocessors = getRequestPreprocessors( + configuration); for (OperationRequestPreprocessor preprocessor : requestPreprocessors) { - operationRequest = preprocessor.preprocess(operationRequest); + request = preprocessor.preprocess(request); } - return operationRequest; + return request; } - private List getRequestPreprocessors(Map configuration) { - List preprocessors = new ArrayList<>(2); - preprocessors.add(this.requestPreprocessor); - OperationRequestPreprocessor defaultRequestPreprocessor = (OperationRequestPreprocessor) configuration.get( - RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR); - if (defaultRequestPreprocessor != null) { - preprocessors.add(defaultRequestPreprocessor); - } - return preprocessors; + private List getRequestPreprocessors( + Map configuration) { + return getPreprocessors(this.requestPreprocessor, + RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR, + configuration); } - private OperationResponse preprocessResponse(RESP response, Map configuration) { - List responsePreprocessors = getResponsePreprocessors(configuration); - OperationResponse operationResponse = this.responseConverter.convert(response); - for (OperationResponsePreprocessor preprocessor : responsePreprocessors) { - operationResponse = preprocessor.preprocess(operationResponse); + private OperationResponse preprocessResponse(OperationResponse response, + Map configuration) { + for (OperationResponsePreprocessor preprocessor : getResponsePreprocessors( + configuration)) { + response = preprocessor.preprocess(response); } - return operationResponse; + return response; } - private List getResponsePreprocessors(Map configuration) { - List preprocessors = new ArrayList<>(2); - preprocessors.add(this.responsePreprocessor); - OperationResponsePreprocessor defaultResponsePreprocessor = (OperationResponsePreprocessor) configuration.get( - RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR); + private List getResponsePreprocessors( + Map configuration) { + return getPreprocessors(this.responsePreprocessor, + RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR, + configuration); + } + + @SuppressWarnings("unchecked") + private List getPreprocessors(T preprocessor, String preprocessorAttribute, + Map configuration) { + List preprocessors = new ArrayList<>(2); + preprocessors.add(preprocessor); + T defaultResponsePreprocessor = (T) configuration.get(preprocessorAttribute); if (defaultResponsePreprocessor != null) { preprocessors.add(defaultResponsePreprocessor); } diff --git a/spring-restdocs-core/src/test/java/org/springframework/restdocs/RestDocumentationGeneratorTests.java b/spring-restdocs-core/src/test/java/org/springframework/restdocs/RestDocumentationGeneratorTests.java index f06700a2..103a7960 100644 --- a/spring-restdocs-core/src/test/java/org/springframework/restdocs/RestDocumentationGeneratorTests.java +++ b/spring-restdocs-core/src/test/java/org/springframework/restdocs/RestDocumentationGeneratorTests.java @@ -78,8 +78,11 @@ public class RestDocumentationGeneratorTests { private final Snippet snippet = mock(Snippet.class); - private final OperationPreprocessor requestPreprocessor = mock(OperationPreprocessor.class); - private final OperationPreprocessor responsePreprocessor = mock(OperationPreprocessor.class); + private final OperationPreprocessor requestPreprocessor = mock( + OperationPreprocessor.class); + + private final OperationPreprocessor responsePreprocessor = mock( + OperationPreprocessor.class); @Test public void basicHandling() throws IOException { @@ -122,19 +125,23 @@ public class RestDocumentationGeneratorTests { HashMap configuration = new HashMap<>(); OperationPreprocessor defaultPreprocessor1 = mock(OperationPreprocessor.class); OperationPreprocessor defaultPreprocessor2 = mock(OperationPreprocessor.class); - configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR, - Preprocessors.preprocessRequest(defaultPreprocessor1, defaultPreprocessor2)); + configuration.put( + RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR, + Preprocessors.preprocessRequest(defaultPreprocessor1, + defaultPreprocessor2)); OperationRequest first = createRequest(); OperationRequest second = createRequest(); OperationRequest third = createRequest(); - given(this.requestPreprocessor.preprocess(this.operationRequest)).willReturn(first); + given(this.requestPreprocessor.preprocess(this.operationRequest)) + .willReturn(first); given(defaultPreprocessor1.preprocess(first)).willReturn(second); given(defaultPreprocessor2.preprocess(second)).willReturn(third); new RestDocumentationGenerator<>("id", this.requestConverter, - this.responseConverter, Preprocessors.preprocessRequest(this.requestPreprocessor), this.snippet) - .handle(this.request, this.response, configuration); - - verifySnippetInvocation(this.snippet, third, this.operationResponse, configuration, 1); + this.responseConverter, + Preprocessors.preprocessRequest(this.requestPreprocessor), this.snippet) + .handle(this.request, this.response, configuration); + verifySnippetInvocation(this.snippet, third, this.operationResponse, + configuration, 1); } @Test @@ -146,49 +153,24 @@ public class RestDocumentationGeneratorTests { HashMap configuration = new HashMap<>(); OperationPreprocessor defaultPreprocessor1 = mock(OperationPreprocessor.class); OperationPreprocessor defaultPreprocessor2 = mock(OperationPreprocessor.class); - configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR, - Preprocessors.preprocessResponse(defaultPreprocessor1, defaultPreprocessor2)); + configuration.put( + RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR, + Preprocessors.preprocessResponse(defaultPreprocessor1, + defaultPreprocessor2)); OperationResponse first = createResponse(); OperationResponse second = createResponse(); - OperationResponse third = new OperationResponseFactory().createFrom(this.operationResponse, new HttpHeaders()); - given(this.responsePreprocessor.preprocess(this.operationResponse)).willReturn(first); + OperationResponse third = new OperationResponseFactory() + .createFrom(this.operationResponse, new HttpHeaders()); + given(this.responsePreprocessor.preprocess(this.operationResponse)) + .willReturn(first); given(defaultPreprocessor1.preprocess(first)).willReturn(second); given(defaultPreprocessor2.preprocess(second)).willReturn(third); new RestDocumentationGenerator<>("id", this.requestConverter, - this.responseConverter, Preprocessors.preprocessResponse(this.responsePreprocessor), this.snippet) - .handle(this.request, this.response, configuration); - - verifySnippetInvocation(this.snippet, this.operationRequest, third, configuration, 1); - } - - @Test - public void defaultOperationPreprocessorsAreCalled() throws IOException { - given(this.requestConverter.convert(this.request)) - .willReturn(this.operationRequest); - given(this.responseConverter.convert(this.response)) - .willReturn(this.operationResponse); - HashMap configuration = new HashMap<>(); - OperationPreprocessor requestPreprocessor1 = mock(OperationPreprocessor.class); - configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR, - Preprocessors.preprocessRequest(requestPreprocessor1)); - OperationRequest firstRequest = createRequest(); - OperationRequest secondRequest = createRequest(); - given(this.requestPreprocessor.preprocess(this.operationRequest)).willReturn(firstRequest); - given(requestPreprocessor1.preprocess(firstRequest)).willReturn(secondRequest); - - OperationPreprocessor responsePreprocessor1 = mock(OperationPreprocessor.class); - configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR, - Preprocessors.preprocessResponse(responsePreprocessor1)); - OperationResponse firstResponse = createResponse(); - OperationResponse secondResponse = createResponse(); - given(this.responsePreprocessor.preprocess(this.operationResponse)).willReturn(firstResponse); - given(responsePreprocessor1.preprocess(firstResponse)).willReturn(secondResponse); - new RestDocumentationGenerator<>("id", this.requestConverter, - this.responseConverter, Preprocessors.preprocessRequest(this.requestPreprocessor), + this.responseConverter, Preprocessors.preprocessResponse(this.responsePreprocessor), this.snippet) - .handle(this.request, this.response, configuration); - - verifySnippetInvocation(this.snippet, secondRequest, secondResponse, configuration, 1); + .handle(this.request, this.response, configuration); + verifySnippetInvocation(this.snippet, this.operationRequest, third, configuration, + 1); } @Test @@ -225,11 +207,12 @@ public class RestDocumentationGeneratorTests { private void verifySnippetInvocation(Snippet snippet, Map attributes, int times) throws IOException { - verifySnippetInvocation(snippet, this.operationRequest, this.operationResponse, attributes, times); + verifySnippetInvocation(snippet, this.operationRequest, this.operationResponse, + attributes, times); } - private void verifySnippetInvocation(Snippet snippet, OperationRequest operationRequest, - OperationResponse operationResponse, + private void verifySnippetInvocation(Snippet snippet, + OperationRequest operationRequest, OperationResponse operationResponse, Map attributes, int times) throws IOException { ArgumentCaptor operation = ArgumentCaptor.forClass(Operation.class); verify(snippet, Mockito.times(times)).document(operation.capture()); @@ -239,13 +222,12 @@ public class RestDocumentationGeneratorTests { } private static OperationRequest createRequest() { - return new OperationRequestFactory() - .create(URI.create("http://localhost:8080"), null, null, new HttpHeaders(), null, null); + return new OperationRequestFactory().create(URI.create("http://localhost:8080"), + null, null, new HttpHeaders(), null, null); } private static OperationResponse createResponse() { - return new OperationResponseFactory() - .create(null, null, null); + return new OperationResponseFactory().create(null, null, null); } } 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 index a56c5646..f8f6880c 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2014-2016 the original author or authors. + * Copyright 2014-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. @@ -16,6 +16,8 @@ package org.springframework.restdocs.config; +import java.net.URI; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,6 +25,9 @@ import java.util.Map; import org.hamcrest.Matchers; import org.junit.Test; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; import org.springframework.restdocs.ManualRestDocumentation; import org.springframework.restdocs.RestDocumentationContext; import org.springframework.restdocs.cli.CliDocumentation; @@ -31,6 +36,10 @@ import org.springframework.restdocs.cli.HttpieRequestSnippet; import org.springframework.restdocs.generate.RestDocumentationGenerator; import org.springframework.restdocs.http.HttpRequestSnippet; import org.springframework.restdocs.http.HttpResponseSnippet; +import org.springframework.restdocs.operation.OperationRequest; +import org.springframework.restdocs.operation.OperationRequestFactory; +import org.springframework.restdocs.operation.OperationResponse; +import org.springframework.restdocs.operation.OperationResponseFactory; import org.springframework.restdocs.operation.preprocess.OperationRequestPreprocessor; import org.springframework.restdocs.operation.preprocess.OperationResponsePreprocessor; import org.springframework.restdocs.operation.preprocess.Preprocessors; @@ -94,12 +103,12 @@ public class RestDocumentationConfigurerTests { assertThat(snippetConfiguration.getTemplateFormat(), is(equalTo(TemplateFormats.asciidoctor()))); - OperationRequestPreprocessor defaultOperationRequestPreprocessor = (OperationRequestPreprocessor) - configuration.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR); + OperationRequestPreprocessor defaultOperationRequestPreprocessor = (OperationRequestPreprocessor) configuration + .get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR); assertThat(defaultOperationRequestPreprocessor, is(nullValue())); - OperationResponsePreprocessor defaultOperationResponsePreprocessor = (OperationResponsePreprocessor) - configuration.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR); + OperationResponsePreprocessor defaultOperationResponsePreprocessor = (OperationResponsePreprocessor) configuration + .get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR); assertThat(defaultOperationResponsePreprocessor, is(nullValue())); } @@ -217,26 +226,35 @@ public class RestDocumentationConfigurerTests { public void customDefaultOperationRequestPreprocessor() { Map configuration = new HashMap<>(); this.configurer.operationPreprocessors() - .withDefaultRequestPreprocessors(Preprocessors.prettyPrint(), Preprocessors.removeHeaders("Foo")) + .withRequestDefaults(Preprocessors.prettyPrint(), + Preprocessors.removeHeaders("Foo")) .apply(configuration, createContext()); - assertThat(configuration, - hasEntry( - equalTo(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR), - instanceOf(OperationRequestPreprocessor.class))); - //TODO how can we actually test that the preprocessors that we set are actually there? + OperationRequestPreprocessor preprocessor = (OperationRequestPreprocessor) configuration + .get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR); + HttpHeaders headers = new HttpHeaders(); + headers.add("Foo", "value"); + OperationRequest request = new OperationRequestFactory().create( + URI.create("http://localhost:8080"), HttpMethod.GET, null, headers, null, + Collections.emptyList()); + assertThat(preprocessor.preprocess(request).getHeaders().get("Foo"), + is(nullValue())); } @Test public void customDefaultOperationResponsePreprocessor() { Map configuration = new HashMap<>(); this.configurer.operationPreprocessors() - .withDefaultResponsePreprocessors(Preprocessors.prettyPrint(), Preprocessors.removeHeaders("Foo")) + .withResponseDefaults(Preprocessors.prettyPrint(), + Preprocessors.removeHeaders("Foo")) .apply(configuration, createContext()); - assertThat(configuration, - hasEntry( - equalTo(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR), - instanceOf(OperationResponsePreprocessor.class))); - //TODO same as for the customDefaultOperationRequestPreprocessor + OperationResponsePreprocessor preprocessor = (OperationResponsePreprocessor) configuration + .get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR); + HttpHeaders headers = new HttpHeaders(); + headers.add("Foo", "value"); + OperationResponse response = new OperationResponseFactory().create(HttpStatus.OK, + headers, null); + assertThat(preprocessor.preprocess(response).getHeaders().get("Foo"), + is(nullValue())); } private RestDocumentationContext createContext() { @@ -248,14 +266,13 @@ public class RestDocumentationConfigurerTests { } private static final class TestRestDocumentationConfigurer extends - RestDocumentationConfigurer { + RestDocumentationConfigurer { private final TestSnippetConfigurer snippetConfigurer = new TestSnippetConfigurer( this); - private final TestOperationPreprocessorsConfigurer operationPreprocessorsConfigurer = - new TestOperationPreprocessorsConfigurer(this); + private final TestOperationPreprocessorsConfigurer operationPreprocessorsConfigurer = new TestOperationPreprocessorsConfigurer( + this); @Override public TestSnippetConfigurer snippets() { @@ -280,7 +297,8 @@ public class RestDocumentationConfigurerTests { private static final class TestOperationPreprocessorsConfigurer extends OperationPreprocessorsConfigurer { - protected TestOperationPreprocessorsConfigurer(TestRestDocumentationConfigurer parent) { + protected TestOperationPreprocessorsConfigurer( + TestRestDocumentationConfigurer parent) { super(parent); } } diff --git a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcOperationPreprocessorsConfigurer.java b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcOperationPreprocessorsConfigurer.java index d41df9ed..0e5662f7 100644 --- a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcOperationPreprocessorsConfigurer.java +++ b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/MockMvcOperationPreprocessorsConfigurer.java @@ -46,4 +46,5 @@ public final class MockMvcOperationPreprocessorsConfigurer extends ConfigurableMockMvcBuilder builder, WebApplicationContext context) { return and().beforeMockMvcCreated(builder, context); } + } 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 5606ba20..52f0231e 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 @@ -37,8 +37,7 @@ import org.springframework.web.context.WebApplicationContext; * @since 1.1.0 */ public final class MockMvcRestDocumentationConfigurer extends - RestDocumentationConfigurer + RestDocumentationConfigurer implements MockMvcConfigurer { private final MockMvcSnippetConfigurer snippetConfigurer = new MockMvcSnippetConfigurer( @@ -46,8 +45,8 @@ public final class MockMvcRestDocumentationConfigurer extends private final UriConfigurer uriConfigurer = new UriConfigurer(this); - private final MockMvcOperationPreprocessorsConfigurer operationPreprocessorsConfigurer = - new MockMvcOperationPreprocessorsConfigurer(this); + private final MockMvcOperationPreprocessorsConfigurer operationPreprocessorsConfigurer = new MockMvcOperationPreprocessorsConfigurer( + this); private final RestDocumentationContextProvider contextManager; diff --git a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationResultHandler.java b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationResultHandler.java index 5f255440..44904365 100644 --- a/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationResultHandler.java +++ b/spring-restdocs-mockmvc/src/main/java/org/springframework/restdocs/mockmvc/RestDocumentationResultHandler.java @@ -82,9 +82,6 @@ public class RestDocumentationResultHandler implements ResultHandler { .getAttribute(ATTRIBUTE_NAME_CONFIGURATION)); configuration.remove( RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS); - // TODO Do we need to remove the preprocessors here as well? - // I think that there is no test that evaluates this here. And the Javadoc does not reflect the - // behaviour getDelegate().handle(result.getRequest(), result.getResponse(), configuration); } diff --git a/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationIntegrationTests.java b/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationIntegrationTests.java index 0a5979b1..f76911ff 100644 --- a/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationIntegrationTests.java +++ b/spring-restdocs-mockmvc/src/test/java/org/springframework/restdocs/mockmvc/MockMvcRestDocumentationIntegrationTests.java @@ -500,19 +500,17 @@ public class MockMvcRestDocumentationIntegrationTests { MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context) .apply(documentationConfiguration(this.restDocumentation) .operationPreprocessors() - .withDefaultRequestPreprocessors(prettyPrint(), + .withRequestDefaults(prettyPrint(), removeHeaders("a", HttpHeaders.HOST, HttpHeaders.CONTENT_LENGTH), replacePattern(pattern, "\"<>\""))) .build(); - MvcResult result = mockMvc .perform(get("/").header("a", "alpha").header("b", "bravo") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON).content("{\"a\":\"alpha\"}")) - .andDo(document("default-preprocessed-request")) - .andReturn(); + .andDo(document("default-preprocessed-request")).andReturn(); HttpRequestMatcher preprocessedRequest = httpRequest(asciidoctor(), RequestMethod.GET, "/"); @@ -573,12 +571,11 @@ public class MockMvcRestDocumentationIntegrationTests { Pattern pattern = Pattern.compile("(\"alpha\")"); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context) .apply(documentationConfiguration(this.restDocumentation) - .operationPreprocessors() - .withDefaultResponsePreprocessors(prettyPrint(), maskLinks(), removeHeaders("a"), + .operationPreprocessors().withResponseDefaults( + prettyPrint(), maskLinks(), removeHeaders("a"), replacePattern(pattern, "\"<>\""))) .build(); - mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andDo(document("default-preprocessed-response")); diff --git a/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredOperationPreprocessorsConfigurer.java b/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredOperationPreprocessorsConfigurer.java index db6cffcd..af8850a5 100644 --- a/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredOperationPreprocessorsConfigurer.java +++ b/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredOperationPreprocessorsConfigurer.java @@ -25,18 +25,18 @@ import io.restassured.specification.FilterableResponseSpecification; import org.springframework.restdocs.config.OperationPreprocessorsConfigurer; /** - * A configurer that can be used to configure the operation preprocessors when - * using REST Assured 3. + * A configurer that can be used to configure the operation preprocessors when using REST + * Assured 3. * * @author Filip Hrisafov * @since 2.0.0 */ public final class RestAssuredOperationPreprocessorsConfigurer extends - OperationPreprocessorsConfigurer + OperationPreprocessorsConfigurer implements Filter { - RestAssuredOperationPreprocessorsConfigurer(RestAssuredRestDocumentationConfigurer parent) { + RestAssuredOperationPreprocessorsConfigurer( + RestAssuredRestDocumentationConfigurer parent) { super(parent); } diff --git a/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurer.java b/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurer.java index b8c71fbf..807b7057 100644 --- a/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurer.java +++ b/spring-restdocs-restassured/src/main/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurer.java @@ -37,15 +37,14 @@ import org.springframework.restdocs.config.RestDocumentationConfigurer; * @since 1.2.0 */ public final class RestAssuredRestDocumentationConfigurer extends - RestDocumentationConfigurer + RestDocumentationConfigurer implements Filter { private final RestAssuredSnippetConfigurer snippetConfigurer = new RestAssuredSnippetConfigurer( this); - private final RestAssuredOperationPreprocessorsConfigurer operationPreprocessorsConfigurer = - new RestAssuredOperationPreprocessorsConfigurer(this); + private final RestAssuredOperationPreprocessorsConfigurer operationPreprocessorsConfigurer = new RestAssuredOperationPreprocessorsConfigurer( + this); private final RestDocumentationContextProvider contextProvider; diff --git a/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurerTests.java b/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurerTests.java index 0356cea3..250da411 100644 --- a/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurerTests.java +++ b/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationConfigurerTests.java @@ -72,10 +72,9 @@ public class RestAssuredRestDocumentationConfigurerTests { @Test public void configurationIsAddedToTheContext() { - this.configurer - .operationPreprocessors() - .withDefaultRequestPreprocessors(Preprocessors.prettyPrint()) - .withDefaultResponsePreprocessors(Preprocessors.removeHeaders("Foo")) + this.configurer.operationPreprocessors() + .withRequestDefaults(Preprocessors.prettyPrint()) + .withResponseDefaults(Preprocessors.removeHeaders("Foo")) .filter(this.requestSpec, this.responseSpec, this.filterContext); @SuppressWarnings("rawtypes") ArgumentCaptor configurationCaptor = ArgumentCaptor.forClass(Map.class); diff --git a/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationIntegrationTests.java b/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationIntegrationTests.java index e9370351..0b108bad 100644 --- a/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationIntegrationTests.java +++ b/spring-restdocs-restassured/src/test/java/org/springframework/restdocs/restassured3/RestAssuredRestDocumentationIntegrationTests.java @@ -333,22 +333,24 @@ public class RestAssuredRestDocumentationIntegrationTests { Pattern pattern = Pattern.compile("(\"alpha\")"); given().port(tomcat.getPort()) .filter(documentationConfiguration(this.restDocumentation) - .operationPreprocessors().withDefaultRequestPreprocessors(prettyPrint(), - replacePattern(pattern, "\"<>\""), + .operationPreprocessors().withRequestDefaults( + prettyPrint(), replacePattern(pattern, "\"<>\""), modifyUris().removePort(), removeHeaders("a", HttpHeaders.CONTENT_LENGTH))) .header("a", "alpha").header("b", "bravo").contentType("application/json") .accept("application/json").body("{\"a\":\"alpha\"}") - .filter(document("default-preprocessed-request")) - .get("/").then().statusCode(200); + .filter(document("default-preprocessed-request")).get("/").then() + .statusCode(200); String prettyPrinted = String.format("{%n \"a\" : \"<>\"%n}"); assertThat( new File( "build/generated-snippets/default-preprocessed-request/http-request.adoc"), is(snippet(asciidoctor()) - .withContents(httpRequest(asciidoctor(), RequestMethod.GET, "/") - .header("b", "bravo") - .header("Accept", MediaType.APPLICATION_JSON_VALUE) + .withContents( + httpRequest(asciidoctor(), RequestMethod.GET, "/") + .header("b", "bravo") + .header("Accept", + MediaType.APPLICATION_JSON_VALUE) .header("Content-Type", "application/json; charset=UTF-8") .header("Host", "localhost").content(prettyPrinted)))); } @@ -384,12 +386,14 @@ public class RestAssuredRestDocumentationIntegrationTests { Pattern pattern = Pattern.compile("(\"alpha\")"); given().port(tomcat.getPort()) .filter(documentationConfiguration(this.restDocumentation) - .operationPreprocessors().withDefaultResponsePreprocessors(prettyPrint(), maskLinks(), + .operationPreprocessors() + .withResponseDefaults(prettyPrint(), maskLinks(), removeHeaders("a", "Transfer-Encoding", "Date", "Server"), - replacePattern(pattern, "\"<>\""), modifyUris() - .scheme("https").host("api.example.com").removePort())) - .filter(document("default-preprocessed-response")) - .get("/").then().statusCode(200); + replacePattern(pattern, "\"<>\""), + modifyUris().scheme("https").host("api.example.com") + .removePort())) + .filter(document("default-preprocessed-response")).get("/").then() + .statusCode(200); String prettyPrinted = String.format("{%n \"a\" : \"<>\",%n \"links\" : " + "[ {%n \"rel\" : \"rel\",%n \"href\" : \"...\"%n } ]%n}"); assertThat(