Merge branch '1.0.x'

This commit is contained in:
Andy Wilkinson
2016-02-15 12:25:49 +00:00
121 changed files with 1672 additions and 1529 deletions

View File

@@ -73,14 +73,13 @@ class MockMvcRequestConverter implements RequestConverter<MockHttpServletRequest
&& "GET".equals(mockRequest.getMethod())) {
queryString = parameters.toQueryString();
}
return new OperationRequestFactory()
.create(URI
.create(getRequestUri(mockRequest)
+ (StringUtils.hasText(queryString) ? "?"
+ queryString : "")),
HttpMethod.valueOf(mockRequest.getMethod()), FileCopyUtils
.copyToByteArray(mockRequest.getInputStream()),
headers, parameters, parts);
return new OperationRequestFactory().create(
URI.create(
getRequestUri(mockRequest) + (StringUtils.hasText(queryString)
? "?" + queryString : "")),
HttpMethod.valueOf(mockRequest.getMethod()),
FileCopyUtils.copyToByteArray(mockRequest.getInputStream()), headers,
parameters, parts);
}
catch (Exception ex) {
throw new ConversionException(ex);
@@ -92,7 +91,8 @@ class MockMvcRequestConverter implements RequestConverter<MockHttpServletRequest
List<OperationRequestPart> parts = new ArrayList<>();
parts.addAll(extractServletRequestParts(servletRequest));
if (servletRequest instanceof MockMultipartHttpServletRequest) {
parts.addAll(extractMultipartRequestParts((MockMultipartHttpServletRequest) servletRequest));
parts.addAll(extractMultipartRequestParts(
(MockMultipartHttpServletRequest) servletRequest));
}
return parts;
}
@@ -106,24 +106,24 @@ class MockMvcRequestConverter implements RequestConverter<MockHttpServletRequest
return parts;
}
private OperationRequestPart createOperationRequestPart(Part part) throws IOException {
private OperationRequestPart createOperationRequestPart(Part part)
throws IOException {
HttpHeaders partHeaders = extractHeaders(part);
List<String> contentTypeHeader = partHeaders.get(HttpHeaders.CONTENT_TYPE);
if (part.getContentType() != null && contentTypeHeader == null) {
partHeaders.setContentType(MediaType.parseMediaType(part.getContentType()));
}
return new OperationRequestPartFactory()
.create(part.getName(),
StringUtils.hasText(part.getSubmittedFileName()) ? part
.getSubmittedFileName() : null, FileCopyUtils
.copyToByteArray(part.getInputStream()), partHeaders);
return new OperationRequestPartFactory().create(part.getName(),
StringUtils.hasText(part.getSubmittedFileName())
? part.getSubmittedFileName() : null,
FileCopyUtils.copyToByteArray(part.getInputStream()), partHeaders);
}
private List<OperationRequestPart> extractMultipartRequestParts(
MockMultipartHttpServletRequest multipartRequest) throws IOException {
List<OperationRequestPart> parts = new ArrayList<>();
for (Entry<String, List<MultipartFile>> entry : multipartRequest
.getMultiFileMap().entrySet()) {
for (Entry<String, List<MultipartFile>> entry : multipartRequest.getMultiFileMap()
.entrySet()) {
for (MultipartFile file : entry.getValue()) {
parts.add(createOperationRequestPart(file));
}
@@ -137,8 +137,9 @@ class MockMvcRequestConverter implements RequestConverter<MockHttpServletRequest
if (StringUtils.hasText(file.getContentType())) {
partHeaders.setContentType(MediaType.parseMediaType(file.getContentType()));
}
return new OperationRequestPartFactory().create(file.getName(), StringUtils
.hasText(file.getOriginalFilename()) ? file.getOriginalFilename() : null,
return new OperationRequestPartFactory().create(file.getName(),
StringUtils.hasText(file.getOriginalFilename())
? file.getOriginalFilename() : null,
file.getBytes(), partHeaders);
}
@@ -173,8 +174,10 @@ class MockMvcRequestConverter implements RequestConverter<MockHttpServletRequest
}
private boolean isNonStandardPort(MockHttpServletRequest request) {
return (SCHEME_HTTP.equals(request.getScheme()) && request.getServerPort() != STANDARD_PORT_HTTP)
|| (SCHEME_HTTPS.equals(request.getScheme()) && request.getServerPort() != STANDARD_PORT_HTTPS);
return (SCHEME_HTTP.equals(request.getScheme())
&& request.getServerPort() != STANDARD_PORT_HTTP)
|| (SCHEME_HTTPS.equals(request.getScheme())
&& request.getServerPort() != STANDARD_PORT_HTTPS);
}
private String getRequestUri(MockHttpServletRequest request) {

View File

@@ -56,7 +56,8 @@ public abstract class MockMvcRestDocumentation {
@Deprecated
public static MockMvcRestDocumentationConfigurer documentationConfiguration(
RestDocumentation restDocumentation) {
return documentationConfiguration((RestDocumentationContextProvider) restDocumentation);
return documentationConfiguration(
(RestDocumentationContextProvider) restDocumentation);
}
/**
@@ -102,9 +103,9 @@ public abstract class MockMvcRestDocumentation {
*/
public static RestDocumentationResultHandler document(String identifier,
OperationRequestPreprocessor requestPreprocessor, Snippet... snippets) {
return new RestDocumentationResultHandler(new RestDocumentationGenerator<>(
identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER, requestPreprocessor,
snippets));
return new RestDocumentationResultHandler(
new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER,
RESPONSE_CONVERTER, requestPreprocessor, snippets));
}
/**
@@ -121,9 +122,9 @@ public abstract class MockMvcRestDocumentation {
*/
public static RestDocumentationResultHandler document(String identifier,
OperationResponsePreprocessor responsePreprocessor, Snippet... snippets) {
return new RestDocumentationResultHandler(new RestDocumentationGenerator<>(
identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER, responsePreprocessor,
snippets));
return new RestDocumentationResultHandler(
new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER,
RESPONSE_CONVERTER, responsePreprocessor, snippets));
}
/**

View File

@@ -34,8 +34,7 @@ import org.springframework.web.context.WebApplicationContext;
*
* @author Andy Wilkinson
*/
public class MockMvcRestDocumentationConfigurer
extends
public class MockMvcRestDocumentationConfigurer extends
RestDocumentationConfigurer<MockMvcSnippetConfigurer, MockMvcRestDocumentationConfigurer>
implements MockMvcConfigurer {
@@ -76,8 +75,8 @@ public class MockMvcRestDocumentationConfigurer
return this.snippetConfigurer;
}
private final class ConfigurerApplyingRequestPostProcessor implements
RequestPostProcessor {
private final class ConfigurerApplyingRequestPostProcessor
implements RequestPostProcessor {
private final RestDocumentationContextProvider contextManager;
@@ -91,9 +90,9 @@ public class MockMvcRestDocumentationConfigurer
RestDocumentationContext context = this.contextManager.beforeOperation();
Map<String, Object> configuration = new HashMap<>();
configuration.put(MockHttpServletRequest.class.getName(), request);
configuration
.put(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
request.getAttribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE));
configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
request.getAttribute(
RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE));
configuration.put(RestDocumentationContext.class.getName(), context);
request.setAttribute(
RestDocumentationResultHandler.ATTRIBUTE_NAME_CONFIGURATION,

View File

@@ -249,8 +249,8 @@ public abstract class RestDocumentationRequestBuilders {
public static MockMultipartHttpServletRequestBuilder fileUpload(String urlTemplate,
Object... urlVariables) {
return (MockMultipartHttpServletRequestBuilder) MockMvcRequestBuilders
.fileUpload(urlTemplate, urlVariables).requestAttr(
RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
.fileUpload(urlTemplate, urlVariables)
.requestAttr(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
urlTemplate);
}

View File

@@ -31,9 +31,9 @@ import org.springframework.web.context.WebApplicationContext;
*
* @author Andy Wilkinson
*/
public class UriConfigurer extends
AbstractNestedConfigurer<MockMvcRestDocumentationConfigurer> implements
MockMvcConfigurer {
public class UriConfigurer
extends AbstractNestedConfigurer<MockMvcRestDocumentationConfigurer>
implements MockMvcConfigurer {
/**
* The default scheme for documented URIs.
@@ -103,7 +103,8 @@ public class UriConfigurer extends
}
@Override
public void apply(Map<String, Object> configuration, RestDocumentationContext context) {
public void apply(Map<String, Object> configuration,
RestDocumentationContext context) {
MockHttpServletRequest request = (MockHttpServletRequest) configuration
.get(MockHttpServletRequest.class.getName());
request.setScheme(this.scheme);

View File

@@ -18,4 +18,3 @@
* Core classes for using Spring REST Docs with Spring Test's MockMvc.
*/
package org.springframework.restdocs.mockmvc;

View File

@@ -23,6 +23,7 @@ import java.util.Arrays;
import javax.servlet.http.Part;
import org.junit.Test;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletRequest;
@@ -53,8 +54,8 @@ public class MockMvcRequestConverterTests {
@Test
public void httpRequest() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders
.get("/foo"));
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.get("/foo"));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
}
@@ -71,8 +72,8 @@ public class MockMvcRequestConverterTests {
@Test
public void requestWithContextPath() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders.get(
"/foo/bar").contextPath("/foo"));
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.get("/foo/bar").contextPath("/foo"));
assertThat(request.getUri(), is(URI.create("http://localhost/foo/bar")));
assertThat(request.getMethod(), is(HttpMethod.GET));
}
@@ -124,8 +125,8 @@ public class MockMvcRequestConverterTests {
@Test
public void getRequestWithQueryStringPopulatesParameters() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders
.get("/foo?a=alpha&b=bravo"));
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.get("/foo?a=alpha&b=bravo"));
assertThat(request.getUri(),
is(URI.create("http://localhost/foo?a=alpha&b=bravo")));
assertThat(request.getParameters().size(), is(2));
@@ -148,9 +149,9 @@ public class MockMvcRequestConverterTests {
@Test
public void mockMultipartFileUpload() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders
.fileUpload("/foo").file(
new MockMultipartFile("file", new byte[] { 1, 2, 3, 4 })));
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.fileUpload("/foo")
.file(new MockMultipartFile("file", new byte[] { 1, 2, 3, 4 })));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParts().size(), is(1));
@@ -164,10 +165,9 @@ public class MockMvcRequestConverterTests {
@Test
public void mockMultipartFileUploadWithContentType() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders
.fileUpload("/foo").file(
new MockMultipartFile("file", "original", "image/png",
new byte[] { 1, 2, 3, 4 })));
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.fileUpload("/foo").file(new MockMultipartFile(
"file", "original", "image/png", new byte[] { 1, 2, 3, 4 })));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParts().size(), is(1));
@@ -186,8 +186,8 @@ public class MockMvcRequestConverterTests {
given(mockPart.getHeaderNames()).willReturn(Arrays.asList("a", "b"));
given(mockPart.getHeaders("a")).willReturn(Arrays.asList("alpha"));
given(mockPart.getHeaders("b")).willReturn(Arrays.asList("bravo", "banana"));
given(mockPart.getInputStream()).willReturn(
new ByteArrayInputStream(new byte[] { 1, 2, 3, 4 }));
given(mockPart.getInputStream())
.willReturn(new ByteArrayInputStream(new byte[] { 1, 2, 3, 4 }));
given(mockPart.getName()).willReturn("part-name");
given(mockPart.getSubmittedFileName()).willReturn("submitted.txt");
mockRequest.addPart(mockPart);
@@ -210,8 +210,8 @@ public class MockMvcRequestConverterTests {
given(mockPart.getHeaderNames()).willReturn(Arrays.asList("a", "b"));
given(mockPart.getHeaders("a")).willReturn(Arrays.asList("alpha"));
given(mockPart.getHeaders("b")).willReturn(Arrays.asList("bravo", "banana"));
given(mockPart.getInputStream()).willReturn(
new ByteArrayInputStream(new byte[] { 1, 2, 3, 4 }));
given(mockPart.getInputStream())
.willReturn(new ByteArrayInputStream(new byte[] { 1, 2, 3, 4 }));
given(mockPart.getName()).willReturn("part-name");
given(mockPart.getSubmittedFileName()).willReturn("submitted.png");
given(mockPart.getContentType()).willReturn("image/png");

View File

@@ -20,6 +20,7 @@ import java.net.URI;
import org.junit.Rule;
import org.junit.Test;
import org.springframework.hateoas.mvc.BasicLinkBuilder;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.restdocs.JUnitRestDocumentation;
@@ -58,7 +59,7 @@ public class MockMvcRestDocumentationConfigurerTests {
public void customScheme() {
RequestPostProcessor postProcessor = new MockMvcRestDocumentationConfigurer(
this.restDocumentation).uris().withScheme("https")
.beforeMockMvcCreated(null, null);
.beforeMockMvcCreated(null, null);
postProcessor.postProcessRequest(this.request);
assertUriConfiguration("https", "localhost", 8080);
@@ -68,7 +69,7 @@ public class MockMvcRestDocumentationConfigurerTests {
public void customHost() {
RequestPostProcessor postProcessor = new MockMvcRestDocumentationConfigurer(
this.restDocumentation).uris().withHost("api.example.com")
.beforeMockMvcCreated(null, null);
.beforeMockMvcCreated(null, null);
postProcessor.postProcessRequest(this.request);
assertUriConfiguration("http", "api.example.com", 8080);
@@ -77,8 +78,8 @@ public class MockMvcRestDocumentationConfigurerTests {
@Test
public void customPort() {
RequestPostProcessor postProcessor = new MockMvcRestDocumentationConfigurer(
this.restDocumentation).uris().withPort(8081)
.beforeMockMvcCreated(null, null);
this.restDocumentation).uris().withPort(8081).beforeMockMvcCreated(null,
null);
postProcessor.postProcessRequest(this.request);
assertUriConfiguration("http", "localhost", 8081);
@@ -87,8 +88,8 @@ public class MockMvcRestDocumentationConfigurerTests {
@Test
public void noContentLengthHeaderWhenRequestHasNotContent() {
RequestPostProcessor postProcessor = new MockMvcRestDocumentationConfigurer(
this.restDocumentation).uris().withPort(8081)
.beforeMockMvcCreated(null, null);
this.restDocumentation).uris().withPort(8081).beforeMockMvcCreated(null,
null);
postProcessor.postProcessRequest(this.request);
assertThat(this.request.getHeader("Content-Length"), is(nullValue()));
}
@@ -97,8 +98,8 @@ public class MockMvcRestDocumentationConfigurerTests {
assertEquals(scheme, this.request.getScheme());
assertEquals(host, this.request.getServerName());
assertEquals(port, this.request.getServerPort());
RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(
this.request));
RequestContextHolder
.setRequestAttributes(new ServletRequestAttributes(this.request));
try {
URI uri = BasicLinkBuilder.linkToCurrentMapping().toUri();
assertEquals(scheme, uri.getScheme());

View File

@@ -29,6 +29,7 @@ import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -114,10 +115,10 @@ public class MockMvcRestDocumentationIntegrationTests {
@Test
public void basicSnippetGeneration() throws Exception {
MockMvc mockMvc = MockMvcBuilders
.webAppContextSetup(this.context)
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(new MockMvcRestDocumentationConfigurer(this.restDocumentation)
.snippets().withEncoding("UTF-8")).build();
.snippets().withEncoding("UTF-8"))
.build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("basic"));
@@ -127,15 +128,15 @@ public class MockMvcRestDocumentationIntegrationTests {
@Test
public void markdownSnippetGeneration() throws Exception {
MockMvc mockMvc = MockMvcBuilders
.webAppContextSetup(this.context)
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(new MockMvcRestDocumentationConfigurer(this.restDocumentation)
.snippets().withEncoding("UTF-8").withTemplateFormat(markdown())).build();
.snippets().withEncoding("UTF-8").withTemplateFormat(markdown()))
.build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("basic-markdown"));
assertExpectedSnippetFilesExist(new File(
"build/generated-snippets/basic-markdown"), "http-request.md",
assertExpectedSnippetFilesExist(
new File("build/generated-snippets/basic-markdown"), "http-request.md",
"http-response.md", "curl-request.md");
}
@@ -149,10 +150,9 @@ public class MockMvcRestDocumentationIntegrationTests {
assertThat(
new File(
"build/generated-snippets/curl-snippet-with-content/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(
codeBlock(asciidoctor(), "bash").content(
"$ curl " + "'http://localhost:8080/' -i -X POST "
+ "-H 'Accept: application/json' -d 'content'"))));
is(snippet(asciidoctor()).withContents(codeBlock(asciidoctor(), "bash")
.content("$ curl " + "'http://localhost:8080/' -i -X POST "
+ "-H 'Accept: application/json' -d 'content'"))));
}
@Test
@@ -160,18 +160,16 @@ public class MockMvcRestDocumentationIntegrationTests {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(
post("/?foo=bar").param("foo", "bar").param("a", "alpha")
.accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
mockMvc.perform(post("/?foo=bar").param("foo", "bar").param("a", "alpha")
.accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
.andDo(document("curl-snippet-with-query-string"));
assertThat(
new File(
"build/generated-snippets/curl-snippet-with-query-string/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(
codeBlock(asciidoctor(), "bash").content(
"$ curl "
+ "'http://localhost:8080/?foo=bar' -i -X POST "
+ "-H 'Accept: application/json' -d 'a=alpha'"))));
is(snippet(asciidoctor())
.withContents(codeBlock(asciidoctor(), "bash").content("$ curl "
+ "'http://localhost:8080/?foo=bar' -i -X POST "
+ "-H 'Accept: application/json' -d 'a=alpha'"))));
}
@Test
@@ -180,8 +178,7 @@ public class MockMvcRestDocumentationIntegrationTests {
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("links",
.andExpect(status().isOk()).andDo(document("links",
links(linkWithRel("rel").description("The description"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
@@ -195,9 +192,8 @@ public class MockMvcRestDocumentationIntegrationTests {
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("{foo}", "/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("links", pathParameters(parameterWithName("foo")
.description("The description"))));
.andExpect(status().isOk()).andDo(document("links", pathParameters(
parameterWithName("foo").description("The description"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
@@ -210,9 +206,8 @@ public class MockMvcRestDocumentationIntegrationTests {
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/").param("foo", "bar").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("links", requestParameters(parameterWithName("foo")
.description("The description"))));
.andExpect(status().isOk()).andDo(document("links", requestParameters(
parameterWithName("foo").description("The description"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
@@ -224,12 +219,10 @@ public class MockMvcRestDocumentationIntegrationTests {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(
get("/").param("foo", "bar").content("{\"a\":\"alpha\"}")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("links",
requestFields(fieldWithPath("a").description("The description"))));
mockMvc.perform(get("/").param("foo", "bar").content("{\"a\":\"alpha\"}")
.accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
.andDo(document("links", requestFields(
fieldWithPath("a").description("The description"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
@@ -243,12 +236,10 @@ public class MockMvcRestDocumentationIntegrationTests {
mockMvc.perform(get("/").param("foo", "bar").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document(
"links",
responseFields(
fieldWithPath("a").description("The description"),
fieldWithPath("links").description(
"Links to other resources"))));
.andDo(document("links",
responseFields(fieldWithPath("a")
.description("The description"),
fieldWithPath("links").description("Links to other resources"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
@@ -262,8 +253,8 @@ public class MockMvcRestDocumentationIntegrationTests {
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("{method-name}"));
assertExpectedSnippetFilesExist(new File(
"build/generated-snippets/parameterized-output-directory"),
assertExpectedSnippetFilesExist(
new File("build/generated-snippets/parameterized-output-directory"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc");
}
@@ -273,20 +264,20 @@ public class MockMvcRestDocumentationIntegrationTests {
.apply(documentationConfiguration(this.restDocumentation))
.alwaysDo(document("{method-name}-{step}")).build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)).andExpect(
status().isOk());
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
assertExpectedSnippetFilesExist(
new File("build/generated-snippets/multi-step-1/"), "http-request.adoc",
"http-response.adoc", "curl-request.adoc");
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)).andExpect(
status().isOk());
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
assertExpectedSnippetFilesExist(
new File("build/generated-snippets/multi-step-2/"), "http-request.adoc",
"http-response.adoc", "curl-request.adoc");
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)).andExpect(
status().isOk());
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk());
assertExpectedSnippetFilesExist(
new File("build/generated-snippets/multi-step-3/"), "http-request.adoc",
"http-response.adoc", "curl-request.adoc");
@@ -299,36 +290,34 @@ public class MockMvcRestDocumentationIntegrationTests {
Pattern pattern = Pattern.compile("(\"alpha\")");
mockMvc.perform(
get("/").header("a", "alpha").header("b", "bravo")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON).content("{\"a\":\"alpha\"}"))
.andExpect(status().isOk())
.andDo(document("original-request"))
.andDo(document(
"preprocessed-request",
preprocessRequest(
prettyPrint(),
mockMvc.perform(get("/").header("a", "alpha").header("b", "bravo")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON).content("{\"a\":\"alpha\"}"))
.andExpect(status().isOk()).andDo(document("original-request"))
.andDo(document("preprocessed-request",
preprocessRequest(prettyPrint(),
removeHeaders("a", HttpHeaders.HOST,
HttpHeaders.CONTENT_LENGTH),
replacePattern(pattern, "\"<<beta>>\""))));
assertThat(
new File("build/generated-snippets/original-request/http-request.adoc"),
is(snippet(asciidoctor()).withContents(
httpRequest(asciidoctor(), RequestMethod.GET, "/")
.header("a", "alpha").header("b", "bravo")
.header("Content-Type", "application/json")
.header("Accept", MediaType.APPLICATION_JSON_VALUE)
.header("Host", "localhost")
.header("Content-Length", "13")
.content("{\"a\":\"alpha\"}"))));
is(snippet(asciidoctor())
.withContents(
httpRequest(asciidoctor(), RequestMethod.GET, "/")
.header("a", "alpha").header("b", "bravo")
.header("Content-Type", "application/json")
.header("Accept",
MediaType.APPLICATION_JSON_VALUE)
.header("Host", "localhost")
.header("Content-Length", "13")
.content("{\"a\":\"alpha\"}"))));
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\"%n}");
assertThat(
new File(
"build/generated-snippets/preprocessed-request/http-request.adoc"),
is(snippet(asciidoctor()).withContents(
httpRequest(asciidoctor(), RequestMethod.GET, "/")
is(snippet(asciidoctor())
.withContents(httpRequest(asciidoctor(), RequestMethod.GET, "/")
.header("b", "bravo")
.header("Content-Type", "application/json")
.header("Accept", MediaType.APPLICATION_JSON_VALUE)
@@ -343,31 +332,30 @@ public class MockMvcRestDocumentationIntegrationTests {
Pattern pattern = Pattern.compile("(\"alpha\")");
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("original-response"))
.andDo(document(
"preprocessed-response",
preprocessResponse(prettyPrint(), maskLinks(),
removeHeaders("a"),
.andExpect(status().isOk()).andDo(document("original-response"))
.andDo(document("preprocessed-response",
preprocessResponse(prettyPrint(), maskLinks(), removeHeaders("a"),
replacePattern(pattern, "\"<<beta>>\""))));
String original = "{\"a\":\"alpha\",\"links\":[{\"rel\":\"rel\","
+ "\"href\":\"href\"}]}";
assertThat(
new File("build/generated-snippets/original-response/http-response.adoc"),
is(snippet(asciidoctor()).withContents(
httpResponse(asciidoctor(), HttpStatus.OK)
.header("a", "alpha")
.header("Content-Type", "application/json")
.header(HttpHeaders.CONTENT_LENGTH,
original.getBytes().length).content(original))));
is(snippet(asciidoctor())
.withContents(
httpResponse(asciidoctor(), HttpStatus.OK)
.header("a", "alpha")
.header("Content-Type", "application/json")
.header(HttpHeaders.CONTENT_LENGTH,
original.getBytes().length)
.content(original))));
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\",%n \"links\" : "
+ "[ {%n \"rel\" : \"rel\",%n \"href\" : \"...\"%n } ]%n}");
assertThat(
new File(
"build/generated-snippets/preprocessed-response/http-response.adoc"),
is(snippet(asciidoctor()).withContents(
httpResponse(asciidoctor(), HttpStatus.OK)
is(snippet(asciidoctor())
.withContents(httpResponse(asciidoctor(), HttpStatus.OK)
.header("Content-Type", "application/json")
.header(HttpHeaders.CONTENT_LENGTH,
prettyPrinted.getBytes().length)
@@ -379,8 +367,8 @@ public class MockMvcRestDocumentationIntegrationTests {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
ClassLoader classLoader = new URLClassLoader(new URL[] { new File(
"src/test/resources/custom-snippet-templates").toURI().toURL() },
ClassLoader classLoader = new URLClassLoader(new URL[] {
new File("src/test/resources/custom-snippet-templates").toURI().toURL() },
getClass().getClassLoader());
ClassLoader previous = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(classLoader);
@@ -392,15 +380,13 @@ public class MockMvcRestDocumentationIntegrationTests {
finally {
Thread.currentThread().setContextClassLoader(previous);
}
assertThat(new File(
"build/generated-snippets/custom-snippet-template/curl-request.adoc"),
assertThat(
new File(
"build/generated-snippets/custom-snippet-template/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(equalTo("Custom curl request"))));
mockMvc.perform(get("/")).andDo(
document(
"index",
curlRequest(attributes(key("title").value(
"Access the index using curl")))));
mockMvc.perform(get("/")).andDo(document("index", curlRequest(
attributes(key("title").value("Access the index using curl")))));
}
@Test
@@ -412,12 +398,11 @@ public class MockMvcRestDocumentationIntegrationTests {
get("/custom/").contextPath("/custom").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("custom-context-path"));
assertThat(
new File("build/generated-snippets/custom-context-path/curl-request.adoc"),
new File(
"build/generated-snippets/custom-context-path/curl-request.adoc"),
is(snippet(asciidoctor())
.withContents(
codeBlock(asciidoctor(), "bash")
.content(
"$ curl 'http://localhost:8080/custom/' -i -H 'Accept: application/json'"))));
.withContents(codeBlock(asciidoctor(), "bash").content(
"$ curl 'http://localhost:8080/custom/' -i -H 'Accept: application/json'"))));
}
private void assertExpectedSnippetFilesExist(File directory, String... snippets) {

View File

@@ -21,6 +21,7 @@ import java.net.URI;
import javax.servlet.ServletContext;
import org.junit.Test;
import org.springframework.http.HttpMethod;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockServletContext;
@@ -144,8 +145,8 @@ public class RestDocumentationRequestBuildersTests {
HttpMethod httpMethod) {
MockHttpServletRequest request = builder.buildRequest(this.servletContext);
assertThat(
(String) request
.getAttribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE),
(String) request.getAttribute(
RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE),
is(equalTo("{template}")));
assertThat(request.getRequestURI(), is(equalTo("t")));
assertThat(request.getMethod(), is(equalTo(httpMethod.name())));