Merge branch '1.2.x'

This commit is contained in:
Andy Wilkinson
2018-08-08 12:27:43 +01:00
84 changed files with 2454 additions and 2937 deletions

View File

@@ -70,6 +70,7 @@ subprojects {
dependency 'junit:junit:4.12'
dependency 'io.rest-assured:rest-assured:3.0.7'
dependency 'org.apache.pdfbox:pdfbox:2.0.7'
dependency 'org.assertj:assertj-core:2.9.1'
dependency 'org.asciidoctor:asciidoctorj:1.5.6'
dependency 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16'
dependency 'org.hamcrest:hamcrest-core:1.3'

View File

@@ -73,7 +73,7 @@
<module name="AvoidStarImport" />
<module name="AvoidStaticImport">
<property name="excludes"
value="com.jayway.restassured.RestAssured.*, io.restassured.RestAssured.*, org.junit.Assert.*, org.junit.Assume.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.Matchers.*, org.springframework.restdocs.cli.CliDocumentation.*, org.springframework.restdocs.headers.HeaderDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.restdocs.mockmvc.IterableEnumeration.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*, org.springframework.restdocs.payload.PayloadDocumentation.*, org.springframework.restdocs.operation.preprocess.Preprocessors.*, org.springframework.restdocs.request.RequestDocumentation.*, org.springframework.restdocs.restassured.RestAssuredRestDocumentation.*, org.springframework.restdocs.restassured.operation.preprocess.RestAssuredPreprocessors.*, org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.*, org.springframework.restdocs.restassured3.operation.preprocess.RestAssuredPreprocessors.*, org.springframework.restdocs.snippet.Attributes.*, org.springframework.restdocs.templates.TemplateFormats.*, org.springframework.restdocs.test.SnippetMatchers.*, org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.web.reactive.function.BodyInserters.*, org.springframework.web.reactive.function.server.RequestPredicates.GET, org.springframework.web.reactive.function.server.RequestPredicates.POST" />
value="io.restassured.RestAssured.*, org.assertj.core.api.Assertions.*, org.hamcrest.CoreMatchers.*, org.hamcrest.Matchers.*, org.mockito.Mockito.*, org.mockito.BDDMockito.*, org.mockito.Matchers.*, org.springframework.restdocs.cli.CliDocumentation.*, org.springframework.restdocs.headers.HeaderDocumentation.*, org.springframework.restdocs.hypermedia.HypermediaDocumentation.*, org.springframework.restdocs.mockmvc.IterableEnumeration.*, org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.*, org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.*, org.springframework.restdocs.payload.PayloadDocumentation.*, org.springframework.restdocs.operation.preprocess.Preprocessors.*, org.springframework.restdocs.request.RequestDocumentation.*, org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.*, org.springframework.restdocs.restassured3.operation.preprocess.RestAssuredPreprocessors.*, org.springframework.restdocs.snippet.Attributes.*, org.springframework.restdocs.templates.TemplateFormats.*, org.springframework.restdocs.test.SnippetConditions.*, org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.*, org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*, org.springframework.test.web.servlet.result.MockMvcResultMatchers.*, org.springframework.web.reactive.function.BodyInserters.*, org.springframework.web.reactive.function.server.RequestPredicates.GET, org.springframework.web.reactive.function.server.RequestPredicates.POST" />
</module>
<module name="IllegalImport" />
<module name="RedundantImport" />

View File

@@ -43,6 +43,7 @@ dependencies {
runtime 'org.atteo:evo-inflector:1.2.1'
testCompile 'com.jayway.jsonpath:json-path'
testCompile 'org.assertj:assertj-core'
testCompile 'org.springframework.boot:spring-boot-starter-test'
testCompile 'org.springframework.restdocs:spring-restdocs-mockmvc'
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-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.
@@ -16,8 +16,7 @@
package com.example.notes;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Set;
@@ -35,25 +34,25 @@ public class NullOrNotBlankTests {
@Test
public void nullValue() {
Set<ConstraintViolation<Constrained>> violations = validator.validate(new Constrained(null));
assertThat(violations.size(), is(0));
assertThat(violations).isEmpty();
}
@Test
public void zeroLengthValue() {
Set<ConstraintViolation<Constrained>> violations = validator.validate(new Constrained(""));
assertThat(violations.size(), is(2));
assertThat(violations).hasSize(2);
}
@Test
public void blankValue() {
Set<ConstraintViolation<Constrained>> violations = validator.validate(new Constrained(" "));
assertThat(violations.size(), is(2));
assertThat(violations).hasSize(2);
}
@Test
public void nonBlankValue() {
Set<ConstraintViolation<Constrained>> violations = validator.validate(new Constrained("test"));
assertThat(violations.size(), is(0));
assertThat(violations).isEmpty();
}
static class Constrained {

View File

@@ -5,6 +5,7 @@ dependencies {
testCompile 'junit:junit'
testCompile 'org.apache.pdfbox:pdfbox'
testCompile 'org.asciidoctor:asciidoctorj'
testCompile 'org.assertj:assertj-core'
testCompile 'org.springframework:spring-core'
testRuntime 'org.asciidoctor:asciidoctorj-pdf'
}

View File

@@ -23,8 +23,7 @@ import org.asciidoctor.Attributes;
import org.asciidoctor.Options;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link DefaultAttributesPreprocessor}.
@@ -38,8 +37,8 @@ public class DefaultAttributesPreprocessorTests {
Options options = new Options();
options.setAttributes(new Attributes("projectdir=../../.."));
String converted = Asciidoctor.Factory.create().convert("{snippets}", options);
assertThat(converted,
containsString("build" + File.separatorChar + "generated-snippets"));
assertThat(converted)
.contains("build" + File.separatorChar + "generated-snippets");
}
@Test
@@ -47,7 +46,7 @@ public class DefaultAttributesPreprocessorTests {
Options options = new Options();
options.setAttributes(new Attributes("snippets=custom projectdir=../../.."));
String converted = Asciidoctor.Factory.create().convert("{snippets}", options);
assertThat(converted, containsString("custom"));
assertThat(converted).contains("custom");
}
@Test
@@ -56,7 +55,7 @@ public class DefaultAttributesPreprocessorTests {
options.setAttributes(new Attributes("projectdir=../../.."));
String converted = Asciidoctor.Factory.create()
.convert(":snippets: custom\n{snippets}", options);
assertThat(converted, containsString("custom"));
assertThat(converted).contains("custom");
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -39,10 +39,7 @@ import org.junit.Test;
import org.springframework.util.FileSystemUtils;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.CoreMatchers.startsWith;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for Ruby operation block macro.
@@ -73,7 +70,7 @@ public class OperationBlockMacroTests {
public void codeBlockSnippetInclude() throws Exception {
String result = this.asciidoctor.convert(
"operation::some-operation[snippets='curl-request']", this.options);
assertThat(result, equalTo(getExpectedContentFromFile("snippet-simple")));
assertThat(result).isEqualTo(getExpectedContentFromFile("snippet-simple"));
}
@Test
@@ -83,7 +80,7 @@ public class OperationBlockMacroTests {
this.options.setAttributes(attributes);
String result = this.asciidoctor.convert(
"operation::{name}-operation[snippets='curl-request']", this.options);
assertThat(result, equalTo(getExpectedContentFromFile("snippet-simple")));
assertThat(result).isEqualTo(getExpectedContentFromFile("snippet-simple"));
}
@Test
@@ -91,15 +88,15 @@ public class OperationBlockMacroTests {
File output = configurePdfOutput();
this.asciidoctor.convert("operation::some-operation[snippets='curl-request']",
this.options);
assertThat(extractStrings(output),
hasItems("Curl request", "$ curl 'http://localhost:8080/' -i", "1"));
assertThat(extractStrings(output)).containsExactly("Curl request",
"$ curl 'http://localhost:8080/' -i", "1");
}
@Test
public void tableSnippetInclude() throws Exception {
String result = this.asciidoctor.convert(
"operation::some-operation[snippets='response-fields']", this.options);
assertThat(result, equalTo(getExpectedContentFromFile("snippet-table")));
assertThat(result).isEqualTo(getExpectedContentFromFile("snippet-table"));
}
@Test
@@ -107,9 +104,9 @@ public class OperationBlockMacroTests {
File output = configurePdfOutput();
this.asciidoctor.convert("operation::some-operation[snippets='response-fields']",
this.options);
assertThat(extractStrings(output),
hasItems("Response fields", "Path", "Type", "Description", "a", "Object",
"one", "a.b", "Number", "two", "a.c", "String", "three", "1"));
assertThat(extractStrings(output)).containsExactly("Response fields", "Path",
"Type", "Description", "a", "Object", "one", "a.b", "Number", "two",
"a.c", "String", "three", "1");
}
@Test
@@ -117,7 +114,7 @@ public class OperationBlockMacroTests {
String result = this.asciidoctor.convert(
"== Section\n" + "operation::some-operation[snippets='curl-request']",
this.options);
assertThat(result, equalTo(getExpectedContentFromFile("snippet-in-section")));
assertThat(result).isEqualTo(getExpectedContentFromFile("snippet-in-section"));
}
@Test
@@ -126,8 +123,8 @@ public class OperationBlockMacroTests {
this.asciidoctor.convert(
"== Section\n" + "operation::some-operation[snippets='curl-request']",
this.options);
assertThat(extractStrings(output), hasItems("Section", "Curl request",
"$ curl 'http://localhost:8080/' -i", "1"));
assertThat(extractStrings(output)).containsExactly("Section", "Curl request",
"$ curl 'http://localhost:8080/' -i", "1");
}
@Test
@@ -135,43 +132,43 @@ public class OperationBlockMacroTests {
String result = this.asciidoctor.convert(
"operation::some-operation[snippets='curl-request,http-request']",
this.options);
assertThat(result, equalTo(getExpectedContentFromFile("multiple-snippets")));
assertThat(result).isEqualTo(getExpectedContentFromFile("multiple-snippets"));
}
@Test
public void useMacroWithoutSnippetAttributeAddsAllSnippets() throws Exception {
String result = this.asciidoctor.convert("operation::some-operation[]",
this.options);
assertThat(result, equalTo(getExpectedContentFromFile("all-snippets")));
assertThat(result).isEqualTo(getExpectedContentFromFile("all-snippets"));
}
@Test
public void useMacroWithEmptySnippetAttributeAddsAllSnippets() throws Exception {
String result = this.asciidoctor.convert("operation::some-operation[snippets=]",
this.options);
assertThat(result, equalTo(getExpectedContentFromFile("all-snippets")));
assertThat(result).isEqualTo(getExpectedContentFromFile("all-snippets"));
}
@Test
public void includingMissingSnippetAddsWarning() throws Exception {
String result = this.asciidoctor.convert(
"operation::some-operation[snippets='missing-snippet']", this.options);
assertThat(result, startsWith(getExpectedContentFromFile("missing-snippet")));
assertThat(result).startsWith(getExpectedContentFromFile("missing-snippet"));
}
@Test
public void defaultTitleIsProvidedForCustomSnippet() throws Exception {
String result = this.asciidoctor.convert(
"operation::some-operation[snippets='custom-snippet']", this.options);
assertThat(result,
equalTo(getExpectedContentFromFile("custom-snippet-default-title")));
assertThat(result)
.isEqualTo(getExpectedContentFromFile("custom-snippet-default-title"));
}
@Test
public void missingOperationIsHandledGracefully() throws Exception {
String result = this.asciidoctor.convert("operation::missing-operation[]",
this.options);
assertThat(result, startsWith(getExpectedContentFromFile("missing-operation")));
assertThat(result).startsWith(getExpectedContentFromFile("missing-operation"));
}
@Test
@@ -181,8 +178,8 @@ public class OperationBlockMacroTests {
":operation-curl-request-title: Example request\n"
+ "operation::some-operation[snippets='curl-request']",
this.options);
assertThat(result,
equalTo(getExpectedContentFromFile("built-in-snippet-custom-title")));
assertThat(result)
.isEqualTo(getExpectedContentFromFile("built-in-snippet-custom-title"));
}
@Test
@@ -192,8 +189,8 @@ public class OperationBlockMacroTests {
":operation-custom-snippet-title: Customized title\n"
+ "operation::some-operation[snippets='custom-snippet']",
this.options);
assertThat(result,
equalTo(getExpectedContentFromFile("custom-snippet-custom-title")));
assertThat(result)
.isEqualTo(getExpectedContentFromFile("custom-snippet-custom-title"));
}
private String getExpectedContentFromFile(String fileName)
@@ -226,7 +223,7 @@ public class OperationBlockMacroTests {
private List<String> extractStrings(File pdfFile) throws IOException {
PDDocument pdf = PDDocument.load(pdfFile);
assertThat(pdf.getNumberOfPages(), equalTo(1));
assertThat(pdf.getNumberOfPages()).isEqualTo(1);
StringExtractor stringExtractor = new StringExtractor();
stringExtractor.processPage(pdf.getPage(0));
return stringExtractor.getStrings();

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -26,9 +26,8 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link SnippetsDirectoryResolver}.
@@ -52,9 +51,9 @@ public class SnippetsDirectoryResolverTests {
new File(this.temporaryFolder.getRoot(), "src/main/asciidoc")
.getAbsolutePath());
File snippetsDirectory = getMavenSnippetsDirectory(attributes);
assertThat(snippetsDirectory.isAbsolute(), is(false));
assertThat(snippetsDirectory,
equalTo(new File("../../../target/generated-snippets")));
assertThat(snippetsDirectory).isRelative();
assertThat(snippetsDirectory)
.isEqualTo(new File("../../../target/generated-snippets"));
}
@Test
@@ -85,8 +84,8 @@ public class SnippetsDirectoryResolverTests {
attributes.put("projectdir", "project/dir");
File snippetsDirectory = new SnippetsDirectoryResolver()
.getSnippetsDirectory(attributes);
assertThat(snippetsDirectory,
equalTo(new File("project/dir/build/generated-snippets")));
assertThat(snippetsDirectory)
.isEqualTo(new File("project/dir/build/generated-snippets"));
}
@Test

View File

@@ -35,6 +35,7 @@ dependencies {
optional 'junit:junit'
optional 'org.hibernate.validator:hibernate-validator'
optional 'org.junit.jupiter:junit-jupiter-api'
testCompile 'org.assertj:assertj-core'
testCompile 'org.javamoney:moneta'
testCompile 'org.mockito:mockito-core'
testCompile 'org.hamcrest:hamcrest-core'

View File

@@ -27,13 +27,13 @@ import org.junit.runners.Parameterized.Parameters;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.HttpStatus;
import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.GeneratedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import org.springframework.restdocs.test.SnippetMatchers;
import org.springframework.restdocs.test.SnippetMatchers.CodeBlockMatcher;
import org.springframework.restdocs.test.SnippetMatchers.HttpRequestMatcher;
import org.springframework.restdocs.test.SnippetMatchers.HttpResponseMatcher;
import org.springframework.restdocs.test.SnippetMatchers.TableMatcher;
import org.springframework.restdocs.test.SnippetConditions;
import org.springframework.restdocs.test.SnippetConditions.CodeBlockCondition;
import org.springframework.restdocs.test.SnippetConditions.HttpRequestCondition;
import org.springframework.restdocs.test.SnippetConditions.HttpResponseCondition;
import org.springframework.restdocs.test.SnippetConditions.TableCondition;
import org.springframework.web.bind.annotation.RequestMethod;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
@@ -50,7 +50,7 @@ public abstract class AbstractSnippetTests {
protected final TemplateFormat templateFormat;
@Rule
public ExpectedSnippets snippets;
public GeneratedSnippets generatedSnippets;
@Rule
public OperationBuilder operationBuilder;
@@ -62,34 +62,34 @@ public abstract class AbstractSnippetTests {
}
public AbstractSnippetTests(String name, TemplateFormat templateFormat) {
this.snippets = new ExpectedSnippets(templateFormat);
this.generatedSnippets = new GeneratedSnippets(templateFormat);
this.templateFormat = templateFormat;
this.operationBuilder = new OperationBuilder(this.templateFormat);
}
public CodeBlockMatcher<?> codeBlock(String language) {
public CodeBlockCondition<?> codeBlock(String language) {
return this.codeBlock(language, null);
}
public CodeBlockMatcher<?> codeBlock(String language, String options) {
return SnippetMatchers.codeBlock(this.templateFormat, language, options);
public CodeBlockCondition<?> codeBlock(String language, String options) {
return SnippetConditions.codeBlock(this.templateFormat, language, options);
}
public TableMatcher<?> tableWithHeader(String... headers) {
return SnippetMatchers.tableWithHeader(this.templateFormat, headers);
public TableCondition<?> tableWithHeader(String... headers) {
return SnippetConditions.tableWithHeader(this.templateFormat, headers);
}
public TableMatcher<?> tableWithTitleAndHeader(String title, String... headers) {
return SnippetMatchers.tableWithTitleAndHeader(this.templateFormat, title,
public TableCondition<?> tableWithTitleAndHeader(String title, String... headers) {
return SnippetConditions.tableWithTitleAndHeader(this.templateFormat, title,
headers);
}
public HttpRequestMatcher httpRequest(RequestMethod method, String uri) {
return SnippetMatchers.httpRequest(this.templateFormat, method, uri);
public HttpRequestCondition httpRequest(RequestMethod method, String uri) {
return SnippetConditions.httpRequest(this.templateFormat, method, uri);
}
public HttpResponseMatcher httpResponse(HttpStatus responseStatus) {
return SnippetMatchers.httpResponse(this.templateFormat, responseStatus);
public HttpResponseCondition httpResponse(HttpStatus responseStatus) {
return SnippetConditions.httpResponse(this.templateFormat, responseStatus);
}
protected FileSystemResource snippetResource(String name) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -42,9 +42,7 @@ import org.springframework.restdocs.operation.preprocess.OperationResponsePrepro
import org.springframework.restdocs.operation.preprocess.Preprocessors;
import org.springframework.restdocs.snippet.Snippet;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -206,10 +204,9 @@ public class RestDocumentationGeneratorTests {
throws IOException {
ArgumentCaptor<Operation> operation = ArgumentCaptor.forClass(Operation.class);
verify(snippet).document(operation.capture());
assertThat(this.operationRequest, is(equalTo(operation.getValue().getRequest())));
assertThat(this.operationResponse,
is(equalTo(operation.getValue().getResponse())));
assertThat(attributes, is(equalTo(operation.getValue().getAttributes())));
assertThat(this.operationRequest).isEqualTo(operation.getValue().getRequest());
assertThat(this.operationResponse).isEqualTo(operation.getValue().getResponse());
assertThat(attributes).isEqualTo(operation.getValue().getAttributes());
}
private void verifySnippetInvocation(Snippet snippet,
@@ -217,18 +214,17 @@ public class RestDocumentationGeneratorTests {
Map<String, Object> attributes, int times) throws IOException {
ArgumentCaptor<Operation> operation = ArgumentCaptor.forClass(Operation.class);
verify(snippet, Mockito.times(times)).document(operation.capture());
assertThat(operationRequest, is(equalTo(operation.getValue().getRequest())));
assertThat(operationResponse, is(equalTo(operation.getValue().getResponse())));
assertThat(operationRequest).isEqualTo(operation.getValue().getRequest());
assertThat(operationResponse).isEqualTo(operation.getValue().getResponse());
}
private void verifySnippetInvocation(InOrder inOrder, Snippet snippet,
Map<String, Object> attributes) throws IOException {
ArgumentCaptor<Operation> operation = ArgumentCaptor.forClass(Operation.class);
inOrder.verify(snippet).document(operation.capture());
assertThat(this.operationRequest, is(equalTo(operation.getValue().getRequest())));
assertThat(this.operationResponse,
is(equalTo(operation.getValue().getResponse())));
assertThat(attributes, is(equalTo(operation.getValue().getAttributes())));
assertThat(this.operationRequest).isEqualTo(operation.getValue().getRequest());
assertThat(this.operationResponse).isEqualTo(operation.getValue().getResponse());
assertThat(attributes).isEqualTo(operation.getValue().getAttributes());
}
private static OperationRequest createRequest() {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -21,9 +21,7 @@ import java.util.Collections;
import org.junit.Test;
import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link CommandFormatter}.
@@ -37,25 +35,25 @@ public class ConcatenatingCommandFormatterTests {
@Test
public void formattingAnEmptyListProducesAnEmptyString() {
assertThat(this.singleLineFormat.format(Collections.<String>emptyList()),
is(equalTo("")));
assertThat(this.singleLineFormat.format(Collections.<String>emptyList()))
.isEqualTo("");
}
@Test
public void formattingNullProducesAnEmptyString() {
assertThat(this.singleLineFormat.format(null), is(equalTo("")));
assertThat(this.singleLineFormat.format(null)).isEqualTo("");
}
@Test
public void formattingASingleElement() {
assertThat(this.singleLineFormat.format(Collections.singletonList("alpha")),
is(equalTo(" alpha")));
assertThat(this.singleLineFormat.format(Collections.singletonList("alpha")))
.isEqualTo(" alpha");
}
@Test
public void formattingMultipleElements() {
assertThat(this.singleLineFormat.format(Arrays.asList("alpha", "bravo")),
is(equalTo(String.format(" alpha bravo"))));
assertThat(this.singleLineFormat.format(Arrays.asList("alpha", "bravo")))
.isEqualTo(String.format(" alpha bravo"));
}
}

View File

@@ -25,17 +25,10 @@ import org.junit.runners.Parameterized;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.restdocs.AbstractSnippetTests;
import org.springframework.restdocs.templates.TemplateEngine;
import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import org.springframework.util.Base64Utils;
import static org.hamcrest.CoreMatchers.containsString;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.snippet.Attributes.attributes;
import static org.springframework.restdocs.snippet.Attributes.key;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link CurlRequestSnippet}.
@@ -58,344 +51,325 @@ public class CurlRequestSnippetTests extends AbstractSnippetTests {
@Test
public void getRequest() throws IOException {
this.snippets.expectCurlRequest().withContents(
codeBlock("bash").content("$ curl 'http://localhost/foo' -i -X GET"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo").build());
assertThat(this.generatedSnippets.curlRequest()).is(
codeBlock("bash").withContent("$ curl 'http://localhost/foo' -i -X GET"));
}
@Test
public void getRequestWithParameter() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?a=alpha' -i -X GET"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").param("a", "alpha").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?a=alpha' -i -X GET"));
}
@Test
public void nonGetRequest() throws IOException {
this.snippets.expectCurlRequest().withContents(
codeBlock("bash").content("$ curl 'http://localhost/foo' -i -X POST"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("POST").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -X POST"));
}
@Test
public void requestWithContent() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo' -i -X GET -d 'content'"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").content("content").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -X GET -d 'content'"));
}
@Test
public void getRequestWithQueryString() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?param=value' -i -X GET"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?param=value").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?param=value' -i -X GET"));
}
@Test
public void getRequestWithTotallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?param=value' -i -X GET"));
new CurlRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo?param=value")
.param("param", "value").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?param=value' -i -X GET"));
}
@Test
public void getRequestWithPartiallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i -X GET"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo?a=alpha")
.param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i -X GET"));
}
@Test
public void getRequestWithDisjointQueryStringAndParameters() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i -X GET"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?a=alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i -X GET"));
}
@Test
public void getRequestWithQueryStringWithNoValue() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?param' -i -X GET"));
new CurlRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo?param").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?param' -i -X GET"));
}
@Test
public void postRequestWithQueryString() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?param=value' -i -X POST"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?param=value").method("POST").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?param=value' -i -X POST"));
}
@Test
public void postRequestWithQueryStringWithNoValue() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?param' -i -X POST"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?param").method("POST").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?param' -i -X POST"));
}
@Test
public void postRequestWithOneParameter() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo' -i -X POST -d 'k1=v1'"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.method("POST").param("k1", "v1").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -X POST -d 'k1=v1'"));
}
@Test
public void postRequestWithOneParameterWithNoValue() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo' -i -X POST -d 'k1='"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("POST").param("k1").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -X POST -d 'k1='"));
}
@Test
public void postRequestWithMultipleParameters() throws IOException {
this.snippets.expectCurlRequest().withContents(
codeBlock("bash").content("$ curl 'http://localhost/foo' -i -X POST"
+ " -d 'k1=v1&k1=v1-bis&k2=v2'"));
new CurlRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo").method("POST")
.param("k1", "v1", "v1-bis").param("k2", "v2").build());
assertThat(this.generatedSnippets.curlRequest()).is(
codeBlock("bash").withContent("$ curl 'http://localhost/foo' -i -X POST"
+ " -d 'k1=v1&k1=v1-bis&k2=v2'"));
}
@Test
public void postRequestWithUrlEncodedParameter() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo' -i -X POST -d 'k1=a%26b'"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.method("POST").param("k1", "a&b").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -X POST -d 'k1=a%26b'"));
}
@Test
public void postRequestWithDisjointQueryStringAndParameter() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash").content(
"$ curl 'http://localhost/foo?a=alpha' -i -X POST -d 'b=bravo'"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo?a=alpha")
.method("POST").param("b", "bravo").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash").withContent(
"$ curl 'http://localhost/foo?a=alpha' -i -X POST -d 'b=bravo'"));
}
@Test
public void postRequestWithTotallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i -X POST"));
new CurlRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo?a=alpha&b=bravo")
.method("POST").param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i -X POST"));
}
@Test
public void postRequestWithPartiallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash").content(
"$ curl 'http://localhost/foo?a=alpha' -i -X POST -d 'b=bravo'"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo?a=alpha")
.method("POST").param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash").withContent(
"$ curl 'http://localhost/foo?a=alpha' -i -X POST -d 'b=bravo'"));
}
@Test
public void postRequestWithOverlappingParametersAndFormUrlEncodedBody()
throws IOException {
this.snippets.expectCurlRequest().withContents(
codeBlock("bash").content("$ curl 'http://localhost/foo' -i -X POST "
+ "-H 'Content-Type: application/x-www-form-urlencoded' "
+ "-d 'a=alpha&b=bravo'"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("POST").content("a=alpha&b=bravo")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.curlRequest()).is(
codeBlock("bash").withContent("$ curl 'http://localhost/foo' -i -X POST "
+ "-H 'Content-Type: application/x-www-form-urlencoded' "
+ "-d 'a=alpha&b=bravo'"));
}
@Test
public void putRequestWithOneParameter() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo' -i -X PUT -d 'k1=v1'"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("PUT").param("k1", "v1").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -X PUT -d 'k1=v1'"));
}
@Test
public void putRequestWithMultipleParameters() throws IOException {
this.snippets.expectCurlRequest().withContents(
codeBlock("bash").content("$ curl 'http://localhost/foo' -i -X PUT"
+ " -d 'k1=v1&k1=v1-bis&k2=v2'"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("PUT").param("k1", "v1")
.param("k1", "v1-bis").param("k2", "v2").build());
assertThat(this.generatedSnippets.curlRequest()).is(
codeBlock("bash").withContent("$ curl 'http://localhost/foo' -i -X PUT"
+ " -d 'k1=v1&k1=v1-bis&k2=v2'"));
}
@Test
public void putRequestWithUrlEncodedParameter() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo' -i -X PUT -d 'k1=a%26b'"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.method("PUT").param("k1", "a&b").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -X PUT -d 'k1=a%26b'"));
}
@Test
public void requestWithHeaders() throws IOException {
this.snippets.expectCurlRequest().withContents(
codeBlock("bash").content("$ curl 'http://localhost/foo' -i -X GET"
+ " -H 'Content-Type: application/json' -H 'a: alpha'"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.header("a", "alpha").build());
assertThat(this.generatedSnippets.curlRequest()).is(
codeBlock("bash").withContent("$ curl 'http://localhost/foo' -i -X GET"
+ " -H 'Content-Type: application/json' -H 'a: alpha'"));
}
@Test
public void requestWithHeadersMultiline() throws IOException {
this.snippets.expectCurlRequest()
.withContents(codeBlock("bash").content(
String.format("$ curl 'http://localhost/foo' -i -X GET \\%n"
+ " -H 'Content-Type: application/json' \\%n"
+ " -H 'a: alpha'")));
new CurlRequestSnippet(CliDocumentation.multiLineFormat())
.document(this.operationBuilder.request("http://localhost/foo")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_JSON_VALUE)
.header("a", "alpha").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent(String.format("$ curl 'http://localhost/foo' -i -X GET \\%n"
+ " -H 'Content-Type: application/json' \\%n"
+ " -H 'a: alpha'")));
}
@Test
public void requestWithCookies() throws IOException {
this.snippets.expectCurlRequest().withContents(
codeBlock("bash").content("$ curl 'http://localhost/foo' -i -X GET"
+ " --cookie 'name1=value1;name2=value2'"));
new CurlRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.cookie("name1", "value1").cookie("name2", "value2").build());
assertThat(this.generatedSnippets.curlRequest()).is(
codeBlock("bash").withContent("$ curl 'http://localhost/foo' -i -X GET"
+ " --cookie 'name1=value1;name2=value2'"));
}
@Test
public void multipartPostWithNoSubmittedFileName() throws IOException {
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'metadata={\"description\": \"foo\"}'";
this.snippets.expectCurlRequest()
.withContents(codeBlock("bash").content(expectedContent));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("metadata", "{\"description\": \"foo\"}".getBytes()).build());
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'metadata={\"description\": \"foo\"}'";
assertThat(this.generatedSnippets.curlRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void multipartPostWithContentType() throws IOException {
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'image=@documents/images/example.png;type=image/png'";
this.snippets.expectCurlRequest()
.withContents(codeBlock("bash").content(expectedContent));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", new byte[0])
.header(HttpHeaders.CONTENT_TYPE, MediaType.IMAGE_PNG_VALUE)
.submittedFileName("documents/images/example.png").build());
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'image=@documents/images/example.png;type=image/png'";
assertThat(this.generatedSnippets.curlRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void multipartPost() throws IOException {
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'image=@documents/images/example.png'";
this.snippets.expectCurlRequest()
.withContents(codeBlock("bash").content(expectedContent));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", new byte[0])
.submittedFileName("documents/images/example.png").build());
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'image=@documents/images/example.png'";
assertThat(this.generatedSnippets.curlRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void multipartPostWithParameters() throws IOException {
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'image=@documents/images/example.png' -F 'a=apple' -F 'a=avocado' "
+ "-F 'b=banana'";
this.snippets.expectCurlRequest()
.withContents(codeBlock("bash").content(expectedContent));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", new byte[0])
.submittedFileName("documents/images/example.png").and()
.param("a", "apple", "avocado").param("b", "banana").build());
String expectedContent = "$ curl 'http://localhost/upload' -i -X POST -H "
+ "'Content-Type: multipart/form-data' -F "
+ "'image=@documents/images/example.png' -F 'a=apple' -F 'a=avocado' "
+ "-F 'b=banana'";
assertThat(this.generatedSnippets.curlRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void basicAuthCredentialsAreSuppliedUsingUserOption() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo' -i -u 'user:secret' -X GET"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo")
.header(HttpHeaders.AUTHORIZATION,
"Basic " + Base64Utils.encodeToString("user:secret".getBytes()))
.build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo' -i -u 'user:secret' -X GET"));
}
@Test
public void customAttributes() throws IOException {
this.snippets.expectCurlRequest()
.withContents(containsString("curl request title"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("curl-request"))
.willReturn(snippetResource("curl-request-with-title"));
new CurlRequestSnippet(
attributes(
key("title").value("curl request title")),
this.commandFormatter)
.document(this.operationBuilder
.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.request("http://localhost/foo").build());
}
@Test
public void customHostHeaderIsIncluded() throws IOException {
this.snippets.expectCurlRequest().withContents(codeBlock("bash").content(
"$ curl 'http://localhost/foo' -i -X GET -H 'Host: api.example.com'"
+ " -H 'Content-Type: application/json' -H 'a: alpha'"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo")
.header(HttpHeaders.HOST, "api.example.com")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.header("a", "alpha").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash").withContent(
"$ curl 'http://localhost/foo' -i -X GET -H 'Host: api.example.com'"
+ " -H 'Content-Type: application/json' -H 'a: alpha'"));
}
@Test
public void postWithContentAndParameters() throws IOException {
this.snippets.expectCurlRequest()
.withContents(codeBlock("bash")
.content("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i "
+ "-X POST -d 'Some content'"));
new CurlRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").param("a", "alpha").method("POST")
.param("b", "bravo").content("Some content").build());
assertThat(this.generatedSnippets.curlRequest()).is(codeBlock("bash")
.withContent("$ curl 'http://localhost/foo?a=alpha&b=bravo' -i "
+ "-X POST -d 'Some content'"));
}
}

View File

@@ -25,17 +25,10 @@ import org.junit.runners.Parameterized;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.restdocs.AbstractSnippetTests;
import org.springframework.restdocs.templates.TemplateEngine;
import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import org.springframework.util.Base64Utils;
import static org.hamcrest.CoreMatchers.containsString;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.snippet.Attributes.attributes;
import static org.springframework.restdocs.snippet.Attributes.key;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link HttpieRequestSnippet}.
@@ -59,339 +52,323 @@ public class HttpieRequestSnippetTests extends AbstractSnippetTests {
@Test
public void getRequest() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http GET 'http://localhost/foo'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent("$ http GET 'http://localhost/foo'"));
}
@Test
public void getRequestWithParameter() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http GET 'http://localhost/foo?a=alpha'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").param("a", "alpha").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http GET 'http://localhost/foo?a=alpha'"));
}
@Test
public void nonGetRequest() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http POST 'http://localhost/foo'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("POST").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent("$ http POST 'http://localhost/foo'"));
}
@Test
public void requestWithContent() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ echo 'content' | http GET 'http://localhost/foo'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").content("content").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ echo 'content' | http GET 'http://localhost/foo'"));
}
@Test
public void getRequestWithQueryString() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http GET 'http://localhost/foo?param=value'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?param=value").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http GET 'http://localhost/foo?param=value'"));
}
@Test
public void getRequestWithTotallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http GET 'http://localhost/foo?param=value'"));
new HttpieRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo?param=value")
.param("param", "value").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http GET 'http://localhost/foo?param=value'"));
}
@Test
public void getRequestWithPartiallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http GET 'http://localhost/foo?a=alpha&b=bravo'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo?a=alpha")
.param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http GET 'http://localhost/foo?a=alpha&b=bravo'"));
}
@Test
public void getRequestWithDisjointQueryStringAndParameters() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http GET 'http://localhost/foo?a=alpha&b=bravo'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?a=alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http GET 'http://localhost/foo?a=alpha&b=bravo'"));
}
@Test
public void getRequestWithQueryStringWithNoValue() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http GET 'http://localhost/foo?param'"));
new HttpieRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo?param").build());
assertThat(this.generatedSnippets.httpieRequest()).is(
codeBlock("bash").withContent("$ http GET 'http://localhost/foo?param'"));
}
@Test
public void postRequestWithQueryString() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http POST 'http://localhost/foo?param=value'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?param=value").method("POST").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http POST 'http://localhost/foo?param=value'"));
}
@Test
public void postRequestWithQueryStringWithNoValue() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http POST 'http://localhost/foo?param'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo?param").method("POST").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http POST 'http://localhost/foo?param'"));
}
@Test
public void postRequestWithOneParameter() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --form POST 'http://localhost/foo' 'k1=v1'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.method("POST").param("k1", "v1").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http --form POST 'http://localhost/foo' 'k1=v1'"));
}
@Test
public void postRequestWithOneParameterWithNoValue() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --form POST 'http://localhost/foo' 'k1='"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("POST").param("k1").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http --form POST 'http://localhost/foo' 'k1='"));
}
@Test
public void postRequestWithMultipleParameters() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http --form POST 'http://localhost/foo'"
+ " 'k1=v1' 'k1=v1-bis' 'k2=v2'"));
new HttpieRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo").method("POST")
.param("k1", "v1", "v1-bis").param("k2", "v2").build());
assertThat(this.generatedSnippets.httpieRequest()).is(
codeBlock("bash").withContent("$ http --form POST 'http://localhost/foo'"
+ " 'k1=v1' 'k1=v1-bis' 'k2=v2'"));
}
@Test
public void postRequestWithUrlEncodedParameter() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --form POST 'http://localhost/foo' 'k1=a&b'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.method("POST").param("k1", "a&b").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http --form POST 'http://localhost/foo' 'k1=a&b'"));
}
@Test
public void postRequestWithDisjointQueryStringAndParameter() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --form POST 'http://localhost/foo?a=alpha' 'b=bravo'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo?a=alpha")
.method("POST").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent(
"$ http --form POST 'http://localhost/foo?a=alpha' 'b=bravo'"));
}
@Test
public void postRequestWithTotallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http POST 'http://localhost/foo?a=alpha&b=bravo'"));
new HttpieRequestSnippet(this.commandFormatter).document(
this.operationBuilder.request("http://localhost/foo?a=alpha&b=bravo")
.method("POST").param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http POST 'http://localhost/foo?a=alpha&b=bravo'"));
}
@Test
public void postRequestWithPartiallyOverlappingQueryStringAndParameters()
throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --form POST 'http://localhost/foo?a=alpha' 'b=bravo'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo?a=alpha")
.method("POST").param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent(
"$ http --form POST 'http://localhost/foo?a=alpha' 'b=bravo'"));
}
@Test
public void postRequestWithOverlappingParametersAndFormUrlEncodedBody()
throws IOException {
this.snippets.expectHttpieRequest()
.withContents(codeBlock("bash").content(
"$ echo 'a=alpha&b=bravo' | http POST 'http://localhost/foo' "
+ "'Content-Type:application/x-www-form-urlencoded'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("POST").content("a=alpha&b=bravo")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent(
"$ echo 'a=alpha&b=bravo' | http POST 'http://localhost/foo' "
+ "'Content-Type:application/x-www-form-urlencoded'"));
}
@Test
public void putRequestWithOneParameter() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --form PUT 'http://localhost/foo' 'k1=v1'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("PUT").param("k1", "v1").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http --form PUT 'http://localhost/foo' 'k1=v1'"));
}
@Test
public void putRequestWithMultipleParameters() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http --form PUT 'http://localhost/foo'"
+ " 'k1=v1' 'k1=v1-bis' 'k2=v2'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("PUT").param("k1", "v1")
.param("k1", "v1-bis").param("k2", "v2").build());
assertThat(this.generatedSnippets.httpieRequest()).is(
codeBlock("bash").withContent("$ http --form PUT 'http://localhost/foo'"
+ " 'k1=v1' 'k1=v1-bis' 'k2=v2'"));
}
@Test
public void putRequestWithUrlEncodedParameter() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --form PUT 'http://localhost/foo' 'k1=a&b'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.method("PUT").param("k1", "a&b").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http --form PUT 'http://localhost/foo' 'k1=a&b'"));
}
@Test
public void requestWithHeaders() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http GET 'http://localhost/foo'"
+ " 'Content-Type:application/json' 'a:alpha'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.header("a", "alpha").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent("$ http GET 'http://localhost/foo'"
+ " 'Content-Type:application/json' 'a:alpha'"));
}
@Test
public void requestWithHeadersMultiline() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content(String.format("$ http GET 'http://localhost/foo' \\%n"
+ " 'Content-Type:application/json' \\%n 'a:alpha'")));
new HttpieRequestSnippet(CliDocumentation.multiLineFormat())
.document(this.operationBuilder.request("http://localhost/foo")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_JSON_VALUE)
.header("a", "alpha").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent(String.format("$ http GET 'http://localhost/foo' \\%n"
+ " 'Content-Type:application/json' \\%n 'a:alpha'")));
}
@Test
public void requestWithCookies() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ http GET 'http://localhost/foo'"
+ " 'Cookie:name1=value1' 'Cookie:name2=value2'"));
new HttpieRequestSnippet(this.commandFormatter)
.document(this.operationBuilder.request("http://localhost/foo")
.cookie("name1", "value1").cookie("name2", "value2").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent("$ http GET 'http://localhost/foo'"
+ " 'Cookie:name1=value1' 'Cookie:name2=value2'"));
}
@Test
public void multipartPostWithNoSubmittedFileName() throws IOException {
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'metadata'@<(echo '{\"description\": \"foo\"}')";
this.snippets.expectHttpieRequest()
.withContents(codeBlock("bash").content(expectedContent));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("metadata", "{\"description\": \"foo\"}".getBytes()).build());
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'metadata'@<(echo '{\"description\": \"foo\"}')";
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void multipartPostWithContentType() throws IOException {
// httpie does not yet support manually set content type by part
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'image'@'documents/images/example.png'";
this.snippets.expectHttpieRequest()
.withContents(codeBlock("bash").content(expectedContent));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", new byte[0])
.header(HttpHeaders.CONTENT_TYPE, MediaType.IMAGE_PNG_VALUE)
.submittedFileName("documents/images/example.png").build());
// httpie does not yet support manually set content type by part
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'image'@'documents/images/example.png'";
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void multipartPost() throws IOException {
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'image'@'documents/images/example.png'";
this.snippets.expectHttpieRequest()
.withContents(codeBlock("bash").content(expectedContent));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", new byte[0])
.submittedFileName("documents/images/example.png").build());
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'image'@'documents/images/example.png'";
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void multipartPostWithParameters() throws IOException {
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'image'@'documents/images/example.png' 'a=apple' 'a=avocado'"
+ " 'b=banana'";
this.snippets.expectHttpieRequest()
.withContents(codeBlock("bash").content(expectedContent));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", new byte[0])
.submittedFileName("documents/images/example.png").and()
.param("a", "apple", "avocado").param("b", "banana").build());
String expectedContent = "$ http --form POST 'http://localhost/upload'"
+ " 'image'@'documents/images/example.png' 'a=apple' 'a=avocado'"
+ " 'b=banana'";
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent(expectedContent));
}
@Test
public void basicAuthCredentialsAreSuppliedUsingAuthOption() throws IOException {
this.snippets.expectHttpieRequest().withContents(codeBlock("bash")
.content("$ http --auth 'user:secret' GET 'http://localhost/foo'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo")
.header(HttpHeaders.AUTHORIZATION,
"Basic " + Base64Utils.encodeToString("user:secret".getBytes()))
.build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http --auth 'user:secret' GET 'http://localhost/foo'"));
}
@Test
public void customAttributes() throws IOException {
this.snippets.expectHttpieRequest()
.withContents(containsString("httpie request title"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("httpie-request"))
.willReturn(snippetResource("httpie-request-with-title"));
new HttpieRequestSnippet(
attributes(key("title")
.value("httpie request title")),
this.commandFormatter)
.document(this.operationBuilder
.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.request("http://localhost/foo").build());
}
@Test
public void customHostHeaderIsIncluded() throws IOException {
this.snippets.expectHttpieRequest()
.withContents(codeBlock("bash").content(
"$ http GET 'http://localhost/foo' 'Host:api.example.com'"
+ " 'Content-Type:application/json' 'a:alpha'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo")
.header(HttpHeaders.HOST, "api.example.com")
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.header("a", "alpha").build());
assertThat(this.generatedSnippets.httpieRequest()).is(codeBlock("bash")
.withContent("$ http GET 'http://localhost/foo' 'Host:api.example.com'"
+ " 'Content-Type:application/json' 'a:alpha'"));
}
@Test
public void postWithContentAndParameters() throws IOException {
this.snippets.expectHttpieRequest().withContents(
codeBlock("bash").content("$ echo 'Some content' | http POST "
+ "'http://localhost/foo?a=alpha&b=bravo'"));
new HttpieRequestSnippet(this.commandFormatter).document(this.operationBuilder
.request("http://localhost/foo").method("POST").param("a", "alpha")
.param("b", "bravo").content("Some content").build());
assertThat(this.generatedSnippets.httpieRequest())
.is(codeBlock("bash").withContent("$ echo 'Some content' | http POST "
+ "'http://localhost/foo?a=alpha&b=bravo'"));
}
}

View File

@@ -22,7 +22,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hamcrest.Matchers;
import org.junit.Test;
import org.springframework.http.HttpHeaders;
@@ -54,13 +53,7 @@ import org.springframework.restdocs.templates.mustache.AsciidoctorTableCellConte
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import org.springframework.test.util.ReflectionTestUtils;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
/**
@@ -78,37 +71,38 @@ public class RestDocumentationConfigurerTests {
public void defaultConfiguration() {
Map<String, Object> configuration = new HashMap<>();
this.configurer.apply(configuration, createContext());
assertThat(configuration, hasEntry(equalTo(TemplateEngine.class.getName()),
instanceOf(MustacheTemplateEngine.class)));
assertThat(configuration, hasEntry(equalTo(WriterResolver.class.getName()),
instanceOf(StandardWriterResolver.class)));
assertThat(configuration,
hasEntry(equalTo(
RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS),
instanceOf(List.class)));
assertThat(configuration).containsKey(TemplateEngine.class.getName());
assertThat(configuration.get(TemplateEngine.class.getName()))
.isInstanceOf(MustacheTemplateEngine.class);
assertThat(configuration).containsKey(WriterResolver.class.getName());
assertThat(configuration.get(WriterResolver.class.getName()))
.isInstanceOf(StandardWriterResolver.class);
assertThat(configuration)
.containsKey(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
assertThat(configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS))
.isInstanceOf(List.class);
List<Snippet> defaultSnippets = (List<Snippet>) configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
assertThat(defaultSnippets,
contains(instanceOf(CurlRequestSnippet.class),
instanceOf(HttpieRequestSnippet.class),
instanceOf(HttpRequestSnippet.class),
instanceOf(HttpResponseSnippet.class),
instanceOf(RequestBodySnippet.class),
instanceOf(ResponseBodySnippet.class)));
assertThat(configuration, hasEntry(equalTo(SnippetConfiguration.class.getName()),
instanceOf(SnippetConfiguration.class)));
assertThat(defaultSnippets).extracting("class").containsExactlyInAnyOrder(
CurlRequestSnippet.class, HttpieRequestSnippet.class,
HttpRequestSnippet.class, HttpResponseSnippet.class,
RequestBodySnippet.class, ResponseBodySnippet.class);
assertThat(configuration).containsKey(SnippetConfiguration.class.getName());
assertThat(configuration.get(SnippetConfiguration.class.getName()))
.isInstanceOf(SnippetConfiguration.class);
SnippetConfiguration snippetConfiguration = (SnippetConfiguration) configuration
.get(SnippetConfiguration.class.getName());
assertThat(snippetConfiguration.getEncoding(), is(equalTo("UTF-8")));
assertThat(snippetConfiguration.getTemplateFormat().getId(),
is(equalTo(TemplateFormats.asciidoctor().getId())));
assertThat(snippetConfiguration.getEncoding()).isEqualTo("UTF-8");
assertThat(snippetConfiguration.getTemplateFormat().getId())
.isEqualTo(TemplateFormats.asciidoctor().getId());
OperationRequestPreprocessor defaultOperationRequestPreprocessor = (OperationRequestPreprocessor) configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR);
assertThat(defaultOperationRequestPreprocessor, is(nullValue()));
assertThat(defaultOperationRequestPreprocessor).isNull();
OperationResponsePreprocessor defaultOperationResponsePreprocessor = (OperationResponsePreprocessor) configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR);
assertThat(defaultOperationResponsePreprocessor, is(nullValue()));
assertThat(defaultOperationResponsePreprocessor).isNull();
}
@Test
@@ -117,8 +111,8 @@ public class RestDocumentationConfigurerTests {
TemplateEngine templateEngine = mock(TemplateEngine.class);
this.configurer.templateEngine(templateEngine).apply(configuration,
createContext());
assertThat(configuration, Matchers.<String, Object>hasEntry(
TemplateEngine.class.getName(), templateEngine));
assertThat(configuration).containsEntry(TemplateEngine.class.getName(),
templateEngine);
}
@Test
@@ -127,8 +121,8 @@ public class RestDocumentationConfigurerTests {
WriterResolver writerResolver = mock(WriterResolver.class);
this.configurer.writerResolver(writerResolver).apply(configuration,
createContext());
assertThat(configuration, Matchers.<String, Object>hasEntry(
WriterResolver.class.getName(), writerResolver));
assertThat(configuration).containsEntry(WriterResolver.class.getName(),
writerResolver);
}
@Test
@@ -136,14 +130,16 @@ public class RestDocumentationConfigurerTests {
Map<String, Object> configuration = new HashMap<>();
this.configurer.snippets().withDefaults(CliDocumentation.curlRequest())
.apply(configuration, createContext());
assertThat(configuration,
hasEntry(equalTo(
RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS),
instanceOf(List.class)));
assertThat(configuration)
.containsKey(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
assertThat(configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS))
.isInstanceOf(List.class);
@SuppressWarnings("unchecked")
List<Snippet> defaultSnippets = (List<Snippet>) configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
assertThat(defaultSnippets, contains(instanceOf(CurlRequestSnippet.class)));
assertThat(defaultSnippets).hasSize(1);
assertThat(defaultSnippets).hasOnlyElementsOfType(CurlRequestSnippet.class);
}
@SuppressWarnings("unchecked")
@@ -153,19 +149,17 @@ public class RestDocumentationConfigurerTests {
Snippet snippet = mock(Snippet.class);
this.configurer.snippets().withAdditionalDefaults(snippet).apply(configuration,
createContext());
assertThat(configuration,
hasEntry(equalTo(
RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS),
instanceOf(List.class)));
assertThat(configuration)
.containsKey(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
assertThat(configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS))
.isInstanceOf(List.class);
List<Snippet> defaultSnippets = (List<Snippet>) configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS);
assertThat(defaultSnippets,
contains(instanceOf(CurlRequestSnippet.class),
instanceOf(HttpieRequestSnippet.class),
instanceOf(HttpRequestSnippet.class),
instanceOf(HttpResponseSnippet.class),
instanceOf(RequestBodySnippet.class),
instanceOf(ResponseBodySnippet.class), equalTo(snippet)));
assertThat(defaultSnippets).extracting("class").containsExactlyInAnyOrder(
CurlRequestSnippet.class, HttpieRequestSnippet.class,
HttpRequestSnippet.class, HttpResponseSnippet.class,
RequestBodySnippet.class, ResponseBodySnippet.class, snippet.getClass());
}
@Test
@@ -173,11 +167,12 @@ public class RestDocumentationConfigurerTests {
Map<String, Object> configuration = new HashMap<>();
this.configurer.snippets().withEncoding("ISO 8859-1").apply(configuration,
createContext());
assertThat(configuration, hasEntry(equalTo(SnippetConfiguration.class.getName()),
instanceOf(SnippetConfiguration.class)));
assertThat(configuration).containsKey(SnippetConfiguration.class.getName());
assertThat(configuration.get(SnippetConfiguration.class.getName()))
.isInstanceOf(SnippetConfiguration.class);
SnippetConfiguration snippetConfiguration = (SnippetConfiguration) configuration
.get(SnippetConfiguration.class.getName());
assertThat(snippetConfiguration.getEncoding(), is(equalTo("ISO 8859-1")));
assertThat(snippetConfiguration.getEncoding()).isEqualTo("ISO 8859-1");
}
@Test
@@ -185,12 +180,13 @@ public class RestDocumentationConfigurerTests {
Map<String, Object> configuration = new HashMap<>();
this.configurer.snippets().withTemplateFormat(TemplateFormats.markdown())
.apply(configuration, createContext());
assertThat(configuration, hasEntry(equalTo(SnippetConfiguration.class.getName()),
instanceOf(SnippetConfiguration.class)));
assertThat(configuration).containsKey(SnippetConfiguration.class.getName());
assertThat(configuration.get(SnippetConfiguration.class.getName()))
.isInstanceOf(SnippetConfiguration.class);
SnippetConfiguration snippetConfiguration = (SnippetConfiguration) configuration
.get(SnippetConfiguration.class.getName());
assertThat(snippetConfiguration.getTemplateFormat().getId(),
is(equalTo(TemplateFormats.markdown().getId())));
assertThat(snippetConfiguration.getTemplateFormat().getId())
.isEqualTo(TemplateFormats.markdown().getId());
}
@SuppressWarnings("unchecked")
@@ -203,8 +199,9 @@ public class RestDocumentationConfigurerTests {
MustacheTemplateEngine mustacheTemplateEngine = (MustacheTemplateEngine) templateEngine;
Map<String, Object> templateContext = (Map<String, Object>) ReflectionTestUtils
.getField(mustacheTemplateEngine, "context");
assertThat(templateContext, hasEntry(equalTo("tableCellContent"),
instanceOf(AsciidoctorTableCellContentLambda.class)));
assertThat(templateContext).containsKey("tableCellContent");
assertThat(templateContext.get("tableCellContent"))
.isInstanceOf(AsciidoctorTableCellContentLambda.class);
}
@SuppressWarnings("unchecked")
@@ -218,7 +215,7 @@ public class RestDocumentationConfigurerTests {
MustacheTemplateEngine mustacheTemplateEngine = (MustacheTemplateEngine) templateEngine;
Map<String, Object> templateContext = (Map<String, Object>) ReflectionTestUtils
.getField(mustacheTemplateEngine, "context");
assertThat(templateContext.size(), equalTo(0));
assertThat(templateContext.size()).isEqualTo(0);
}
@Test
@@ -235,8 +232,8 @@ public class RestDocumentationConfigurerTests {
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()));
assertThat(preprocessor.preprocess(request).getHeaders())
.doesNotContainKey("Foo");
}
@Test
@@ -252,8 +249,8 @@ public class RestDocumentationConfigurerTests {
headers.add("Foo", "value");
OperationResponse response = new OperationResponseFactory().create(HttpStatus.OK,
headers, null);
assertThat(preprocessor.preprocess(response).getHeaders().get("Foo"),
is(nullValue()));
assertThat(preprocessor.preprocess(response).getHeaders())
.doesNotContainKey("Foo");
}
private RestDocumentationContext createContext() {

View File

@@ -21,10 +21,7 @@ import java.util.Collections;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
@@ -56,16 +53,16 @@ public class ConstraintDescriptionsTests {
.willReturn("Bravo");
given(this.constraintDescriptionResolver.resolveDescription(constraint2))
.willReturn("Alpha");
assertThat(this.constraintDescriptions.descriptionsForProperty("foo"),
contains("Alpha", "Bravo"));
assertThat(this.constraintDescriptions.descriptionsForProperty("foo"))
.containsExactly("Alpha", "Bravo");
}
@Test
public void emptyListOfDescriptionsWhenThereAreNoConstraints() {
given(this.constraintResolver.resolveForProperty("foo", Constrained.class))
.willReturn(Collections.<Constraint>emptyList());
assertThat(this.constraintDescriptions.descriptionsForProperty("foo").size(),
is(equalTo(0)));
assertThat(this.constraintDescriptions.descriptionsForProperty("foo").size())
.isEqualTo(0);
}
private static class Constrained {

View File

@@ -65,9 +65,7 @@ import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.util.Assert;
import org.springframework.util.ReflectionUtils;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ResourceBundleConstraintDescriptionResolver}.
@@ -80,217 +78,214 @@ public class ResourceBundleConstraintDescriptionResolverTests {
@Test
public void defaultMessageAssertFalse() {
assertThat(constraintDescriptionForField("assertFalse"),
is(equalTo("Must be false")));
assertThat(constraintDescriptionForField("assertFalse"))
.isEqualTo("Must be false");
}
@Test
public void defaultMessageAssertTrue() {
assertThat(constraintDescriptionForField("assertTrue"),
is(equalTo("Must be true")));
assertThat(constraintDescriptionForField("assertTrue")).isEqualTo("Must be true");
}
@Test
public void defaultMessageCodePointLength() {
assertThat(constraintDescriptionForField("codePointLength"),
is(equalTo("Code point length must be between 2 and 5 inclusive")));
assertThat(constraintDescriptionForField("codePointLength"))
.isEqualTo("Code point length must be between 2 and 5 inclusive");
}
@Test
public void defaultMessageCurrency() {
assertThat(constraintDescriptionForField("currency"),
is(equalTo("Must be in an accepted currency unit (GBP, USD)")));
assertThat(constraintDescriptionForField("currency"))
.isEqualTo("Must be in an accepted currency unit (GBP, USD)");
}
@Test
public void defaultMessageDecimalMax() {
assertThat(constraintDescriptionForField("decimalMax"),
is(equalTo("Must be at most 9.875")));
assertThat(constraintDescriptionForField("decimalMax"))
.isEqualTo("Must be at most 9.875");
}
@Test
public void defaultMessageDecimalMin() {
assertThat(constraintDescriptionForField("decimalMin"),
is(equalTo("Must be at least 1.5")));
assertThat(constraintDescriptionForField("decimalMin"))
.isEqualTo("Must be at least 1.5");
}
@Test
public void defaultMessageDigits() {
assertThat(constraintDescriptionForField("digits"), is(
equalTo("Must have at most 2 integral digits and 5 fractional digits")));
assertThat(constraintDescriptionForField("digits"))
.isEqualTo("Must have at most 2 integral digits and 5 fractional digits");
}
@Test
public void defaultMessageFuture() {
assertThat(constraintDescriptionForField("future"),
is(equalTo("Must be in the future")));
assertThat(constraintDescriptionForField("future"))
.isEqualTo("Must be in the future");
}
@Test
public void defaultMessageFutureOrPresent() {
assertThat(constraintDescriptionForField("futureOrPresent"),
is(equalTo("Must be in the future or the present")));
assertThat(constraintDescriptionForField("futureOrPresent"))
.isEqualTo("Must be in the future or the present");
}
@Test
public void defaultMessageMax() {
assertThat(constraintDescriptionForField("max"),
is(equalTo("Must be at most 10")));
assertThat(constraintDescriptionForField("max")).isEqualTo("Must be at most 10");
}
@Test
public void defaultMessageMin() {
assertThat(constraintDescriptionForField("min"),
is(equalTo("Must be at least 10")));
assertThat(constraintDescriptionForField("min")).isEqualTo("Must be at least 10");
}
@Test
public void defaultMessageNotNull() {
assertThat(constraintDescriptionForField("notNull"),
is(equalTo("Must not be null")));
assertThat(constraintDescriptionForField("notNull"))
.isEqualTo("Must not be null");
}
@Test
public void defaultMessageNull() {
assertThat(constraintDescriptionForField("nul"), is(equalTo("Must be null")));
assertThat(constraintDescriptionForField("nul")).isEqualTo("Must be null");
}
@Test
public void defaultMessagePast() {
assertThat(constraintDescriptionForField("past"),
is(equalTo("Must be in the past")));
assertThat(constraintDescriptionForField("past"))
.isEqualTo("Must be in the past");
}
@Test
public void defaultMessagePastOrPresent() {
assertThat(constraintDescriptionForField("pastOrPresent"),
is(equalTo("Must be in the past or the present")));
assertThat(constraintDescriptionForField("pastOrPresent"))
.isEqualTo("Must be in the past or the present");
}
@Test
public void defaultMessagePattern() {
assertThat(constraintDescriptionForField("pattern"),
is(equalTo("Must match the regular expression `[A-Z][a-z]+`")));
assertThat(constraintDescriptionForField("pattern"))
.isEqualTo("Must match the regular expression `[A-Z][a-z]+`");
}
@Test
public void defaultMessageSize() {
assertThat(constraintDescriptionForField("size"),
is(equalTo("Size must be between 2 and 10 inclusive")));
assertThat(constraintDescriptionForField("size"))
.isEqualTo("Size must be between 2 and 10 inclusive");
}
@Test
public void defaultMessageCreditCardNumber() {
assertThat(constraintDescriptionForField("creditCardNumber"),
is(equalTo("Must be a well-formed credit card number")));
assertThat(constraintDescriptionForField("creditCardNumber"))
.isEqualTo("Must be a well-formed credit card number");
}
@Test
public void defaultMessageEan() {
assertThat(constraintDescriptionForField("ean"),
is(equalTo("Must be a well-formed EAN13 number")));
assertThat(constraintDescriptionForField("ean"))
.isEqualTo("Must be a well-formed EAN13 number");
}
@Test
public void defaultMessageEmail() {
assertThat(constraintDescriptionForField("email"),
is(equalTo("Must be a well-formed email address")));
assertThat(constraintDescriptionForField("email"))
.isEqualTo("Must be a well-formed email address");
}
@Test
public void defaultMessageEmailHibernateValidator() {
assertThat(constraintDescriptionForField("emailHibernateValidator"),
is(equalTo("Must be a well-formed email address")));
assertThat(constraintDescriptionForField("emailHibernateValidator"))
.isEqualTo("Must be a well-formed email address");
}
@Test
public void defaultMessageLength() {
assertThat(constraintDescriptionForField("length"),
is(equalTo("Length must be between 2 and 10 inclusive")));
assertThat(constraintDescriptionForField("length"))
.isEqualTo("Length must be between 2 and 10 inclusive");
}
@Test
public void defaultMessageLuhnCheck() {
assertThat(constraintDescriptionForField("luhnCheck"),
is(equalTo("Must pass the Luhn Modulo 10 checksum algorithm")));
assertThat(constraintDescriptionForField("luhnCheck"))
.isEqualTo("Must pass the Luhn Modulo 10 checksum algorithm");
}
@Test
public void defaultMessageMod10Check() {
assertThat(constraintDescriptionForField("mod10Check"),
is(equalTo("Must pass the Mod10 checksum algorithm")));
assertThat(constraintDescriptionForField("mod10Check"))
.isEqualTo("Must pass the Mod10 checksum algorithm");
}
@Test
public void defaultMessageMod11Check() {
assertThat(constraintDescriptionForField("mod11Check"),
is(equalTo("Must pass the Mod11 checksum algorithm")));
assertThat(constraintDescriptionForField("mod11Check"))
.isEqualTo("Must pass the Mod11 checksum algorithm");
}
@Test
public void defaultMessageNegative() {
assertThat(constraintDescriptionForField("negative"),
is(equalTo("Must be negative")));
assertThat(constraintDescriptionForField("negative"))
.isEqualTo("Must be negative");
}
@Test
public void defaultMessageNegativeOrZero() {
assertThat(constraintDescriptionForField("negativeOrZero"),
is(equalTo("Must be negative or zero")));
assertThat(constraintDescriptionForField("negativeOrZero"))
.isEqualTo("Must be negative or zero");
}
@Test
public void defaultMessageNotBlank() {
assertThat(constraintDescriptionForField("notBlank"),
is(equalTo("Must not be blank")));
assertThat(constraintDescriptionForField("notBlank"))
.isEqualTo("Must not be blank");
}
@Test
public void defaultMessageNotBlankHibernateValidator() {
assertThat(constraintDescriptionForField("notBlankHibernateValidator"),
is(equalTo("Must not be blank")));
assertThat(constraintDescriptionForField("notBlankHibernateValidator"))
.isEqualTo("Must not be blank");
}
@Test
public void defaultMessageNotEmpty() {
assertThat(constraintDescriptionForField("notEmpty"),
is(equalTo("Must not be empty")));
assertThat(constraintDescriptionForField("notEmpty"))
.isEqualTo("Must not be empty");
}
@Test
public void defaultMessageNotEmptyHibernateValidator() {
assertThat(constraintDescriptionForField("notEmpty"),
is(equalTo("Must not be empty")));
assertThat(constraintDescriptionForField("notEmpty"))
.isEqualTo("Must not be empty");
}
@Test
public void defaultMessagePositive() {
assertThat(constraintDescriptionForField("positive"),
is(equalTo("Must be positive")));
assertThat(constraintDescriptionForField("positive"))
.isEqualTo("Must be positive");
}
@Test
public void defaultMessagePositiveOrZero() {
assertThat(constraintDescriptionForField("positiveOrZero"),
is(equalTo("Must be positive or zero")));
assertThat(constraintDescriptionForField("positiveOrZero"))
.isEqualTo("Must be positive or zero");
}
@Test
public void defaultMessageRange() {
assertThat(constraintDescriptionForField("range"),
is(equalTo("Must be at least 10 and at most 100")));
assertThat(constraintDescriptionForField("range"))
.isEqualTo("Must be at least 10 and at most 100");
}
@Test
public void defaultMessageSafeHtml() {
assertThat(constraintDescriptionForField("safeHtml"),
is(equalTo("Must be safe HTML")));
assertThat(constraintDescriptionForField("safeHtml"))
.isEqualTo("Must be safe HTML");
}
@Test
public void defaultMessageUrl() {
assertThat(constraintDescriptionForField("url"),
is(equalTo("Must be a well-formed URL")));
assertThat(constraintDescriptionForField("url"))
.isEqualTo("Must be a well-formed URL");
}
@Test
@@ -313,7 +308,7 @@ public class ResourceBundleConstraintDescriptionResolverTests {
String description = new ResourceBundleConstraintDescriptionResolver()
.resolveDescription(new Constraint(NotNull.class.getName(),
Collections.<String, Object>emptyMap()));
assertThat(description, is(equalTo("Should not be null")));
assertThat(description).isEqualTo("Should not be null");
}
finally {
@@ -335,7 +330,7 @@ public class ResourceBundleConstraintDescriptionResolverTests {
String description = new ResourceBundleConstraintDescriptionResolver(bundle)
.resolveDescription(new Constraint(NotNull.class.getName(),
Collections.<String, Object>emptyMap()));
assertThat(description, is(equalTo("Not null")));
assertThat(description).isEqualTo("Not null");
}
private String constraintDescriptionForField(String name) {

View File

@@ -32,16 +32,13 @@ import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
import javax.validation.constraints.Size;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.assertj.core.api.Condition;
import org.assertj.core.description.TextDescription;
import org.hibernate.validator.constraints.CompositionType;
import org.hibernate.validator.constraints.ConstraintComposition;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.hasSize;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ValidatorConstraintResolver}.
@@ -56,36 +53,36 @@ public class ValidatorConstraintResolverTests {
public void singleFieldConstraint() {
List<Constraint> constraints = this.resolver.resolveForProperty("single",
ConstrainedFields.class);
assertThat(constraints, hasSize(1));
assertThat(constraints.get(0).getName(), is(NotNull.class.getName()));
assertThat(constraints).hasSize(1);
assertThat(constraints.get(0).getName()).isEqualTo(NotNull.class.getName());
}
@SuppressWarnings("unchecked")
@Test
public void multipleFieldConstraints() {
List<Constraint> constraints = this.resolver.resolveForProperty("multiple",
ConstrainedFields.class);
assertThat(constraints, hasSize(2));
assertThat(constraints, containsInAnyOrder(constraint(NotNull.class),
constraint(Size.class).config("min", 8).config("max", 16)));
assertThat(constraints).hasSize(2);
assertThat(constraints.get(0)).is(constraint(NotNull.class));
assertThat(constraints.get(1))
.is(constraint(Size.class).config("min", 8).config("max", 16));
}
@Test
public void noFieldConstraints() {
List<Constraint> constraints = this.resolver.resolveForProperty("none",
ConstrainedFields.class);
assertThat(constraints, hasSize(0));
assertThat(constraints).hasSize(0);
}
@Test
public void compositeConstraint() {
List<Constraint> constraints = this.resolver.resolveForProperty("composite",
ConstrainedFields.class);
assertThat(constraints, hasSize(1));
assertThat(constraints).hasSize(1);
}
private ConstraintMatcher constraint(final Class<? extends Annotation> annotation) {
return new ConstraintMatcher(annotation);
private ConstraintCondition constraint(final Class<? extends Annotation> annotation) {
return new ConstraintCondition(annotation);
}
private static class ConstrainedFields {
@@ -121,27 +118,25 @@ public class ValidatorConstraintResolverTests {
}
private static final class ConstraintMatcher extends BaseMatcher<Constraint> {
private static final class ConstraintCondition extends Condition<Constraint> {
private final Class<?> annotation;
private final Map<String, Object> configuration = new HashMap<>();
private ConstraintMatcher(Class<?> annotation) {
private ConstraintCondition(Class<?> annotation) {
this.annotation = annotation;
as(new TextDescription("Constraint named %s with configuration %s",
this.annotation, this.configuration));
}
public ConstraintMatcher config(String key, Object value) {
public ConstraintCondition config(String key, Object value) {
this.configuration.put(key, value);
return this;
}
@Override
public boolean matches(Object item) {
if (!(item instanceof Constraint)) {
return false;
}
Constraint constraint = (Constraint) item;
public boolean matches(Constraint constraint) {
if (!constraint.getName().equals(this.annotation.getName())) {
return false;
}
@@ -154,12 +149,6 @@ public class ValidatorConstraintResolverTests {
return true;
}
@Override
public void describeTo(Description description) {
description.appendText("Constraint named " + this.annotation.getName()
+ " with configuration " + this.configuration);
}
}
}

View File

@@ -24,7 +24,6 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.endsWith;
@@ -43,9 +42,6 @@ public class RequestHeadersSnippetFailureTests {
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
@Rule
public ExpectedException thrown = ExpectedException.none();

View File

@@ -28,7 +28,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
@@ -49,12 +49,6 @@ public class RequestHeadersSnippetTests extends AbstractSnippetTests {
@Test
public void requestWithHeaders() throws IOException {
this.snippets.expectRequestHeaders()
.withContents(tableWithHeader("Name", "Description")
.row("`X-Test`", "one").row("`Accept`", "two")
.row("`Accept-Encoding`", "three")
.row("`Accept-Language`", "four").row("`Cache-Control`", "five")
.row("`Connection`", "six"));
new RequestHeadersSnippet(
Arrays.asList(headerWithName("X-Test").description("one"),
headerWithName("Accept").description("two"),
@@ -68,32 +62,36 @@ public class RequestHeadersSnippetTests extends AbstractSnippetTests {
.header("Accept-Language", "en-US,en;q=0.5")
.header("Cache-Control", "max-age=0")
.header("Connection", "keep-alive").build());
assertThat(this.generatedSnippets.requestHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one")
.row("`Accept`", "two").row("`Accept-Encoding`", "three")
.row("`Accept-Language`", "four").row("`Cache-Control`", "five")
.row("`Connection`", "six"));
}
@Test
public void caseInsensitiveRequestHeaders() throws IOException {
this.snippets.expectRequestHeaders().withContents(
tableWithHeader("Name", "Description").row("`X-Test`", "one"));
new RequestHeadersSnippet(
Arrays.asList(headerWithName("X-Test").description("one")))
.document(this.operationBuilder.request("/")
.header("X-test", "test").build());
assertThat(this.generatedSnippets.requestHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one"));
}
@Test
public void undocumentedRequestHeader() throws IOException {
this.snippets.expectRequestHeaders().withContents(
tableWithHeader("Name", "Description").row("`X-Test`", "one"));
new RequestHeadersSnippet(
Arrays.asList(headerWithName("X-Test").description("one")))
.document(this.operationBuilder.request("http://localhost")
.header("X-Test", "test").header("Accept", "*/*")
.build());
assertThat(this.generatedSnippets.requestHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one"));
}
@Test
public void requestHeadersWithCustomAttributes() throws IOException {
this.snippets.expectRequestHeaders().withContents(containsString("Custom title"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-headers"))
.willReturn(snippetResource("request-headers-with-title"));
@@ -107,15 +105,11 @@ public class RequestHeadersSnippetTests extends AbstractSnippetTests {
resolver))
.request("http://localhost")
.header("X-Test", "test").build());
assertThat(this.generatedSnippets.requestHeaders()).contains("Custom title");
}
@Test
public void requestHeadersWithCustomDescriptorAttributes() throws IOException {
this.snippets.expectRequestHeaders().withContents(//
tableWithHeader("Name", "Description", "Foo")
.row("X-Test", "one", "alpha")
.row("Accept-Encoding", "two", "bravo")
.row("Accept", "three", "charlie"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-headers"))
.willReturn(snippetResource("request-headers-with-extra-column"));
@@ -136,16 +130,15 @@ public class RequestHeadersSnippetTests extends AbstractSnippetTests {
.header("Accept-Encoding",
"gzip, deflate")
.header("Accept", "*/*").build());
assertThat(this.generatedSnippets.requestHeaders()).is(//
tableWithHeader("Name", "Description", "Foo")
.row("X-Test", "one", "alpha")
.row("Accept-Encoding", "two", "bravo")
.row("Accept", "three", "charlie"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectRequestHeaders()
.withContents(tableWithHeader("Name", "Description")
.row("`X-Test`", "one").row("`Accept`", "two")
.row("`Accept-Encoding`", "three")
.row("`Accept-Language`", "four").row("`Cache-Control`", "five")
.row("`Connection`", "six"));
HeaderDocumentation
.requestHeaders(headerWithName("X-Test").description("one"),
headerWithName("Accept").description("two"),
@@ -159,17 +152,22 @@ public class RequestHeadersSnippetTests extends AbstractSnippetTests {
.header("Accept-Language", "en-US,en;q=0.5")
.header("Cache-Control", "max-age=0")
.header("Connection", "keep-alive").build());
assertThat(this.generatedSnippets.requestHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one")
.row("`Accept`", "two").row("`Accept-Encoding`", "three")
.row("`Accept-Language`", "four").row("`Cache-Control`", "five")
.row("`Connection`", "six"));
}
@Test
public void tableCellContentIsEscapedWhenNecessary() throws IOException {
this.snippets.expectRequestHeaders().withContents(
tableWithHeader("Name", "Description").row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
new RequestHeadersSnippet(
Arrays.asList(headerWithName("Foo|Bar").description("one|two")))
.document(this.operationBuilder.request("http://localhost")
.header("Foo|Bar", "baz").build());
assertThat(this.generatedSnippets.requestHeaders()).is(
tableWithHeader("Name", "Description").row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
}
private String escapeIfNecessary(String input) {

View File

@@ -24,7 +24,6 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.endsWith;
@@ -43,9 +42,6 @@ public class ResponseHeadersSnippetFailureTests {
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
@Rule
public ExpectedException thrown = ExpectedException.none();

View File

@@ -28,7 +28,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
@@ -49,10 +49,6 @@ public class ResponseHeadersSnippetTests extends AbstractSnippetTests {
@Test
public void responseWithHeaders() throws IOException {
this.snippets.expectResponseHeaders().withContents(
tableWithHeader("Name", "Description").row("`X-Test`", "one")
.row("`Content-Type`", "two").row("`Etag`", "three")
.row("`Cache-Control`", "five").row("`Vary`", "six"));
new ResponseHeadersSnippet(
Arrays.asList(headerWithName("X-Test").description("one"),
headerWithName("Content-Type").description("two"),
@@ -64,32 +60,34 @@ public class ResponseHeadersSnippetTests extends AbstractSnippetTests {
.header("Etag", "lskjadldj3ii32l2ij23")
.header("Cache-Control", "max-age=0")
.header("Vary", "User-Agent").build());
assertThat(this.generatedSnippets.responseHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one")
.row("`Content-Type`", "two").row("`Etag`", "three")
.row("`Cache-Control`", "five").row("`Vary`", "six"));
}
@Test
public void caseInsensitiveResponseHeaders() throws IOException {
this.snippets.expectResponseHeaders().withContents(
tableWithHeader("Name", "Description").row("`X-Test`", "one"));
new ResponseHeadersSnippet(
Arrays.asList(headerWithName("X-Test").description("one")))
.document(this.operationBuilder.response()
.header("X-test", "test").build());
assertThat(this.generatedSnippets.responseHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one"));
}
@Test
public void undocumentedResponseHeader() throws IOException {
this.snippets.expectResponseHeaders().withContents(
tableWithHeader("Name", "Description").row("`X-Test`", "one"));
new ResponseHeadersSnippet(
Arrays.asList(headerWithName("X-Test").description("one"))).document(
this.operationBuilder.response().header("X-Test", "test")
.header("Content-Type", "*/*").build());
assertThat(this.generatedSnippets.responseHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one"));
}
@Test
public void responseHeadersWithCustomAttributes() throws IOException {
this.snippets.expectResponseHeaders()
.withContents(containsString("Custom title"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("response-headers"))
.willReturn(snippetResource("response-headers-with-title"));
@@ -103,14 +101,11 @@ public class ResponseHeadersSnippetTests extends AbstractSnippetTests {
resolver))
.response().header("X-Test", "test")
.build());
assertThat(this.generatedSnippets.responseHeaders()).contains("Custom title");
}
@Test
public void responseHeadersWithCustomDescriptorAttributes() throws IOException {
this.snippets.expectResponseHeaders()
.withContents(tableWithHeader("Name", "Description", "Foo")
.row("X-Test", "one", "alpha").row("Content-Type", "two", "bravo")
.row("Etag", "three", "charlie"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("response-headers"))
.willReturn(snippetResource("response-headers-with-extra-column"));
@@ -131,14 +126,14 @@ public class ResponseHeadersSnippetTests extends AbstractSnippetTests {
"application/json")
.header("Etag", "lskjadldj3ii32l2ij23")
.build());
assertThat(this.generatedSnippets.responseHeaders())
.is(tableWithHeader("Name", "Description", "Foo")
.row("X-Test", "one", "alpha").row("Content-Type", "two", "bravo")
.row("Etag", "three", "charlie"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectResponseHeaders().withContents(
tableWithHeader("Name", "Description").row("`X-Test`", "one")
.row("`Content-Type`", "two").row("`Etag`", "three")
.row("`Cache-Control`", "five").row("`Vary`", "six"));
HeaderDocumentation
.responseHeaders(headerWithName("X-Test").description("one"),
headerWithName("Content-Type").description("two"),
@@ -150,17 +145,21 @@ public class ResponseHeadersSnippetTests extends AbstractSnippetTests {
.header("Etag", "lskjadldj3ii32l2ij23")
.header("Cache-Control", "max-age=0").header("Vary", "User-Agent")
.build());
assertThat(this.generatedSnippets.responseHeaders())
.is(tableWithHeader("Name", "Description").row("`X-Test`", "one")
.row("`Content-Type`", "two").row("`Etag`", "three")
.row("`Cache-Control`", "five").row("`Vary`", "six"));
}
@Test
public void tableCellContentIsEscapedWhenNecessary() throws IOException {
this.snippets.expectResponseHeaders().withContents(
tableWithHeader("Name", "Description").row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
new ResponseHeadersSnippet(
Arrays.asList(headerWithName("Foo|Bar").description("one|two")))
.document(this.operationBuilder.response()
.header("Foo|Bar", "baz").build());
assertThat(this.generatedSnippets.responseHeaders()).is(
tableWithHeader("Name", "Description").row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
}
private String escapeIfNecessary(String input) {

View File

@@ -29,7 +29,7 @@ import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import org.springframework.web.bind.annotation.RequestMethod;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.snippet.Attributes.attributes;
@@ -51,274 +51,262 @@ public class HttpRequestSnippetTests extends AbstractSnippetTests {
@Test
public void getRequest() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo").header("Alpha", "a")
.header(HttpHeaders.HOST, "localhost"));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo").header("Alpha", "a").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo").header("Alpha", "a")
.header(HttpHeaders.HOST, "localhost"));
}
@Test
public void getRequestWithParameters() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo?b=bravo")
.header("Alpha", "a").header(HttpHeaders.HOST, "localhost"));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo")
.header("Alpha", "a").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo?b=bravo").header("Alpha", "a")
.header(HttpHeaders.HOST, "localhost"));
}
@Test
public void getRequestWithPort() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo").header("Alpha", "a")
.header(HttpHeaders.HOST, "localhost:8080"));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost:8080/foo").header("Alpha", "a").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo").header("Alpha", "a")
.header(HttpHeaders.HOST, "localhost:8080"));
}
@Test
public void getRequestWithCookies() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo")
.header(HttpHeaders.HOST, "localhost")
.header(HttpHeaders.COOKIE, "name1=value1")
.header(HttpHeaders.COOKIE, "name2=value2"));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo")
.cookie("name1", "value1").cookie("name2", "value2").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo")
.header(HttpHeaders.HOST, "localhost")
.header(HttpHeaders.COOKIE, "name1=value1")
.header(HttpHeaders.COOKIE, "name2=value2"));
}
@Test
public void getRequestWithQueryString() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo?bar=baz")
.header(HttpHeaders.HOST, "localhost"));
new HttpRequestSnippet().document(
this.operationBuilder.request("http://localhost/foo?bar=baz").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo?bar=baz")
.header(HttpHeaders.HOST, "localhost"));
}
@Test
public void getRequestWithQueryStringWithNoValue() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo?bar")
.header(HttpHeaders.HOST, "localhost"));
new HttpRequestSnippet().document(
this.operationBuilder.request("http://localhost/foo?bar").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo?bar").header(HttpHeaders.HOST,
"localhost"));
}
@Test
public void getWithPartiallyOverlappingQueryStringAndParameters() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo?a=alpha&b=bravo")
.header(HttpHeaders.HOST, "localhost"));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo?a=alpha")
.param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo?a=alpha&b=bravo")
.header(HttpHeaders.HOST, "localhost"));
}
@Test
public void getWithTotallyOverlappingQueryStringAndParameters() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo?a=alpha&b=bravo")
.header(HttpHeaders.HOST, "localhost"));
new HttpRequestSnippet().document(
this.operationBuilder.request("http://localhost/foo?a=alpha&b=bravo")
.param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo?a=alpha&b=bravo")
.header(HttpHeaders.HOST, "localhost"));
}
@Test
public void postRequestWithContent() throws IOException {
String content = "Hello, world";
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo").method("POST").content(content).build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void postRequestWithContentAndParameters() throws IOException {
String content = "Hello, world";
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo?a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo")
.method("POST").param("a", "alpha").content(content).build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo?a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void postRequestWithContentAndDisjointQueryStringAndParameters()
throws IOException {
String content = "Hello, world";
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo?b=bravo&a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo?b=bravo")
.method("POST").param("a", "alpha").content(content).build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo?b=bravo&a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void postRequestWithContentAndPartiallyOverlappingQueryStringAndParameters()
throws IOException {
String content = "Hello, world";
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo?b=bravo&a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo?b=bravo").method("POST")
.param("a", "alpha").param("b", "bravo").content(content).build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo?b=bravo&a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void postRequestWithContentAndTotallyOverlappingQueryStringAndParameters()
throws IOException {
String content = "Hello, world";
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo?b=bravo&a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo?b=bravo&a=alpha").method("POST")
.param("a", "alpha").param("b", "bravo").content(content).build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo?b=bravo&a=alpha")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void postRequestWithOverlappingParametersAndFormUrlEncodedBody()
throws IOException {
String content = "a=alpha&b=bravo";
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo").method("POST").content("a=alpha&b=bravo")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.param("a", "alpha").param("b", "bravo").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_FORM_URLENCODED_VALUE)
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void postRequestWithCharset() throws IOException {
String japaneseContent = "\u30b3\u30f3\u30c6\u30f3\u30c4";
byte[] contentBytes = japaneseContent.getBytes("UTF-8");
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo")
.header("Content-Type", "text/plain;charset=UTF-8")
.header(HttpHeaders.HOST, "localhost")
.header(HttpHeaders.CONTENT_LENGTH, contentBytes.length)
.content(japaneseContent));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo")
.method("POST").header("Content-Type", "text/plain;charset=UTF-8")
.content(contentBytes).build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo")
.header("Content-Type", "text/plain;charset=UTF-8")
.header(HttpHeaders.HOST, "localhost")
.header(HttpHeaders.CONTENT_LENGTH, contentBytes.length)
.content(japaneseContent));
}
@Test
public void postRequestWithParameter() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo")
.header(HttpHeaders.HOST, "localhost")
.header("Content-Type", "application/x-www-form-urlencoded")
.content("b%26r=baz&a=alpha"));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo")
.method("POST").param("b&r", "baz").param("a", "alpha").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo")
.header(HttpHeaders.HOST, "localhost")
.header("Content-Type", "application/x-www-form-urlencoded")
.content("b%26r=baz&a=alpha"));
}
@Test
public void postRequestWithParameterWithNoValue() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/foo")
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo").method("POST").param("bar").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/foo")
.header(HttpHeaders.HOST, "localhost")
.header("Content-Type", "application/x-www-form-urlencoded")
.content("bar="));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo").method("POST").param("bar").build());
}
@Test
public void putRequestWithContent() throws IOException {
String content = "Hello, world";
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.PUT, "/foo")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/foo").method("PUT").content(content).build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.PUT, "/foo")
.header(HttpHeaders.HOST, "localhost").content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void putRequestWithParameter() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.PUT, "/foo")
.header(HttpHeaders.HOST, "localhost")
.header("Content-Type", "application/x-www-form-urlencoded")
.content("b%26r=baz&a=alpha"));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo")
.method("PUT").param("b&r", "baz").param("a", "alpha").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.PUT, "/foo")
.header(HttpHeaders.HOST, "localhost")
.header("Content-Type", "application/x-www-form-urlencoded")
.content("b%26r=baz&a=alpha"));
}
@Test
public void multipartPost() throws IOException {
String expectedContent = createPart(String.format(
"Content-Disposition: " + "form-data; " + "name=image%n%n<< data >>"));
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", "<< data >>".getBytes()).build());
String expectedContent = createPart(String.format(
"Content-Disposition: " + "form-data; " + "name=image%n%n<< data >>"));
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
}
@Test
public void multipartPostWithFilename() throws IOException {
String expectedContent = createPart(String.format("Content-Disposition: "
+ "form-data; " + "name=image; filename=image.png%n%n<< data >>"));
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", "<< data >>".getBytes()).submittedFileName("image.png")
.build());
String expectedContent = createPart(String.format("Content-Disposition: "
+ "form-data; " + "name=image; filename=image.png%n%n<< data >>"));
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
}
@Test
public void multipartPostWithParameters() throws IOException {
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.param("a", "apple", "avocado").param("b", "banana")
.part("image", "<< data >>".getBytes()).build());
String param1Part = createPart(
String.format("Content-Disposition: form-data; " + "name=a%n%napple"),
false);
@@ -331,67 +319,60 @@ public class HttpRequestSnippetTests extends AbstractSnippetTests {
String filePart = createPart(String
.format("Content-Disposition: form-data; " + "name=image%n%n<< data >>"));
String expectedContent = param1Part + param2Part + param3Part + filePart;
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/upload")
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.param("a", "apple", "avocado").param("b", "banana")
.part("image", "<< data >>".getBytes()).build());
}
@Test
public void multipartPostWithParameterWithNoValue() throws IOException {
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.param("a").part("image", "<< data >>".getBytes()).build());
String paramPart = createPart(
String.format("Content-Disposition: form-data; " + "name=a%n"), false);
String filePart = createPart(String
.format("Content-Disposition: form-data; " + "name=image%n%n<< data >>"));
String expectedContent = paramPart + filePart;
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/upload")
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.param("a").part("image", "<< data >>".getBytes()).build());
}
@Test
public void multipartPostWithContentType() throws IOException {
String expectedContent = createPart(
String.format("Content-Disposition: form-data; name=image%nContent-Type: "
+ "image/png%n%n<< data >>"));
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
new HttpRequestSnippet().document(this.operationBuilder
.request("http://localhost/upload").method("POST")
.header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE)
.part("image", "<< data >>".getBytes())
.header(HttpHeaders.CONTENT_TYPE, MediaType.IMAGE_PNG_VALUE).build());
String expectedContent = createPart(
String.format("Content-Disposition: form-data; name=image%nContent-Type: "
+ "image/png%n%n<< data >>"));
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.POST, "/upload")
.header("Content-Type",
"multipart/form-data; boundary=" + BOUNDARY)
.header(HttpHeaders.HOST, "localhost").content(expectedContent));
}
@Test
public void getRequestWithCustomHost() throws IOException {
this.snippets.expectHttpRequest()
.withContents(httpRequest(RequestMethod.GET, "/foo")
.header(HttpHeaders.HOST, "api.example.com"));
new HttpRequestSnippet()
.document(this.operationBuilder.request("http://localhost/foo")
.header(HttpHeaders.HOST, "api.example.com").build());
assertThat(this.generatedSnippets.httpRequest())
.is(httpRequest(RequestMethod.GET, "/foo").header(HttpHeaders.HOST,
"api.example.com"));
}
@Test
public void requestWithCustomSnippetAttributes() throws IOException {
this.snippets.expectHttpRequest()
.withContents(containsString("Title for the request"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("http-request"))
.willReturn(snippetResource("http-request-with-title"));
@@ -400,6 +381,8 @@ public class HttpRequestSnippetTests extends AbstractSnippetTests {
.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.request("http://localhost/foo").build());
assertThat(this.generatedSnippets.httpRequest())
.contains("Title for the request");
}
private String createPart(String content) {

View File

@@ -29,7 +29,7 @@ import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.snippet.Attributes.attributes;
@@ -49,61 +49,60 @@ public class HttpResponseSnippetTests extends AbstractSnippetTests {
@Test
public void basicResponse() throws IOException {
this.snippets.expectHttpResponse().withContents(httpResponse(HttpStatus.OK));
new HttpResponseSnippet().document(this.operationBuilder.build());
assertThat(this.generatedSnippets.httpResponse()).is(httpResponse(HttpStatus.OK));
}
@Test
public void nonOkResponse() throws IOException {
this.snippets.expectHttpResponse()
.withContents(httpResponse(HttpStatus.BAD_REQUEST));
new HttpResponseSnippet().document(this.operationBuilder.response()
.status(HttpStatus.BAD_REQUEST.value()).build());
assertThat(this.generatedSnippets.httpResponse())
.is(httpResponse(HttpStatus.BAD_REQUEST));
}
@Test
public void responseWithHeaders() throws IOException {
this.snippets.expectHttpResponse().withContents(httpResponse(HttpStatus.OK)
.header("Content-Type", "application/json").header("a", "alpha"));
new HttpResponseSnippet().document(this.operationBuilder.response()
.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.header("a", "alpha").build());
assertThat(this.generatedSnippets.httpResponse()).is(httpResponse(HttpStatus.OK)
.header("Content-Type", "application/json").header("a", "alpha"));
}
@Test
public void responseWithContent() throws IOException {
String content = "content";
this.snippets.expectHttpResponse()
.withContents(httpResponse(HttpStatus.OK).content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
new HttpResponseSnippet()
.document(this.operationBuilder.response().content(content).build());
assertThat(this.generatedSnippets.httpResponse())
.is(httpResponse(HttpStatus.OK).content(content)
.header(HttpHeaders.CONTENT_LENGTH, content.getBytes().length));
}
@Test
public void responseWithCharset() throws IOException {
String japaneseContent = "\u30b3\u30f3\u30c6\u30f3\u30c4";
byte[] contentBytes = japaneseContent.getBytes("UTF-8");
this.snippets.expectHttpResponse()
.withContents(httpResponse(HttpStatus.OK)
.header("Content-Type", "text/plain;charset=UTF-8")
.content(japaneseContent)
.header(HttpHeaders.CONTENT_LENGTH, contentBytes.length));
new HttpResponseSnippet().document(this.operationBuilder.response()
.header("Content-Type", "text/plain;charset=UTF-8").content(contentBytes)
.build());
assertThat(this.generatedSnippets.httpResponse()).is(httpResponse(HttpStatus.OK)
.header("Content-Type", "text/plain;charset=UTF-8")
.content(japaneseContent)
.header(HttpHeaders.CONTENT_LENGTH, contentBytes.length));
}
@Test
public void responseWithCustomSnippetAttributes() throws IOException {
this.snippets.expectHttpResponse()
.withContents(containsString("Title for the response"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("http-response"))
.willReturn(snippetResource("http-response-with-title"));
new HttpResponseSnippet(attributes(key("title").value("Title for the response")))
.document(this.operationBuilder.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver)).build());
assertThat(this.generatedSnippets.httpResponse())
.contains("Title for the response");
}
}

View File

@@ -36,7 +36,7 @@ import org.springframework.util.FileCopyUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import static org.junit.Assert.assertEquals;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Parameterized tests for {@link HalLinkExtractor} and {@link AtomLinkExtractor} with
@@ -109,7 +109,7 @@ public class LinkExtractorsPayloadTests {
for (Link expectedLink : expectedLinks) {
expectedLinksByRel.add(expectedLink.getRel(), expectedLink);
}
assertEquals(expectedLinksByRel, actualLinks);
assertThat(actualLinks).isEqualTo(expectedLinksByRel);
}
private OperationResponse createResponse(String contentName) throws IOException {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -25,7 +25,6 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.equalTo;
@@ -42,9 +41,6 @@ public class LinksSnippetFailureTests {
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
@Rule
public ExpectedException thrown = ExpectedException.none();

View File

@@ -28,7 +28,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.snippet.Attributes.attributes;
@@ -47,68 +47,68 @@ public class LinksSnippetTests extends AbstractSnippetTests {
@Test
public void ignoredLink() throws IOException {
this.snippets.expectLinks().withContents(
tableWithHeader("Relation", "Description").row("`b`", "Link b"));
new LinksSnippet(
new StubLinkExtractor().withLinks(new Link("a", "alpha"),
new Link("b", "bravo")),
Arrays.asList(new LinkDescriptor("a").ignored(),
new LinkDescriptor("b").description("Link b")))
.document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row("`b`", "Link b"));
}
@Test
public void allUndocumentedLinksCanBeIgnored() throws IOException {
this.snippets.expectLinks().withContents(
tableWithHeader("Relation", "Description").row("`b`", "Link b"));
new LinksSnippet(
new StubLinkExtractor().withLinks(new Link("a", "alpha"),
new Link("b", "bravo")),
Arrays.asList(new LinkDescriptor("b").description("Link b")), true)
.document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row("`b`", "Link b"));
}
@Test
public void presentOptionalLink() throws IOException {
this.snippets.expectLinks().withContents(
tableWithHeader("Relation", "Description").row("`foo`", "bar"));
new LinksSnippet(new StubLinkExtractor().withLinks(new Link("foo", "blah")),
Arrays.asList(new LinkDescriptor("foo").description("bar").optional()))
.document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row("`foo`", "bar"));
}
@Test
public void missingOptionalLink() throws IOException {
this.snippets.expectLinks().withContents(
tableWithHeader("Relation", "Description").row("`foo`", "bar"));
new LinksSnippet(new StubLinkExtractor(),
Arrays.asList(new LinkDescriptor("foo").description("bar").optional()))
.document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row("`foo`", "bar"));
}
@Test
public void documentedLinks() throws IOException {
this.snippets.expectLinks()
.withContents(tableWithHeader("Relation", "Description").row("`a`", "one")
.row("`b`", "two"));
new LinksSnippet(
new StubLinkExtractor().withLinks(new Link("a", "alpha"),
new Link("b", "bravo")),
Arrays.asList(new LinkDescriptor("a").description("one"),
new LinkDescriptor("b").description("two")))
.document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row("`a`", "one")
.row("`b`", "two"));
}
@Test
public void linkDescriptionFromTitleInPayload() throws IOException {
this.snippets.expectLinks()
.withContents(tableWithHeader("Relation", "Description").row("`a`", "one")
.row("`b`", "Link b"));
new LinksSnippet(
new StubLinkExtractor().withLinks(new Link("a", "alpha", "Link a"),
new Link("b", "bravo", "Link b")),
Arrays.asList(new LinkDescriptor("a").description("one"),
new LinkDescriptor("b"))).document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row("`a`", "one")
.row("`b`", "Link b"));
}
@Test
@@ -116,8 +116,6 @@ public class LinksSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("links"))
.willReturn(snippetResource("links-with-title"));
this.snippets.expectLinks().withContents(containsString("Title for the links"));
new LinksSnippet(
new StubLinkExtractor().withLinks(new Link("a", "alpha"),
new Link("b", "bravo")),
@@ -129,6 +127,7 @@ public class LinksSnippetTests extends AbstractSnippetTests {
.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.build());
assertThat(this.generatedSnippets.links()).contains("Title for the links");
}
@Test
@@ -136,10 +135,6 @@ public class LinksSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("links"))
.willReturn(snippetResource("links-with-extra-column"));
this.snippets.expectLinks()
.withContents(tableWithHeader("Relation", "Description", "Foo")
.row("a", "one", "alpha").row("b", "two", "bravo"));
new LinksSnippet(
new StubLinkExtractor().withLinks(new Link("a", "alpha"),
new Link("b", "bravo")),
@@ -152,29 +147,32 @@ public class LinksSnippetTests extends AbstractSnippetTests {
TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description", "Foo")
.row("a", "one", "alpha").row("b", "two", "bravo"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectLinks()
.withContents(tableWithHeader("Relation", "Description").row("`a`", "one")
.row("`b`", "two"));
HypermediaDocumentation
.links(new StubLinkExtractor().withLinks(new Link("a", "alpha"),
new Link("b", "bravo")),
new LinkDescriptor("a").description("one"))
.and(new LinkDescriptor("b").description("two"))
.document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row("`a`", "one")
.row("`b`", "two"));
}
@Test
public void tableCellContentIsEscapedWhenNecessary() throws IOException {
this.snippets.expectLinks()
.withContents(tableWithHeader("Relation", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("one|two")));
new LinksSnippet(new StubLinkExtractor().withLinks(new Link("Foo|Bar", "foo")),
Arrays.asList(new LinkDescriptor("Foo|Bar").description("one|two")))
.document(this.operationBuilder.build());
assertThat(this.generatedSnippets.links())
.is(tableWithHeader("Relation", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("one|two")));
}
private String escapeIfNecessary(String input) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -18,9 +18,7 @@ package org.springframework.restdocs.operation;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link Parameters}.
@@ -33,45 +31,45 @@ public class ParametersTests {
@Test
public void queryStringForNoParameters() {
assertThat(this.parameters.toQueryString(), is(equalTo("")));
assertThat(this.parameters.toQueryString()).isEqualTo("");
}
@Test
public void queryStringForSingleParameter() {
this.parameters.add("a", "b");
assertThat(this.parameters.toQueryString(), is(equalTo("a=b")));
assertThat(this.parameters.toQueryString()).isEqualTo("a=b");
}
@Test
public void queryStringForSingleParameterWithMultipleValues() {
this.parameters.add("a", "b");
this.parameters.add("a", "c");
assertThat(this.parameters.toQueryString(), is(equalTo("a=b&a=c")));
assertThat(this.parameters.toQueryString()).isEqualTo("a=b&a=c");
}
@Test
public void queryStringForMutipleParameters() {
this.parameters.add("a", "alpha");
this.parameters.add("b", "bravo");
assertThat(this.parameters.toQueryString(), is(equalTo("a=alpha&b=bravo")));
assertThat(this.parameters.toQueryString()).isEqualTo("a=alpha&b=bravo");
}
@Test
public void queryStringForParameterWithEmptyValue() {
this.parameters.add("a", "");
assertThat(this.parameters.toQueryString(), is(equalTo("a=")));
assertThat(this.parameters.toQueryString()).isEqualTo("a=");
}
@Test
public void queryStringForParameterWithNullValue() {
this.parameters.add("a", null);
assertThat(this.parameters.toQueryString(), is(equalTo("a=")));
assertThat(this.parameters.toQueryString()).isEqualTo("a=");
}
@Test
public void queryStringForParameterThatRequiresEncoding() {
this.parameters.add("a", "alpha&bravo");
assertThat(this.parameters.toQueryString(), is(equalTo("a=alpha%26bravo")));
assertThat(this.parameters.toQueryString()).isEqualTo("a=alpha%26bravo");
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -23,10 +23,8 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link QueryStringParser}.
@@ -44,41 +42,41 @@ public class QueryStringParserTests {
public void noParameters() {
Parameters parameters = this.queryStringParser
.parse(URI.create("http://localhost"));
assertThat(parameters.size(), is(equalTo(0)));
assertThat(parameters.size()).isEqualTo(0);
}
@Test
public void singleParameter() {
Parameters parameters = this.queryStringParser
.parse(URI.create("http://localhost?a=alpha"));
assertThat(parameters.size(), is(equalTo(1)));
assertThat(parameters, hasEntry("a", Arrays.asList("alpha")));
assertThat(parameters.size()).isEqualTo(1);
assertThat(parameters).containsEntry("a", Arrays.asList("alpha"));
}
@Test
public void multipleParameters() {
Parameters parameters = this.queryStringParser
.parse(URI.create("http://localhost?a=alpha&b=bravo&c=charlie"));
assertThat(parameters.size(), is(equalTo(3)));
assertThat(parameters, hasEntry("a", Arrays.asList("alpha")));
assertThat(parameters, hasEntry("b", Arrays.asList("bravo")));
assertThat(parameters, hasEntry("c", Arrays.asList("charlie")));
assertThat(parameters.size()).isEqualTo(3);
assertThat(parameters).containsEntry("a", Arrays.asList("alpha"));
assertThat(parameters).containsEntry("b", Arrays.asList("bravo"));
assertThat(parameters).containsEntry("c", Arrays.asList("charlie"));
}
@Test
public void multipleParametersWithSameKey() {
Parameters parameters = this.queryStringParser
.parse(URI.create("http://localhost?a=apple&a=avocado"));
assertThat(parameters.size(), is(equalTo(1)));
assertThat(parameters, hasEntry("a", Arrays.asList("apple", "avocado")));
assertThat(parameters.size()).isEqualTo(1);
assertThat(parameters).containsEntry("a", Arrays.asList("apple", "avocado"));
}
@Test
public void encoded() {
Parameters parameters = this.queryStringParser
.parse(URI.create("http://localhost?a=al%26%3Dpha"));
assertThat(parameters.size(), is(equalTo(1)));
assertThat(parameters, hasEntry("a", Arrays.asList("al&=pha")));
assertThat(parameters.size()).isEqualTo(1);
assertThat(parameters).containsEntry("a", Arrays.asList("al&=pha"));
}
@Test

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-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.
@@ -32,9 +32,7 @@ import org.springframework.restdocs.operation.OperationResponse;
import org.springframework.restdocs.operation.OperationResponseFactory;
import org.springframework.restdocs.operation.Parameters;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ContentModifyingOperationPreprocessor}.
@@ -65,7 +63,7 @@ public class ContentModifyingOperationPreprocessorTests {
new HttpHeaders(), new Parameters(),
Collections.<OperationRequestPart>emptyList());
OperationRequest preprocessed = this.preprocessor.preprocess(request);
assertThat(preprocessed.getContent(), is(equalTo("modified".getBytes())));
assertThat(preprocessed.getContent()).isEqualTo("modified".getBytes());
}
@Test
@@ -73,7 +71,7 @@ public class ContentModifyingOperationPreprocessorTests {
OperationResponse response = this.responseFactory.create(HttpStatus.OK,
new HttpHeaders(), "content".getBytes());
OperationResponse preprocessed = this.preprocessor.preprocess(response);
assertThat(preprocessed.getContent(), is(equalTo("modified".getBytes())));
assertThat(preprocessed.getContent()).isEqualTo("modified".getBytes());
}
@Test
@@ -85,7 +83,7 @@ public class ContentModifyingOperationPreprocessorTests {
httpHeaders, new Parameters(),
Collections.<OperationRequestPart>emptyList());
OperationRequest preprocessed = this.preprocessor.preprocess(request);
assertThat(preprocessed.getHeaders().getContentLength(), is(equalTo(8L)));
assertThat(preprocessed.getHeaders().getContentLength()).isEqualTo(8L);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-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.
@@ -22,8 +22,7 @@ import org.junit.Test;
import org.springframework.restdocs.operation.OperationRequest;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
@@ -54,7 +53,7 @@ public class DelegatingOperationRequestPreprocessorTests {
Arrays.asList(preprocessor1, preprocessor2, preprocessor3))
.preprocess(originalRequest);
assertThat(result, is(preprocessedRequest3));
assertThat(result).isSameAs(preprocessedRequest3);
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -22,8 +22,7 @@ import org.junit.Test;
import org.springframework.restdocs.operation.OperationResponse;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
@@ -55,7 +54,7 @@ public class DelegatingOperationResponsePreprocessorTests {
Arrays.asList(preprocessor1, preprocessor2, preprocessor3))
.preprocess(originalResponse);
assertThat(result, is(preprocessedResponse3));
assertThat(result).isSameAs(preprocessedResponse3);
}
}

View File

@@ -32,10 +32,7 @@ import org.springframework.restdocs.operation.OperationResponse;
import org.springframework.restdocs.operation.OperationResponseFactory;
import org.springframework.restdocs.operation.Parameters;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link HeaderRemovingOperationPreprocessorTests}.
@@ -59,18 +56,18 @@ public class HeaderRemovingOperationPreprocessorTests {
getHttpHeaders(), new Parameters(),
Collections.<OperationRequestPart>emptyList());
OperationRequest preprocessed = this.preprocessor.preprocess(request);
assertThat(preprocessed.getHeaders().size(), is(equalTo(2)));
assertThat(preprocessed.getHeaders(), hasEntry("a", Arrays.asList("alpha")));
assertThat(preprocessed.getHeaders(),
hasEntry("Host", Arrays.asList("localhost")));
assertThat(preprocessed.getHeaders().size()).isEqualTo(2);
assertThat(preprocessed.getHeaders()).containsEntry("a", Arrays.asList("alpha"));
assertThat(preprocessed.getHeaders()).containsEntry("Host",
Arrays.asList("localhost"));
}
@Test
public void modifyResponseHeaders() {
OperationResponse response = createResponse();
OperationResponse preprocessed = this.preprocessor.preprocess(response);
assertThat(preprocessed.getHeaders().size(), is(equalTo(1)));
assertThat(preprocessed.getHeaders(), hasEntry("a", Arrays.asList("alpha")));
assertThat(preprocessed.getHeaders().size()).isEqualTo(1);
assertThat(preprocessed.getHeaders()).containsEntry("a", Arrays.asList("alpha"));
}
@Test
@@ -79,10 +76,10 @@ public class HeaderRemovingOperationPreprocessorTests {
HeaderRemovingOperationPreprocessor processor = new HeaderRemovingOperationPreprocessor(
new PatternMatchHeaderFilter("co.*le(.)gth]"));
OperationResponse preprocessed = processor.preprocess(response);
assertThat(preprocessed.getHeaders().size(), is(equalTo(2)));
assertThat(preprocessed.getHeaders(), hasEntry("a", Arrays.asList("alpha")));
assertThat(preprocessed.getHeaders(),
hasEntry("b", Arrays.asList("bravo", "banana")));
assertThat(preprocessed.getHeaders().size()).isEqualTo(2);
assertThat(preprocessed.getHeaders()).containsEntry("a", Arrays.asList("alpha"));
assertThat(preprocessed.getHeaders()).containsEntry("b",
Arrays.asList("bravo", "banana"));
}
@Test
@@ -90,7 +87,7 @@ public class HeaderRemovingOperationPreprocessorTests {
HeaderRemovingOperationPreprocessor processor = new HeaderRemovingOperationPreprocessor(
new PatternMatchHeaderFilter(".*"));
OperationResponse preprocessed = processor.preprocess(createResponse());
assertThat(preprocessed.getHeaders().size(), is(equalTo(0)));
assertThat(preprocessed.getHeaders().size()).isEqualTo(0);
}
private OperationResponse createResponse(String... extraHeaders) {

View File

@@ -30,9 +30,7 @@ import org.junit.Test;
import org.springframework.restdocs.hypermedia.Link;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link LinkMaskingContentModifier}.
@@ -53,39 +51,36 @@ public class LinkMaskingContentModifierTests {
@Test
public void halLinksAreMasked() throws Exception {
assertThat(
this.contentModifier.modifyContent(halPayloadWithLinks(this.links), null),
is(equalTo(halPayloadWithLinks(this.maskedLinks))));
this.contentModifier.modifyContent(halPayloadWithLinks(this.links), null))
.isEqualTo(halPayloadWithLinks(this.maskedLinks));
}
@Test
public void formattedHalLinksAreMasked() throws Exception {
assertThat(
this.contentModifier
.modifyContent(formattedHalPayloadWithLinks(this.links), null),
is(equalTo(formattedHalPayloadWithLinks(this.maskedLinks))));
assertThat(this.contentModifier
.modifyContent(formattedHalPayloadWithLinks(this.links), null))
.isEqualTo(formattedHalPayloadWithLinks(this.maskedLinks));
}
@Test
public void atomLinksAreMasked() throws Exception {
assertThat(this.contentModifier.modifyContent(atomPayloadWithLinks(this.links),
null), is(equalTo(atomPayloadWithLinks(this.maskedLinks))));
null)).isEqualTo(atomPayloadWithLinks(this.maskedLinks));
}
@Test
public void formattedAtomLinksAreMasked() throws Exception {
assertThat(
this.contentModifier
.modifyContent(formattedAtomPayloadWithLinks(this.links), null),
is(equalTo(formattedAtomPayloadWithLinks(this.maskedLinks))));
assertThat(this.contentModifier
.modifyContent(formattedAtomPayloadWithLinks(this.links), null))
.isEqualTo(formattedAtomPayloadWithLinks(this.maskedLinks));
}
@Test
public void maskCanBeCustomized() throws Exception {
assertThat(
new LinkMaskingContentModifier("custom")
.modifyContent(formattedAtomPayloadWithLinks(this.links), null),
is(equalTo(formattedAtomPayloadWithLinks(new Link("a", "custom"),
new Link("b", "custom")))));
assertThat(new LinkMaskingContentModifier("custom")
.modifyContent(formattedAtomPayloadWithLinks(this.links), null))
.isEqualTo(formattedAtomPayloadWithLinks(new Link("a", "custom"),
new Link("b", "custom")));
}
private byte[] atomPayloadWithLinks(Link... links) throws JsonProcessingException {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -17,6 +17,7 @@
package org.springframework.restdocs.operation.preprocess;
import java.net.URI;
import java.util.Arrays;
import java.util.Collections;
import org.junit.Test;
@@ -28,11 +29,7 @@ import org.springframework.restdocs.operation.OperationRequestFactory;
import org.springframework.restdocs.operation.OperationRequestPart;
import org.springframework.restdocs.operation.Parameters;
import static org.hamcrest.CoreMatchers.equalTo;
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.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link ParametersModifyingOperationPreprocessor}.
@@ -47,63 +44,58 @@ public class ParametersModifyingOperationPreprocessorTests {
public void addNewParameter() {
Parameters parameters = new Parameters();
assertThat(this.preprocessor.add("a", "alpha")
.preprocess(createRequest(parameters)).getParameters(),
hasEntry(equalTo("a"), contains("alpha")));
.preprocess(createRequest(parameters)).getParameters()).containsEntry("a",
Arrays.asList("alpha"));
}
@Test
public void addValueToExistingParameter() {
Parameters parameters = new Parameters();
parameters.add("a", "apple");
assertThat(
this.preprocessor.add("a", "alpha").preprocess(createRequest(parameters))
.getParameters(),
hasEntry(equalTo("a"), contains("apple", "alpha")));
assertThat(this.preprocessor.add("a", "alpha")
.preprocess(createRequest(parameters)).getParameters()).containsEntry("a",
Arrays.asList("apple", "alpha"));
}
@Test
public void setNewParameter() {
Parameters parameters = new Parameters();
assertThat(
this.preprocessor.set("a", "alpha", "avocado")
.preprocess(createRequest(parameters)).getParameters(),
hasEntry(equalTo("a"), contains("alpha", "avocado")));
assertThat(this.preprocessor.set("a", "alpha", "avocado")
.preprocess(createRequest(parameters)).getParameters()).containsEntry("a",
Arrays.asList("alpha", "avocado"));
}
@Test
public void setExistingParameter() {
Parameters parameters = new Parameters();
parameters.add("a", "apple");
assertThat(
this.preprocessor.set("a", "alpha", "avocado")
.preprocess(createRequest(parameters)).getParameters(),
hasEntry(equalTo("a"), contains("alpha", "avocado")));
assertThat(this.preprocessor.set("a", "alpha", "avocado")
.preprocess(createRequest(parameters)).getParameters()).containsEntry("a",
Arrays.asList("alpha", "avocado"));
}
@Test
public void removeNonExistentParameter() {
Parameters parameters = new Parameters();
assertThat(this.preprocessor.remove("a").preprocess(createRequest(parameters))
.getParameters().size(), is(equalTo(0)));
.getParameters().size()).isEqualTo(0);
}
@Test
public void removeParameter() {
Parameters parameters = new Parameters();
parameters.add("a", "apple");
assertThat(
this.preprocessor.set("a", "alpha", "avocado")
.preprocess(createRequest(parameters)).getParameters(),
hasEntry(equalTo("a"), contains("alpha", "avocado")));
assertThat(this.preprocessor.set("a", "alpha", "avocado")
.preprocess(createRequest(parameters)).getParameters()).containsEntry("a",
Arrays.asList("alpha", "avocado"));
}
@Test
public void removeParameterValueForNonExistentParameter() {
Parameters parameters = new Parameters();
assertThat(
this.preprocessor.remove("a", "apple")
.preprocess(createRequest(parameters)).getParameters().size(),
is(equalTo(0)));
assertThat(this.preprocessor.remove("a", "apple")
.preprocess(createRequest(parameters)).getParameters().size())
.isEqualTo(0);
}
@Test
@@ -111,20 +103,18 @@ public class ParametersModifyingOperationPreprocessorTests {
Parameters parameters = new Parameters();
parameters.add("a", "apple");
parameters.add("a", "alpha");
assertThat(
this.preprocessor.remove("a", "apple")
.preprocess(createRequest(parameters)).getParameters(),
hasEntry(equalTo("a"), contains("alpha")));
assertThat(this.preprocessor.remove("a", "apple")
.preprocess(createRequest(parameters)).getParameters()).containsEntry("a",
Arrays.asList("alpha"));
}
@Test
public void removeParameterValueWithSingleValueRemovesEntryEntirely() {
Parameters parameters = new Parameters();
parameters.add("a", "apple");
assertThat(
this.preprocessor.remove("a", "apple")
.preprocess(createRequest(parameters)).getParameters().size(),
is(equalTo(0)));
assertThat(this.preprocessor.remove("a", "apple")
.preprocess(createRequest(parameters)).getParameters().size())
.isEqualTo(0);
}
private OperationRequest createRequest(Parameters parameters) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-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.
@@ -23,15 +23,12 @@ import org.junit.Test;
import org.springframework.http.MediaType;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link PatternReplacingContentModifier}.
*
* @author Andy Wilkinson
*
*/
public class PatternReplacingContentModifierTests {
@@ -43,8 +40,8 @@ public class PatternReplacingContentModifierTests {
PatternReplacingContentModifier contentModifier = new PatternReplacingContentModifier(
pattern, "<<uuid>>");
assertThat(contentModifier.modifyContent(
"{\"id\" : \"CA761232-ED42-11CE-BACD-00AA0057B223\"}".getBytes(), null),
is(equalTo("{\"id\" : \"<<uuid>>\"}".getBytes())));
"{\"id\" : \"CA761232-ED42-11CE-BACD-00AA0057B223\"}".getBytes(), null))
.isEqualTo("{\"id\" : \"<<uuid>>\"}".getBytes());
}
@Test
@@ -54,10 +51,9 @@ public class PatternReplacingContentModifierTests {
Pattern.CASE_INSENSITIVE);
PatternReplacingContentModifier contentModifier = new PatternReplacingContentModifier(
pattern, "<<uuid>>");
assertThat(
contentModifier.modifyContent(
"{\"id\" : \"CA76-ED42-11CE-BACD\"}".getBytes(), null),
is(equalTo("{\"id\" : \"CA76-ED42-11CE-BACD\"}".getBytes())));
assertThat(contentModifier
.modifyContent("{\"id\" : \"CA76-ED42-11CE-BACD\"}".getBytes(), null))
.isEqualTo("{\"id\" : \"CA76-ED42-11CE-BACD\"}".getBytes());
}
@Test
@@ -66,10 +62,9 @@ public class PatternReplacingContentModifierTests {
Pattern pattern = Pattern.compile("[0-9]+");
PatternReplacingContentModifier contentModifier = new PatternReplacingContentModifier(
pattern, "<<number>>");
assertThat(
contentModifier.modifyContent((japaneseContent + " 123").getBytes(),
new MediaType("text", "plain", Charset.forName("UTF-8"))),
is(equalTo((japaneseContent + " <<number>>").getBytes())));
assertThat(contentModifier.modifyContent((japaneseContent + " 123").getBytes(),
new MediaType("text", "plain", Charset.forName("UTF-8"))))
.isEqualTo((japaneseContent + " <<number>>").getBytes());
}
}

View File

@@ -25,10 +25,8 @@ import org.junit.Test;
import org.springframework.restdocs.test.OutputCapture;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.isEmptyString;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link PrettyPrintingContentModifier}.
@@ -44,25 +42,23 @@ public class PrettyPrintingContentModifierTests {
@Test
public void prettyPrintJson() throws Exception {
assertThat(new PrettyPrintingContentModifier()
.modifyContent("{\"a\":5}".getBytes(), null),
equalTo(String.format("{%n \"a\" : 5%n}").getBytes()));
.modifyContent("{\"a\":5}".getBytes(), null))
.isEqualTo(String.format("{%n \"a\" : 5%n}").getBytes());
}
@Test
public void prettyPrintXml() throws Exception {
assertThat(
new PrettyPrintingContentModifier().modifyContent(
"<one a=\"alpha\"><two b=\"bravo\"/></one>".getBytes(), null),
equalTo(String
.format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>%n"
assertThat(new PrettyPrintingContentModifier().modifyContent(
"<one a=\"alpha\"><two b=\"bravo\"/></one>".getBytes(), null)).isEqualTo(
String.format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>%n"
+ "<one a=\"alpha\">%n <two b=\"bravo\"/>%n</one>%n")
.getBytes()));
.getBytes());
}
@Test
public void empytContentIsHandledGracefully() throws Exception {
assertThat(new PrettyPrintingContentModifier().modifyContent("".getBytes(), null),
equalTo("".getBytes()));
assertThat(new PrettyPrintingContentModifier().modifyContent("".getBytes(), null))
.isEqualTo("".getBytes());
}
@Test
@@ -70,7 +66,7 @@ public class PrettyPrintingContentModifierTests {
String content = "abcdefg";
this.outputCapture.expect(isEmptyString());
assertThat(new PrettyPrintingContentModifier().modifyContent(content.getBytes(),
null), equalTo(content.getBytes()));
null)).isEqualTo(content.getBytes());
}
@@ -83,7 +79,7 @@ public class PrettyPrintingContentModifierTests {
Map<String, String> output = objectMapper
.readValue(new PrettyPrintingContentModifier().modifyContent(
objectMapper.writeValueAsBytes(input), null), Map.class);
assertThat(output, is(equalTo(input)));
assertThat(output).isEqualTo(input);
}
}

View File

@@ -35,9 +35,7 @@ import org.springframework.restdocs.operation.OperationResponseFactory;
import org.springframework.restdocs.operation.Parameters;
import org.springframework.restdocs.operation.RequestCookie;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link UriModifyingOperationPreprocessor}.
@@ -57,8 +55,7 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.scheme("https");
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://localhost:12345"));
assertThat(processed.getUri(),
is(equalTo(URI.create("https://localhost:12345"))));
assertThat(processed.getUri()).isEqualTo(URI.create("https://localhost:12345"));
}
@Test
@@ -66,10 +63,10 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.host("api.example.com");
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.foo.com:12345"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com:12345"))));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
is(equalTo("api.example.com:12345")));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com:12345"));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST))
.isEqualTo("api.example.com:12345");
}
@Test
@@ -77,10 +74,10 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.port(23456);
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com:23456"))));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
is(equalTo("api.example.com:23456")));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com:23456"));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST))
.isEqualTo("api.example.com:23456");
}
@Test
@@ -88,9 +85,9 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345"));
assertThat(processed.getUri(), is(equalTo(URI.create("http://api.example.com"))));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
is(equalTo("api.example.com")));
assertThat(processed.getUri()).isEqualTo(URI.create("http://api.example.com"));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST))
.isEqualTo("api.example.com");
}
@Test
@@ -98,8 +95,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345/foo/bar"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com/foo/bar"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com/foo/bar"));
}
@Test
@@ -107,8 +104,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345?foo=bar"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com?foo=bar"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com?foo=bar"));
}
@Test
@@ -116,8 +113,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345#foo"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com#foo"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com#foo"));
}
@Test
@@ -126,8 +123,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'https://localhost:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'https://localhost:12345' should be used");
}
@Test
@@ -136,8 +133,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://api.example.com:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://api.example.com:12345' should be used");
}
@Test
@@ -146,8 +143,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost:23456' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost:23456' should be used");
}
@Test
@@ -156,8 +153,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost' should be used");
}
@Test
@@ -166,8 +163,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"Use 'http://localhost:12345' or 'https://localhost:23456' to access the service"));
assertThat(new String(processed.getContent()), is(equalTo(
"Use 'http://localhost' or 'https://localhost' to access the service")));
assertThat(new String(processed.getContent())).isEqualTo(
"Use 'http://localhost' or 'https://localhost' to access the service");
}
@Test
@@ -176,8 +173,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345/foo/bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost/foo/bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost/foo/bar' should be used");
}
@Test
@@ -186,8 +183,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345?foo=bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost?foo=bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost?foo=bar' should be used");
}
@Test
@@ -196,8 +193,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345#foo' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost#foo' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost#foo' should be used");
}
@Test
@@ -206,8 +203,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'https://localhost:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'https://localhost:12345' should be used");
}
@Test
@@ -216,8 +213,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://api.example.com:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://api.example.com:12345' should be used");
}
@Test
@@ -226,8 +223,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost:23456' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost:23456' should be used");
}
@Test
@@ -236,8 +233,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost' should be used");
}
@Test
@@ -246,8 +243,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"Use 'http://localhost:12345' or 'https://localhost:23456' to access the service"));
assertThat(new String(processed.getContent()), is(equalTo(
"Use 'http://localhost' or 'https://localhost' to access the service")));
assertThat(new String(processed.getContent())).isEqualTo(
"Use 'http://localhost' or 'https://localhost' to access the service");
}
@Test
@@ -256,8 +253,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345/foo/bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost/foo/bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost/foo/bar' should be used");
}
@Test
@@ -266,8 +263,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345?foo=bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost?foo=bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost?foo=bar' should be used");
}
@Test
@@ -276,34 +273,33 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345#foo' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost#foo' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost#foo' should be used");
}
@Test
public void urisInRequestHeadersCanBeModified() {
OperationRequest processed = this.preprocessor.host("api.example.com")
.preprocess(createRequestWithHeader("Foo", "http://locahost:12345"));
assertThat(processed.getHeaders().getFirst("Foo"),
is(equalTo("http://api.example.com:12345")));
assertThat(processed.getHeaders().getFirst("Host"),
is(equalTo("api.example.com")));
assertThat(processed.getHeaders().getFirst("Foo"))
.isEqualTo("http://api.example.com:12345");
assertThat(processed.getHeaders().getFirst("Host")).isEqualTo("api.example.com");
}
@Test
public void urisInResponseHeadersCanBeModified() {
OperationResponse processed = this.preprocessor.host("api.example.com")
.preprocess(createResponseWithHeader("Foo", "http://locahost:12345"));
assertThat(processed.getHeaders().getFirst("Foo"),
is(equalTo("http://api.example.com:12345")));
assertThat(processed.getHeaders().getFirst("Foo"))
.isEqualTo("http://api.example.com:12345");
}
@Test
public void urisInRequestPartHeadersCanBeModified() {
OperationRequest processed = this.preprocessor.host("api.example.com").preprocess(
createRequestWithPartWithHeader("Foo", "http://locahost:12345"));
assertThat(processed.getParts().iterator().next().getHeaders().getFirst("Foo"),
is(equalTo("http://api.example.com:12345")));
assertThat(processed.getParts().iterator().next().getHeaders().getFirst("Foo"))
.isEqualTo("http://api.example.com:12345");
}
@Test
@@ -311,8 +307,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor.host("api.example.com")
.preprocess(createRequestWithPartWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getParts().iterator().next().getContent()),
is(equalTo("The uri 'http://api.example.com:12345' should be used")));
assertThat(new String(processed.getParts().iterator().next().getContent()))
.isEqualTo("The uri 'http://api.example.com:12345' should be used");
}
@Test
@@ -320,8 +316,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.scheme("https");
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://localhost:12345?foo=%7B%7D"));
assertThat(processed.getUri(),
is(equalTo(URI.create("https://localhost:12345?foo=%7B%7D"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("https://localhost:12345?foo=%7B%7D"));
}
@@ -333,7 +329,7 @@ public class UriModifyingOperationPreprocessorTests {
new HttpHeaders(), new Parameters(),
Collections.<OperationRequestPart>emptyList(), cookies);
OperationRequest processed = this.preprocessor.preprocess(request);
assertThat(processed.getCookies().size(), is(equalTo(1)));
assertThat(processed.getCookies().size()).isEqualTo(1);
}
private OperationRequest createRequestWithUri(String uri) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -26,14 +26,15 @@ import org.springframework.core.io.FileSystemResource;
import org.springframework.restdocs.templates.TemplateEngine;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.GeneratedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
import static org.springframework.restdocs.test.SnippetMatchers.tableWithHeader;
import static org.springframework.restdocs.test.SnippetConditions.tableWithHeader;
/**
* Tests for {@link RequestFieldsSnippet} that are specific to Asciidoctor.
@@ -46,19 +47,13 @@ public class AsciidoctorRequestFieldsSnippetTests {
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
public GeneratedSnippets generatedSnippets = new GeneratedSnippets(asciidoctor());
@Test
public void requestFieldsWithListDescription() throws IOException {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-fields"))
.willReturn(snippetResource("request-fields-with-list-description"));
this.snippets.expectRequestFields().withContents(
tableWithHeader(asciidoctor(), "Path", "Type", "Description")
//
.row("a", "String", String.format(" - one%n - two"))
.configuration("[cols=\"1,1,1a\"]"));
new RequestFieldsSnippet(
Arrays.asList(
fieldWithPath("a").description(Arrays.asList("one", "two"))))
@@ -69,6 +64,11 @@ public class AsciidoctorRequestFieldsSnippetTests {
resolver))
.request("http://localhost")
.content("{\"a\": \"foo\"}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader(asciidoctor(), "Path", "Type", "Description")
//
.row("a", "String", String.format(" - one%n - two"))
.configuration("[cols=\"1,1,1a\"]"));
}
private FileSystemResource snippetResource(String name) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -29,9 +29,8 @@ import org.junit.rules.ExpectedException;
import org.springframework.http.MediaType;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* Tests for {@link FieldPathPayloadSubsectionExtractor}.
@@ -52,8 +51,8 @@ public class FieldPathPayloadSubsectionExtractorTests {
MediaType.APPLICATION_JSON);
Map<String, Object> extracted = new ObjectMapper().readValue(extractedPayload,
Map.class);
assertThat(extracted.size(), is(equalTo(1)));
assertThat(extracted.get("c"), is(equalTo((Object) 5)));
assertThat(extracted.size()).isEqualTo(1);
assertThat(extracted.get("c")).isEqualTo(5);
}
@Test
@@ -65,9 +64,9 @@ public class FieldPathPayloadSubsectionExtractorTests {
MediaType.APPLICATION_JSON);
List<Map<String, Object>> extracted = new ObjectMapper()
.readValue(extractedPayload, List.class);
assertThat(extracted.size(), is(equalTo(2)));
assertThat(extracted.get(0).get("b"), is(equalTo((Object) 5)));
assertThat(extracted.get(1).get("b"), is(equalTo((Object) 4)));
assertThat(extracted.size()).isEqualTo(2);
assertThat(extracted.get(0).get("b")).isEqualTo(5);
assertThat(extracted.get(1).get("b")).isEqualTo(4);
}
@Test
@@ -79,8 +78,8 @@ public class FieldPathPayloadSubsectionExtractorTests {
MediaType.APPLICATION_JSON);
List<Map<String, Object>> extracted = new ObjectMapper()
.readValue(extractedPayload, List.class);
assertThat(extracted.size(), is(equalTo(1)));
assertThat(extracted.get(0).get("b"), is(equalTo((Object) 5)));
assertThat(extracted.size()).isEqualTo(1);
assertThat(extracted.get(0).get("b")).isEqualTo(5);
}
@Test
@@ -92,8 +91,8 @@ public class FieldPathPayloadSubsectionExtractorTests {
MediaType.APPLICATION_JSON);
Map<String, Object> extracted = new ObjectMapper().readValue(extractedPayload,
Map.class);
assertThat(extracted.size(), is(equalTo(1)));
assertThat(extracted.get("c"), is(equalTo((Object) 5)));
assertThat(extracted.size()).isEqualTo(1);
assertThat(extracted.get("c")).isEqualTo(5);
}
@Test

View File

@@ -23,9 +23,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link JsonContentHandler}.
@@ -65,7 +63,7 @@ public class JsonContentHandlerTests {
Object fieldType = new JsonContentHandler(
"{\"a\":[{\"id\":1},{\"id\":null}]}\"".getBytes())
.determineFieldType(new FieldDescriptor("a[].id").optional());
assertThat((JsonFieldType) fieldType, is(equalTo(JsonFieldType.NUMBER)));
assertThat((JsonFieldType) fieldType).isEqualTo(JsonFieldType.NUMBER);
}
@Test
@@ -73,7 +71,7 @@ public class JsonContentHandlerTests {
Object fieldType = new JsonContentHandler(
"{\"a\":[{\"id\":null},{\"id\":1}]}".getBytes())
.determineFieldType(new FieldDescriptor("a[].id").optional());
assertThat((JsonFieldType) fieldType, is(equalTo(JsonFieldType.NUMBER)));
assertThat((JsonFieldType) fieldType).isEqualTo(JsonFieldType.NUMBER);
}
@Test
@@ -81,7 +79,7 @@ public class JsonContentHandlerTests {
Object fieldType = new JsonContentHandler(
"{\"a\":[{\"id\":1},{\"id\":null}]}\"".getBytes())
.determineFieldType(new FieldDescriptor("a[].id"));
assertThat((JsonFieldType) fieldType, is(equalTo(JsonFieldType.VARIES)));
assertThat((JsonFieldType) fieldType).isEqualTo(JsonFieldType.VARIES);
}
@Test
@@ -89,7 +87,7 @@ public class JsonContentHandlerTests {
Object fieldType = new JsonContentHandler(
"{\"a\":[{\"id\":null},{\"id\":1}]}".getBytes())
.determineFieldType(new FieldDescriptor("a[].id"));
assertThat((JsonFieldType) fieldType, is(equalTo(JsonFieldType.VARIES)));
assertThat((JsonFieldType) fieldType).isEqualTo(JsonFieldType.VARIES);
}
@Test
@@ -97,7 +95,7 @@ public class JsonContentHandlerTests {
Object fieldType = new JsonContentHandler("{\"a\": null}".getBytes())
.determineFieldType(
new FieldDescriptor("a").type(JsonFieldType.STRING).optional());
assertThat((JsonFieldType) fieldType, is(equalTo(JsonFieldType.STRING)));
assertThat((JsonFieldType) fieldType).isEqualTo(JsonFieldType.STRING);
}
@Test
@@ -112,8 +110,8 @@ public class JsonContentHandlerTests {
"{\"a\": \"alpha\", \"b\":\"bravo\"}".getBytes())
.findMissingFields(Arrays.asList(new FieldDescriptor("a"),
new FieldDescriptor("b"), new FieldDescriptor("c")));
assertThat(missingFields.size(), is(equalTo(1)));
assertThat(missingFields.get(0).getPath(), is(equalTo("c")));
assertThat(missingFields.size()).isEqualTo(1);
assertThat(missingFields.get(0).getPath()).isEqualTo("c");
}
@Test
@@ -122,7 +120,7 @@ public class JsonContentHandlerTests {
"{\"a\": \"alpha\", \"b\":\"bravo\"}".getBytes()).findMissingFields(
Arrays.asList(new FieldDescriptor("a"), new FieldDescriptor("b"),
new FieldDescriptor("c").optional()));
assertThat(missingFields.size(), is(equalTo(0)));
assertThat(missingFields.size()).isEqualTo(0);
}
@Test
@@ -131,8 +129,8 @@ public class JsonContentHandlerTests {
"{\"a\":\"alpha\",\"b\":\"bravo\"}".getBytes()).findMissingFields(
Arrays.asList(new FieldDescriptor("a").optional(),
new FieldDescriptor("b"), new FieldDescriptor("a.c")));
assertThat(missingFields.size(), is(equalTo(1)));
assertThat(missingFields.get(0).getPath(), is(equalTo("a.c")));
assertThat(missingFields.size()).isEqualTo(1);
assertThat(missingFields.get(0).getPath()).isEqualTo("a.c");
}
@Test
@@ -141,7 +139,7 @@ public class JsonContentHandlerTests {
"{\"b\":\"bravo\"}".getBytes()).findMissingFields(
Arrays.asList(new FieldDescriptor("a").optional(),
new FieldDescriptor("b"), new FieldDescriptor("a.c")));
assertThat(missingFields.size(), is(equalTo(0)));
assertThat(missingFields.size()).isEqualTo(0);
}
@Test
@@ -151,7 +149,7 @@ public class JsonContentHandlerTests {
.findMissingFields(Arrays.asList(new FieldDescriptor("outer"),
new FieldDescriptor("outer[]").optional(),
new FieldDescriptor("outer[].inner")));
assertThat(missingFields.size(), is(equalTo(0)));
assertThat(missingFields.size()).isEqualTo(0);
}
@Test
@@ -161,7 +159,7 @@ public class JsonContentHandlerTests {
.getBytes()).findMissingFields(
Arrays.asList(new FieldDescriptor("a.[].c").optional(),
new FieldDescriptor("a.[].c.d")));
assertThat(missingFields.size(), is(equalTo(0)));
assertThat(missingFields.size()).isEqualTo(0);
}
@Test
@@ -171,7 +169,7 @@ public class JsonContentHandlerTests {
Arrays.asList(new FieldDescriptor("a.[].b").optional(),
new FieldDescriptor("a.[].b.[]").optional(),
new FieldDescriptor("a.[].b.[].c")));
assertThat(missingFields.size(), is(equalTo(0)));
assertThat(missingFields.size()).isEqualTo(0);
}
@Test
@@ -181,8 +179,8 @@ public class JsonContentHandlerTests {
Arrays.asList(new FieldDescriptor("a.[].b").optional(),
new FieldDescriptor("a.[].b.[]").optional(),
new FieldDescriptor("a.[].b.[].c")));
assertThat(missingFields.size(), is(equalTo(1)));
assertThat(missingFields.get(0).getPath(), is(equalTo("a.[].b.[].c")));
assertThat(missingFields.size()).isEqualTo(1);
assertThat(missingFields.get(0).getPath()).isEqualTo("a.[].b.[].c");
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -20,10 +20,7 @@ import org.junit.Test;
import org.springframework.restdocs.payload.JsonFieldPath.PathType;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.Matchers.contains;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link JsonFieldPath}.
@@ -36,137 +33,138 @@ public class JsonFieldPathTests {
@Test
public void pathTypeOfSingleFieldIsSingle() {
JsonFieldPath path = JsonFieldPath.compile("a");
assertThat(path.getType(), is(equalTo(PathType.SINGLE)));
assertThat(path.getType()).isEqualTo(PathType.SINGLE);
}
@Test
public void pathTypeOfSingleNestedFieldIsSingle() {
JsonFieldPath path = JsonFieldPath.compile("a.b");
assertThat(path.getType(), is(equalTo(PathType.SINGLE)));
assertThat(path.getType()).isEqualTo(PathType.SINGLE);
}
@Test
public void pathTypeOfTopLevelArrayIsSingle() {
JsonFieldPath path = JsonFieldPath.compile("[]");
assertThat(path.getType(), is(equalTo(PathType.SINGLE)));
assertThat(path.getType()).isEqualTo(PathType.SINGLE);
}
@Test
public void pathTypeOfFieldBeneathTopLevelArrayIsMulti() {
JsonFieldPath path = JsonFieldPath.compile("[]a");
assertThat(path.getType(), is(equalTo(PathType.MULTI)));
assertThat(path.getType()).isEqualTo(PathType.MULTI);
}
@Test
public void pathTypeOfSingleNestedArrayIsSingle() {
JsonFieldPath path = JsonFieldPath.compile("a[]");
assertThat(path.getType(), is(equalTo(PathType.SINGLE)));
assertThat(path.getType()).isEqualTo(PathType.SINGLE);
}
@Test
public void pathTypeOfArrayBeneathNestedFieldsIsSingle() {
JsonFieldPath path = JsonFieldPath.compile("a.b[]");
assertThat(path.getType(), is(equalTo(PathType.SINGLE)));
assertThat(path.getType()).isEqualTo(PathType.SINGLE);
}
@Test
public void pathTypeOfArrayOfArraysIsMulti() {
JsonFieldPath path = JsonFieldPath.compile("a[][]");
assertThat(path.getType(), is(equalTo(PathType.MULTI)));
assertThat(path.getType()).isEqualTo(PathType.MULTI);
}
@Test
public void pathTypeOfFieldBeneathAnArrayIsMulti() {
JsonFieldPath path = JsonFieldPath.compile("a[].b");
assertThat(path.getType(), is(equalTo(PathType.MULTI)));
assertThat(path.getType()).isEqualTo(PathType.MULTI);
}
@Test
public void pathTypeOfFieldBeneathTopLevelWildcardIsMulti() {
JsonFieldPath path = JsonFieldPath.compile("*.a");
assertThat(path.getType(), is(equalTo(PathType.MULTI)));
assertThat(path.getType()).isEqualTo(PathType.MULTI);
}
@Test
public void pathTypeOfFieldBeneathNestedWildcardIsMulti() {
JsonFieldPath path = JsonFieldPath.compile("a.*.b");
assertThat(path.getType(), is(equalTo(PathType.MULTI)));
assertThat(path.getType()).isEqualTo(PathType.MULTI);
}
@Test
public void pathTypeOfLeafWidlcardIsMulti() {
JsonFieldPath path = JsonFieldPath.compile("a.*");
assertThat(path.getType(), is(equalTo(PathType.MULTI)));
assertThat(path.getType()).isEqualTo(PathType.MULTI);
}
@Test
public void compilationOfSingleElementPath() {
assertThat(JsonFieldPath.compile("a").getSegments(), contains("a"));
assertThat(JsonFieldPath.compile("a").getSegments()).containsExactly("a");
}
@Test
public void compilationOfMultipleElementPath() {
assertThat(JsonFieldPath.compile("a.b.c").getSegments(), contains("a", "b", "c"));
assertThat(JsonFieldPath.compile("a.b.c").getSegments()).containsExactly("a", "b",
"c");
}
@Test
public void compilationOfPathWithArraysWithNoDotSeparators() {
assertThat(JsonFieldPath.compile("a[]b[]c").getSegments(),
contains("a", "[]", "b", "[]", "c"));
assertThat(JsonFieldPath.compile("a[]b[]c").getSegments()).containsExactly("a",
"[]", "b", "[]", "c");
}
@Test
public void compilationOfPathWithArraysWithPreAndPostDotSeparators() {
assertThat(JsonFieldPath.compile("a.[].b.[].c").getSegments(),
contains("a", "[]", "b", "[]", "c"));
assertThat(JsonFieldPath.compile("a.[].b.[].c").getSegments())
.containsExactly("a", "[]", "b", "[]", "c");
}
@Test
public void compilationOfPathWithArraysWithPreDotSeparators() {
assertThat(JsonFieldPath.compile("a.[]b.[]c").getSegments(),
contains("a", "[]", "b", "[]", "c"));
assertThat(JsonFieldPath.compile("a.[]b.[]c").getSegments()).containsExactly("a",
"[]", "b", "[]", "c");
}
@Test
public void compilationOfPathWithArraysWithPostDotSeparators() {
assertThat(JsonFieldPath.compile("a[].b[].c").getSegments(),
contains("a", "[]", "b", "[]", "c"));
assertThat(JsonFieldPath.compile("a[].b[].c").getSegments()).containsExactly("a",
"[]", "b", "[]", "c");
}
@Test
public void compilationOfPathStartingWithAnArray() {
assertThat(JsonFieldPath.compile("[]a.b.c").getSegments(),
contains("[]", "a", "b", "c"));
assertThat(JsonFieldPath.compile("[]a.b.c").getSegments()).containsExactly("[]",
"a", "b", "c");
}
@Test
public void compilationOfMultipleElementPathWithBrackets() {
assertThat(JsonFieldPath.compile("['a']['b']['c']").getSegments(),
contains("a", "b", "c"));
assertThat(JsonFieldPath.compile("['a']['b']['c']").getSegments())
.containsExactly("a", "b", "c");
}
@Test
public void compilationOfMultipleElementPathWithAndWithoutBrackets() {
assertThat(JsonFieldPath.compile("['a'][].b['c']").getSegments(),
contains("a", "[]", "b", "c"));
assertThat(JsonFieldPath.compile("['a'][].b['c']").getSegments())
.containsExactly("a", "[]", "b", "c");
}
@Test
public void compilationOfMultipleElementPathWithAndWithoutBracketsAndEmbeddedDots() {
assertThat(JsonFieldPath.compile("['a.key'][].b['c']").getSegments(),
contains("a.key", "[]", "b", "c"));
assertThat(JsonFieldPath.compile("['a.key'][].b['c']").getSegments())
.containsExactly("a.key", "[]", "b", "c");
}
@Test
public void compilationOfPathWithAWildcard() {
assertThat(JsonFieldPath.compile("a.b.*.c").getSegments(),
contains("a", "b", "*", "c"));
assertThat(JsonFieldPath.compile("a.b.*.c").getSegments()).containsExactly("a",
"b", "*", "c");
}
@Test
public void compilationOfPathWithAWildcardInBrackets() {
assertThat(JsonFieldPath.compile("a.b.['*'].c").getSegments(),
contains("a", "b", "*", "c"));
assertThat(JsonFieldPath.compile("a.b.['*'].c").getSegments())
.containsExactly("a", "b", "*", "c");
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,13 +28,7 @@ import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.hasEntry;
import static org.hamcrest.Matchers.hasKey;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link JsonFieldProcessor}.
@@ -49,8 +43,8 @@ public class JsonFieldProcessorTests {
public void extractTopLevelMapEntry() {
Map<String, Object> payload = new HashMap<>();
payload.put("a", "alpha");
assertThat(this.fieldProcessor.extract("a", payload).getValue(),
equalTo((Object) "alpha"));
assertThat(this.fieldProcessor.extract("a", payload).getValue())
.isEqualTo("alpha");
}
@Test
@@ -59,8 +53,8 @@ public class JsonFieldProcessorTests {
Map<String, Object> alpha = new HashMap<>();
payload.put("a", alpha);
alpha.put("b", "bravo");
assertThat(this.fieldProcessor.extract("a.b", payload).getValue(),
equalTo((Object) "bravo"));
assertThat(this.fieldProcessor.extract("a.b", payload).getValue())
.isEqualTo("bravo");
}
@Test
@@ -70,8 +64,8 @@ public class JsonFieldProcessorTests {
bravo.put("b", "bravo");
payload.add(bravo);
payload.add(bravo);
assertThat(this.fieldProcessor.extract("[]", payload).getValue(),
equalTo((Object) payload));
assertThat(this.fieldProcessor.extract("[]", payload).getValue())
.isEqualTo(payload);
}
@Test
@@ -81,8 +75,7 @@ public class JsonFieldProcessorTests {
bravo.put("b", "bravo");
List<Map<String, Object>> alpha = Arrays.asList(bravo, bravo);
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a", payload).getValue(),
equalTo((Object) alpha));
assertThat(this.fieldProcessor.extract("a", payload).getValue()).isEqualTo(alpha);
}
@Test
@@ -92,8 +85,8 @@ public class JsonFieldProcessorTests {
bravo.put("b", "bravo");
List<Map<String, Object>> alpha = Arrays.asList(bravo, bravo);
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a[]", payload).getValue(),
equalTo((Object) alpha));
assertThat(this.fieldProcessor.extract("a[]", payload).getValue())
.isEqualTo(alpha);
}
@Test
@@ -103,8 +96,8 @@ public class JsonFieldProcessorTests {
entry.put("b", "bravo");
List<Map<String, Object>> alpha = Arrays.asList(entry, entry);
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a[].b", payload).getValue(),
equalTo((Object) Arrays.asList("bravo", "bravo")));
assertThat(this.fieldProcessor.extract("a[].b", payload).getValue())
.isEqualTo(Arrays.asList("bravo", "bravo"));
}
@Test
@@ -115,8 +108,8 @@ public class JsonFieldProcessorTests {
List<Map<String, Object>> alpha = Arrays.asList(entry,
new HashMap<String, Object>());
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a[].b", payload).getValue(),
equalTo((Object) Arrays.asList("bravo")));
assertThat(this.fieldProcessor.extract("a[].b", payload).getValue())
.isEqualTo(Arrays.asList("bravo"));
}
@Test
@@ -128,8 +121,8 @@ public class JsonFieldProcessorTests {
nullField.put("b", null);
List<Map<String, Object>> alpha = Arrays.asList(nonNullField, nullField);
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a[].b", payload).getValue(),
equalTo((Object) Arrays.asList("bravo", null)));
assertThat(this.fieldProcessor.extract("a[].b", payload).getValue())
.isEqualTo(Arrays.asList("bravo", null));
}
@Test
@@ -141,9 +134,8 @@ public class JsonFieldProcessorTests {
List<List<Map<String, String>>> alpha = Arrays
.asList(Arrays.asList(entry1, entry2), Arrays.asList(entry3));
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a[][]", payload).getValue(),
equalTo((Object) Arrays.asList(Arrays.asList(entry1, entry2),
Arrays.asList(entry3))));
assertThat(this.fieldProcessor.extract("a[][]", payload).getValue()).isEqualTo(
Arrays.asList(Arrays.asList(entry1, entry2), Arrays.asList(entry3)));
}
@Test
@@ -155,8 +147,8 @@ public class JsonFieldProcessorTests {
List<List<Map<String, String>>> alpha = Arrays
.asList(Arrays.asList(entry1, entry2), Arrays.asList(entry3));
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a[][].id", payload).getValue(),
equalTo((Object) Arrays.asList("1", "2", "3")));
assertThat(this.fieldProcessor.extract("a[][].id", payload).getValue())
.isEqualTo(Arrays.asList("1", "2", "3"));
}
@Test
@@ -168,9 +160,9 @@ public class JsonFieldProcessorTests {
List<List<Map<String, Object>>> alpha = Arrays
.asList(Arrays.asList(entry1, entry2), Arrays.asList(entry3));
payload.put("a", alpha);
assertThat(this.fieldProcessor.extract("a[][].ids", payload).getValue(),
equalTo((Object) Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3),
Arrays.asList(4))));
assertThat(this.fieldProcessor.extract("a[][].ids", payload).getValue())
.isEqualTo(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3),
Arrays.asList(4)));
}
@Test(expected = FieldDoesNotExistException.class)
@@ -228,7 +220,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new HashMap<>();
payload.put("a", "alpha");
this.fieldProcessor.remove("a", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@Test
@@ -238,7 +230,7 @@ public class JsonFieldProcessorTests {
payload.put("a", alpha);
alpha.put("b", "bravo");
this.fieldProcessor.remove("a", payload);
assertThat(payload.size(), equalTo(1));
assertThat(payload.size()).isEqualTo(1);
}
@Test
@@ -248,7 +240,7 @@ public class JsonFieldProcessorTests {
payload.put("a", alpha);
alpha.put("b", "bravo");
this.fieldProcessor.removeSubsection("a", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@Test
@@ -258,7 +250,7 @@ public class JsonFieldProcessorTests {
payload.put("a", alpha);
alpha.put("b", "bravo");
this.fieldProcessor.remove("a.b", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@SuppressWarnings("unchecked")
@@ -267,7 +259,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new ObjectMapper()
.readValue("{\"a\": [{\"b\":\"bravo\"},{\"b\":\"bravo\"}]}", Map.class);
this.fieldProcessor.remove("a[].b", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@SuppressWarnings("unchecked")
@@ -276,7 +268,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new ObjectMapper()
.readValue("{\"a\": [[{\"id\":1},{\"id\":2}], [{\"id\":3}]]}", Map.class);
this.fieldProcessor.remove("a[][].id", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@SuppressWarnings("unchecked")
@@ -285,7 +277,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new ObjectMapper()
.readValue("{\"a\": [{\"b\":\"bravo\"},{\"b\":\"bravo\"}]}", Map.class);
this.fieldProcessor.remove("a[]", payload);
assertThat(payload.size(), equalTo(1));
assertThat(payload.size()).isEqualTo(1);
}
@SuppressWarnings("unchecked")
@@ -294,7 +286,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new ObjectMapper().readValue("{\"a\": [[2],[3]]}",
Map.class);
this.fieldProcessor.remove("a[]", payload);
assertThat(payload.size(), equalTo(1));
assertThat(payload.size()).isEqualTo(1);
}
@SuppressWarnings("unchecked")
@@ -303,7 +295,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new ObjectMapper()
.readValue("{\"a\": [\"bravo\", \"charlie\"]}", Map.class);
this.fieldProcessor.remove("a", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@SuppressWarnings("unchecked")
@@ -312,7 +304,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new ObjectMapper()
.readValue("{\"a\": [{\"b\":\"bravo\"},{\"b\":\"bravo\"}]}", Map.class);
this.fieldProcessor.removeSubsection("a[]", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@SuppressWarnings("unchecked")
@@ -321,7 +313,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> payload = new ObjectMapper().readValue("{\"a\": [[2],[3]]}",
Map.class);
this.fieldProcessor.removeSubsection("a[]", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@Test
@@ -330,8 +322,8 @@ public class JsonFieldProcessorTests {
Map<String, Object> alpha = new HashMap<>();
payload.put("a.key", alpha);
alpha.put("b.key", "bravo");
assertThat(this.fieldProcessor.extract("['a.key']['b.key']", payload).getValue(),
equalTo((Object) "bravo"));
assertThat(this.fieldProcessor.extract("['a.key']['b.key']", payload).getValue())
.isEqualTo("bravo");
}
@SuppressWarnings("unchecked")
@@ -344,8 +336,8 @@ public class JsonFieldProcessorTests {
Map<String, Object> charlie = new LinkedHashMap<>();
charlie.put("b", "bravo2");
payload.put("c", charlie);
assertThat((List<String>) this.fieldProcessor.extract("*.b", payload).getValue(),
contains("bravo1", "bravo2"));
assertThat((List<String>) this.fieldProcessor.extract("*.b", payload).getValue())
.containsExactly("bravo1", "bravo2");
}
@SuppressWarnings("unchecked")
@@ -359,8 +351,8 @@ public class JsonFieldProcessorTests {
alpha.put("one", bravo);
alpha.put("two", bravo);
assertThat(
(List<String>) this.fieldProcessor.extract("a.*.b", payload).getValue(),
contains("bravo", "bravo"));
(List<String>) this.fieldProcessor.extract("a.*.b", payload).getValue())
.containsExactly("bravo", "bravo");
}
@SuppressWarnings("unchecked")
@@ -373,8 +365,8 @@ public class JsonFieldProcessorTests {
Map<String, Object> charlie = new HashMap<>();
charlie.put("b", "bravo2");
payload.put("c", charlie);
assertThat((List<String>) this.fieldProcessor.extract("a.*", payload).getValue(),
contains("bravo1"));
assertThat((List<String>) this.fieldProcessor.extract("a.*", payload).getValue())
.containsExactly("bravo1");
}
@SuppressWarnings("unchecked")
@@ -385,8 +377,8 @@ public class JsonFieldProcessorTests {
payload.put("a", alpha);
alpha.put("b", "bravo1");
alpha.put("c", "charlie");
assertThat((List<String>) this.fieldProcessor.extract("a.*", payload).getValue(),
contains("bravo1", "charlie"));
assertThat((List<String>) this.fieldProcessor.extract("a.*", payload).getValue())
.containsExactly("bravo1", "charlie");
}
@Test
@@ -397,7 +389,7 @@ public class JsonFieldProcessorTests {
alpha.put("b", "bravo1");
alpha.put("c", "charlie");
this.fieldProcessor.remove("a.*", payload);
assertThat(payload.size(), equalTo(0));
assertThat(payload.size()).isEqualTo(0);
}
@Test
@@ -408,7 +400,7 @@ public class JsonFieldProcessorTests {
alpha.put("b", "bravo1");
alpha.put("c", "charlie");
this.fieldProcessor.remove("*.b", payload);
assertThat(alpha, not(hasKey("b")));
assertThat(alpha).doesNotContainKey("b");
}
@Test
@@ -424,29 +416,29 @@ public class JsonFieldProcessorTests {
bravo2.put("b", "bravo");
alpha.put("two", bravo2);
this.fieldProcessor.remove("a.*.b", payload);
assertThat(payload.size(), equalTo(1));
assertThat(payload, hasEntry("c", (Object) "charlie"));
assertThat(payload.size()).isEqualTo(1);
assertThat(payload).containsEntry("c", "charlie");
}
@Test
public void hasFieldIsTrueForNonNullFieldInMap() throws Exception {
Map<String, Object> payload = new HashMap<>();
payload.put("a", "alpha");
assertThat(this.fieldProcessor.hasField("a", payload), is(true));
assertThat(this.fieldProcessor.hasField("a", payload)).isTrue();
}
@Test
public void hasFieldIsTrueForNullFieldInMap() throws Exception {
Map<String, Object> payload = new HashMap<>();
payload.put("a", null);
assertThat(this.fieldProcessor.hasField("a", payload), is(true));
assertThat(this.fieldProcessor.hasField("a", payload)).isTrue();
}
@Test
public void hasFieldIsFalseForAbsentFieldInMap() throws Exception {
Map<String, Object> payload = new HashMap<>();
payload.put("a", null);
assertThat(this.fieldProcessor.hasField("b", payload), is(false));
assertThat(this.fieldProcessor.hasField("b", payload)).isFalse();
}
@Test
@@ -455,7 +447,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> nested = new HashMap<>();
nested.put("b", "bravo");
payload.put("a", Arrays.asList(nested, nested, nested));
assertThat(this.fieldProcessor.hasField("a.[].b", payload), is(true));
assertThat(this.fieldProcessor.hasField("a.[].b", payload)).isTrue();
}
@Test
@@ -464,7 +456,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> nested = new HashMap<>();
nested.put("b", null);
payload.put("a", Arrays.asList(nested, nested, nested));
assertThat(this.fieldProcessor.hasField("a.[].b", payload), is(true));
assertThat(this.fieldProcessor.hasField("a.[].b", payload)).isTrue();
}
@Test
@@ -473,7 +465,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> nested = new HashMap<>();
nested.put("b", "bravo");
payload.put("a", Arrays.asList(nested, nested, nested));
assertThat(this.fieldProcessor.hasField("a.[].c", payload), is(false));
assertThat(this.fieldProcessor.hasField("a.[].c", payload)).isFalse();
}
@Test
@@ -482,7 +474,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> nested = new HashMap<>();
nested.put("b", "bravo");
payload.put("a", Arrays.asList(nested, new HashMap<>(), nested));
assertThat(this.fieldProcessor.hasField("a.[].b", payload), is(false));
assertThat(this.fieldProcessor.hasField("a.[].b", payload)).isFalse();
}
@Test
@@ -493,7 +485,7 @@ public class JsonFieldProcessorTests {
Map<String, Object> fieldNull = new HashMap<>();
fieldNull.put("b", null);
payload.put("a", Arrays.asList(fieldPresent, fieldPresent, fieldNull));
assertThat(this.fieldProcessor.hasField("a.[].b", payload), is(false));
assertThat(this.fieldProcessor.hasField("a.[].b", payload)).isFalse();
}
private Map<String, String> createEntry(String... pairs) {

View File

@@ -25,8 +25,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link JsonFieldTypeResolver}.
@@ -47,34 +46,31 @@ public class JsonFieldTypeResolverTests {
@Test
public void topLevelArray() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("[]"),
new ObjectMapper().readValue("[{\"a\":\"alpha\"}]", List.class)),
equalTo(JsonFieldType.ARRAY));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("[]"),
new ObjectMapper().readValue("[{\"a\":\"alpha\"}]", List.class)))
.isEqualTo(JsonFieldType.ARRAY);
}
@Test
public void nestedArray() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[]"),
createPayload("{\"a\": [{\"b\":\"bravo\"}]}")),
equalTo(JsonFieldType.ARRAY));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[]"),
createPayload("{\"a\": [{\"b\":\"bravo\"}]}")))
.isEqualTo(JsonFieldType.ARRAY);
}
@Test
public void arrayNestedBeneathAnArray() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].b[]"),
createPayload("{\"a\": [{\"b\": [ 1, 2 ]}]}")),
equalTo(JsonFieldType.ARRAY));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].b[]"),
createPayload("{\"a\": [{\"b\": [ 1, 2 ]}]}")))
.isEqualTo(JsonFieldType.ARRAY);
}
@Test
public void specificFieldOfObjectInArrayNestedBeneathAnArray() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].b[].c"),
createPayload("{\"a\": [{\"b\": [ {\"c\": 5}, {\"c\": 5}]}]}")),
equalTo(JsonFieldType.NUMBER));
createPayload("{\"a\": [{\"b\": [ {\"c\": 5}, {\"c\": 5}]}]}")))
.isEqualTo(JsonFieldType.NUMBER);
}
@Test
@@ -104,115 +100,101 @@ public class JsonFieldTypeResolverTests {
@Test
public void nestedField() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.b.c"),
createPayload("{\"a\":{\"b\":{\"c\":{}}}}")),
equalTo(JsonFieldType.OBJECT));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.b.c"),
createPayload("{\"a\":{\"b\":{\"c\":{}}}}")))
.isEqualTo(JsonFieldType.OBJECT);
}
@Test
public void multipleFieldsWithSameType() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":2}]}")),
equalTo(JsonFieldType.NUMBER));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":2}]}")))
.isEqualTo(JsonFieldType.NUMBER);
}
@Test
public void multipleFieldsWithDifferentTypes() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":true}]}")),
equalTo(JsonFieldType.VARIES));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":true}]}")))
.isEqualTo(JsonFieldType.VARIES);
}
@Test
public void multipleFieldsWithDifferentTypesAndSometimesAbsent() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":true}, { }]}")),
equalTo(JsonFieldType.VARIES));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":true}, { }]}")))
.isEqualTo(JsonFieldType.VARIES);
}
@Test
public void multipleFieldsWithDifferentTypesAndSometimesAbsentWhenOptionalResolvesToVaries()
throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(
new FieldDescriptor("a[].id").optional(),
createPayload("{\"a\":[{\"id\":1},{\"id\":true}, { }]}")),
equalTo(JsonFieldType.VARIES));
assertThat(this.fieldTypeResolver.resolveFieldType(
new FieldDescriptor("a[].id").optional(),
createPayload("{\"a\":[{\"id\":1},{\"id\":true}, { }]}")))
.isEqualTo(JsonFieldType.VARIES);
}
@Test
public void multipleFieldsWhenSometimesAbsent() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{ }]}")),
equalTo(JsonFieldType.NUMBER));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{ }]}")))
.isEqualTo(JsonFieldType.NUMBER);
}
@Test
public void multipleFieldsWithDifferentTypesAndSometimesNull() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload(
"{\"a\":[{\"id\":1},{\"id\":true}, {\"id\":null}]}")),
equalTo(JsonFieldType.VARIES));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":true}, {\"id\":null}]}")))
.isEqualTo(JsonFieldType.VARIES);
}
@Test
public void multipleFieldsWhenNotNullThenNullWhenRequiredHasVariesType()
throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":null}]}")),
equalTo(JsonFieldType.VARIES));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":1},{\"id\":null}]}")))
.isEqualTo(JsonFieldType.VARIES);
}
@Test
public void multipleFieldsWhenNotNullThenNullWhenOptionalHasSpecificType()
throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(
new FieldDescriptor("a[].id").optional(),
createPayload("{\"a\":[{\"id\":1},{\"id\":null}]}")),
equalTo(JsonFieldType.NUMBER));
assertThat(this.fieldTypeResolver.resolveFieldType(
new FieldDescriptor("a[].id").optional(),
createPayload("{\"a\":[{\"id\":1},{\"id\":null}]}")))
.isEqualTo(JsonFieldType.NUMBER);
}
@Test
public void multipleFieldsWhenNullThenNotNullWhenRequiredHasVariesType()
throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":null},{\"id\":1}]}")),
equalTo(JsonFieldType.VARIES));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":null},{\"id\":1}]}")))
.isEqualTo(JsonFieldType.VARIES);
}
@Test
public void multipleFieldsWhenNullThenNotNullWhenOptionalHasSpecificType()
throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(
new FieldDescriptor("a[].id").optional(),
createPayload("{\"a\":[{\"id\":null},{\"id\":1}]}")),
equalTo(JsonFieldType.NUMBER));
assertThat(this.fieldTypeResolver.resolveFieldType(
new FieldDescriptor("a[].id").optional(),
createPayload("{\"a\":[{\"id\":null},{\"id\":1}]}")))
.isEqualTo(JsonFieldType.NUMBER);
}
@Test
public void multipleFieldsWhenEitherNullOrAbsent() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{},{\"id\":null}]}")),
equalTo(JsonFieldType.NULL));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{},{\"id\":null}]}")))
.isEqualTo(JsonFieldType.NULL);
}
@Test
public void multipleFieldsThatAreAllNull() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":null},{\"id\":null}]}")),
equalTo(JsonFieldType.NULL));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a[].id"),
createPayload("{\"a\":[{\"id\":null},{\"id\":null}]}")))
.isEqualTo(JsonFieldType.NULL);
}
@Test
@@ -237,40 +219,36 @@ public class JsonFieldTypeResolverTests {
@Test
public void leafWildcardWithCommonType() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.*"),
createPayload("{\"a\": {\"b\": 5, \"c\": 6}}")),
equalTo(JsonFieldType.NUMBER));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.*"),
createPayload("{\"a\": {\"b\": 5, \"c\": 6}}")))
.isEqualTo(JsonFieldType.NUMBER);
}
@Test
public void leafWildcardWithVaryingType() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.*"),
createPayload("{\"a\": {\"b\": 5, \"c\": \"six\"}}")),
equalTo(JsonFieldType.VARIES));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.*"),
createPayload("{\"a\": {\"b\": 5, \"c\": \"six\"}}")))
.isEqualTo(JsonFieldType.VARIES);
}
@Test
public void intermediateWildcardWithCommonType() throws IOException {
assertThat(
this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.*.d"),
createPayload(
"{\"a\": {\"b\": {\"d\": 4}, \"c\": {\"d\": 5}}}}")),
equalTo(JsonFieldType.NUMBER));
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.*.d"),
createPayload("{\"a\": {\"b\": {\"d\": 4}, \"c\": {\"d\": 5}}}}")))
.isEqualTo(JsonFieldType.NUMBER);
}
@Test
public void intermediateWildcardWithVaryingType() throws IOException {
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("a.*.d"),
createPayload("{\"a\": {\"b\": {\"d\": 4}, \"c\": {\"d\": \"four\"}}}}")),
equalTo(JsonFieldType.VARIES));
createPayload("{\"a\": {\"b\": {\"d\": 4}, \"c\": {\"d\": \"four\"}}}}")))
.isEqualTo(JsonFieldType.VARIES);
}
private void assertFieldType(JsonFieldType expectedType, String jsonValue)
throws IOException {
assertThat(this.fieldTypeResolver.resolveFieldType(new FieldDescriptor("field"),
createSimplePayload(jsonValue)), equalTo(expectedType));
createSimplePayload(jsonValue))).isEqualTo(expectedType);
}
private Map<String, Object> createSimplePayload(String value) throws IOException {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -21,9 +21,7 @@ import java.util.List;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.payload.PayloadDocumentation.applyPathPrefix;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.snippet.Attributes.key;
@@ -39,42 +37,40 @@ public class PayloadDocumentationTests {
public void applyPathPrefixAppliesPrefixToDescriptorPaths() {
List<FieldDescriptor> descriptors = applyPathPrefix("alpha.",
Arrays.asList(fieldWithPath("bravo"), fieldWithPath("charlie")));
assertThat(descriptors.size(), is(equalTo(2)));
assertThat(descriptors.get(0).getPath(), is(equalTo("alpha.bravo")));
assertThat(descriptors.size()).isEqualTo(2);
assertThat(descriptors.get(0).getPath()).isEqualTo("alpha.bravo");
}
@Test
public void applyPathPrefixCopiesIgnored() {
List<FieldDescriptor> descriptors = applyPathPrefix("alpha.",
Arrays.asList(fieldWithPath("bravo").ignored()));
assertThat(descriptors.size(), is(equalTo(1)));
assertThat(descriptors.get(0).isIgnored(), is(true));
assertThat(descriptors.size()).isEqualTo(1);
assertThat(descriptors.get(0).isIgnored()).isTrue();
}
@Test
public void applyPathPrefixCopiesOptional() {
List<FieldDescriptor> descriptors = applyPathPrefix("alpha.",
Arrays.asList(fieldWithPath("bravo").optional()));
assertThat(descriptors.size(), is(equalTo(1)));
assertThat(descriptors.get(0).isOptional(), is(true));
assertThat(descriptors.size()).isEqualTo(1);
assertThat(descriptors.get(0).isOptional()).isTrue();
}
@Test
public void applyPathPrefixCopiesDescription() {
List<FieldDescriptor> descriptors = applyPathPrefix("alpha.",
Arrays.asList(fieldWithPath("bravo").description("Some field")));
assertThat(descriptors.size(), is(equalTo(1)));
assertThat(descriptors.get(0).getDescription(),
is(equalTo((Object) "Some field")));
assertThat(descriptors.size()).isEqualTo(1);
assertThat(descriptors.get(0).getDescription()).isEqualTo("Some field");
}
@Test
public void applyPathPrefixCopiesType() {
List<FieldDescriptor> descriptors = applyPathPrefix("alpha.",
Arrays.asList(fieldWithPath("bravo").type(JsonFieldType.OBJECT)));
assertThat(descriptors.size(), is(equalTo(1)));
assertThat(descriptors.get(0).getType(),
is(equalTo((Object) JsonFieldType.OBJECT)));
assertThat(descriptors.size()).isEqualTo(1);
assertThat(descriptors.get(0).getType()).isEqualTo(JsonFieldType.OBJECT);
}
@Test
@@ -82,12 +78,10 @@ public class PayloadDocumentationTests {
List<FieldDescriptor> descriptors = applyPathPrefix("alpha.",
Arrays.asList(fieldWithPath("bravo").attributes(key("a").value("alpha"),
key("b").value("bravo"))));
assertThat(descriptors.size(), is(equalTo(1)));
assertThat(descriptors.get(0).getAttributes().size(), is(equalTo(2)));
assertThat(descriptors.get(0).getAttributes().get("a"),
is(equalTo((Object) "alpha")));
assertThat(descriptors.get(0).getAttributes().get("b"),
is(equalTo((Object) "bravo")));
assertThat(descriptors.size()).isEqualTo(1);
assertThat(descriptors.get(0).getAttributes().size()).isEqualTo(2);
assertThat(descriptors.get(0).getAttributes().get("a")).isEqualTo("alpha");
assertThat(descriptors.get(0).getAttributes().get("b")).isEqualTo("bravo");
}
}

View File

@@ -26,6 +26,7 @@ import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.payload.PayloadDocumentation.beneathPath;
@@ -46,35 +47,31 @@ public class RequestBodyPartSnippetTests extends AbstractSnippetTests {
@Test
public void requestPartWithBody() throws IOException {
this.snippets.expect("request-part-one-body")
.withContents(codeBlock(null, "nowrap").content("some content"));
requestPartBody("one").document(this.operationBuilder.request("http://localhost")
.part("one", "some content".getBytes()).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body"))
.is(codeBlock(null, "nowrap").withContent("some content"));
}
@Test
public void requestPartWithNoBody() throws IOException {
this.snippets.expect("request-part-one-body")
.withContents(codeBlock(null, "nowrap").content(""));
requestPartBody("one").document(this.operationBuilder.request("http://localhost")
.part("one", new byte[0]).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body"))
.is(codeBlock(null, "nowrap").withContent(""));
}
@Test
public void subsectionOfRequestPartBody() throws IOException {
this.snippets.expect("request-part-one-body-beneath-a.b")
.withContents(codeBlock(null, "nowrap").content("{\"c\":5}"));
requestPartBody("one", beneathPath("a.b"))
.document(this.operationBuilder.request("http://localhost")
.part("one", "{\"a\":{\"b\":{\"c\":5}}}".getBytes()).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body-beneath-a.b"))
.is(codeBlock(null, "nowrap").withContent("{\"c\":5}"));
}
@Test
public void customSnippetAttributes() throws IOException {
this.snippets.expect("request-part-one-body")
.withContents(codeBlock("json", "nowrap").content("{\"a\":\"alpha\"}"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-part-body"))
.willReturn(snippetResource("request-part-body-with-language"));
@@ -84,6 +81,8 @@ public class RequestBodyPartSnippetTests extends AbstractSnippetTests {
new MustacheTemplateEngine(resolver))
.request("http://localhost")
.part("one", "{\"a\":\"alpha\"}".getBytes()).build());
assertThat(this.generatedSnippets.snippet("request-part-one-body"))
.is(codeBlock("json", "nowrap").withContent("{\"a\":\"alpha\"}"));
}
}

View File

@@ -26,6 +26,7 @@ import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.payload.PayloadDocumentation.beneathPath;
@@ -46,34 +47,30 @@ public class RequestBodySnippetTests extends AbstractSnippetTests {
@Test
public void requestWithBody() throws IOException {
this.snippets.expect("request-body")
.withContents(codeBlock(null, "nowrap").content("some content"));
requestBody().document(this.operationBuilder.request("http://localhost")
.content("some content").build());
assertThat(this.generatedSnippets.snippet("request-body"))
.is(codeBlock(null, "nowrap").withContent("some content"));
}
@Test
public void requestWithNoBody() throws IOException {
this.snippets.expect("request-body")
.withContents(codeBlock(null, "nowrap").content(""));
requestBody().document(this.operationBuilder.request("http://localhost").build());
assertThat(this.generatedSnippets.snippet("request-body"))
.is(codeBlock(null, "nowrap").withContent(""));
}
@Test
public void subsectionOfRequestBody() throws IOException {
this.snippets.expect("request-body-beneath-a.b")
.withContents(codeBlock(null, "nowrap").content("{\"c\":5}"));
requestBody(beneathPath("a.b"))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\":{\"b\":{\"c\":5}}}").build());
assertThat(this.generatedSnippets.snippet("request-body-beneath-a.b"))
.is(codeBlock(null, "nowrap").withContent("{\"c\":5}"));
}
@Test
public void customSnippetAttributes() throws IOException {
this.snippets.expect("request-body")
.withContents(codeBlock("json", "nowrap").content("{\"a\":\"alpha\"}"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-body"))
.willReturn(snippetResource("request-body-with-language"));
@@ -83,6 +80,8 @@ public class RequestBodySnippetTests extends AbstractSnippetTests {
new MustacheTemplateEngine(resolver))
.request("http://localhost").content("{\"a\":\"alpha\"}")
.build());
assertThat(this.generatedSnippets.snippet("request-body"))
.is(codeBlock("json", "nowrap").withContent("{\"a\":\"alpha\"}"));
}
}

View File

@@ -28,7 +28,6 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.endsWith;
@@ -44,10 +43,6 @@ import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWit
*/
public class RequestFieldsSnippetFailureTests {
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(
TemplateFormats.asciidoctor());
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(
TemplateFormats.asciidoctor());

View File

@@ -30,10 +30,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.payload.PayloadDocumentation.beneathPath;
@@ -56,76 +53,65 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
@Test
public void mapRequestWithFields() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("a.b").description("one"),
fieldWithPath("a.c").description("two"),
fieldWithPath("a").description("three")))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": 5, \"c\": \"charlie\"}}")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
}
@Test
public void mapRequestWithNullField() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`Null`", "one"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("a.b").description("one")))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": null}}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a.b`", "`Null`",
"one"));
}
@Test
public void entireSubsectionsCanBeDocumented() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a`",
"`Object`", "one"));
new RequestFieldsSnippet(
Arrays.asList(subsectionWithPath("a").description("one")))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": 5, \"c\": \"charlie\"}}")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a`", "`Object`",
"one"));
}
@Test
public void subsectionOfMapRequest() throws IOException {
this.snippets.expect("request-fields-beneath-a")
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
requestFields(beneathPath("a"), fieldWithPath("b").description("one"),
fieldWithPath("c").description("two"))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": 5, \"c\": \"charlie\"}}")
.build());
assertThat(this.generatedSnippets.snippet("request-fields-beneath-a"))
.is(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
}
@Test
public void subsectionOfMapRequestWithCommonPrefix() throws IOException {
this.snippets.expect("request-fields-beneath-a")
.withContents(tableWithHeader("Path", "Type", "Description").row("`b.c`",
"`String`", "two"));
requestFields(beneathPath("a"))
.andWithPrefix("b.", fieldWithPath("c").description("two"))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": {\"c\": \"charlie\"}}}").build());
assertThat(this.generatedSnippets.snippet("request-fields-beneath-a"))
.is(tableWithHeader("Path", "Type", "Description").row("`b.c`",
"`String`", "two"));
}
@Test
public void arrayRequestWithFields() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`[]`", "`Array`", "one").row("`[]a.b`", "`Number`", "two")
.row("`[]a.c`", "`String`", "three")
.row("`[]a`", "`Object`", "four"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("[]").description("one"),
fieldWithPath("[]a.b").description("two"),
fieldWithPath("[]a.c").description("three"),
@@ -134,113 +120,113 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
.content("[{\"a\": {\"b\": 5, \"c\":\"charlie\"}},"
+ "{\"a\": {\"b\": 4, \"c\":\"chalk\"}}]")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`[]`", "`Array`", "one").row("`[]a.b`", "`Number`", "two")
.row("`[]a.c`", "`String`", "three")
.row("`[]a`", "`Object`", "four"));
}
@Test
public void arrayRequestWithAlwaysNullField() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`[]a.b`", "`Null`", "one"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("[]a.b").description("one")))
.document(this.operationBuilder.request("http://localhost")
.content("[{\"a\": {\"b\": null}}," + "{\"a\": {\"b\": null}}]")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`[]a.b`",
"`Null`", "one"));
}
@Test
public void subsectionOfArrayRequest() throws IOException {
this.snippets.expect("request-fields-beneath-[].a")
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
requestFields(beneathPath("[].a"), fieldWithPath("b").description("one"),
fieldWithPath("c").description("two"))
.document(this.operationBuilder.request("http://localhost")
.content("[{\"a\": {\"b\": 5, \"c\": \"charlie\"}}]")
.build());
assertThat(this.generatedSnippets.snippet("request-fields-beneath-[].a"))
.is(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
}
@Test
public void ignoredRequestField() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`b`",
"`Number`", "Field b"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("a").ignored(),
fieldWithPath("b").description("Field b")))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": 5, \"b\": 4}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`b`", "`Number`",
"Field b"));
}
@Test
public void entireSubsectionCanBeIgnored() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`c`",
"`Number`", "Field c"));
new RequestFieldsSnippet(Arrays.asList(subsectionWithPath("a").ignored(),
fieldWithPath("c").description("Field c")))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": 5}, \"c\": 4}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`c`", "`Number`",
"Field c"));
}
@Test
public void allUndocumentedRequestFieldsCanBeIgnored() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`b`",
"`Number`", "Field b"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("b").description("Field b")),
true).document(
this.operationBuilder.request("http://localhost")
.content("{\"a\": 5, \"b\": 4}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`b`", "`Number`",
"Field b"));
}
@Test
public void allUndocumentedFieldsContinueToBeIgnoredAfterAddingDescriptors()
throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "Field b")
.row("`c.d`", "`Number`", "Field d"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("b").description("Field b")),
true).andWithPrefix("c.", fieldWithPath("d").description("Field d"))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\":5,\"b\":4,\"c\":{\"d\": 3}}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "Field b")
.row("`c.d`", "`Number`", "Field d"));
}
@Test
public void missingOptionalRequestField() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("a.b").description("one")
.type(JsonFieldType.STRING).optional()))
.document(this.operationBuilder.request("http://localhost")
.content("{}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
}
@Test
public void missingIgnoredOptionalRequestFieldDoesNotRequireAType()
throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description"));
new RequestFieldsSnippet(Arrays
.asList(fieldWithPath("a.b").description("one").ignored().optional()))
.document(this.operationBuilder.request("http://localhost")
.content("{}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description"));
}
@Test
public void presentOptionalRequestField() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("a.b").description("one")
.type(JsonFieldType.STRING).optional()))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": { \"b\": \"bravo\"}}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
}
@Test
@@ -248,8 +234,6 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-fields"))
.willReturn(snippetResource("request-fields-with-title"));
this.snippets.expectRequestFields().withContents(containsString("Custom title"));
new RequestFieldsSnippet(
Arrays.asList(fieldWithPath("a").description("one")), attributes(
key("title").value("Custom title")))
@@ -260,6 +244,7 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
resolver))
.request("http://localhost")
.content("{\"a\": \"foo\"}").build());
assertThat(this.generatedSnippets.requestFields()).contains("Custom title");
}
@Test
@@ -267,12 +252,6 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-fields"))
.willReturn(snippetResource("request-fields-with-extra-column"));
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description", "Foo")
.row("a.b", "Number", "one", "alpha")
.row("a.c", "String", "two", "bravo")
.row("a", "Object", "three", "charlie"));
new RequestFieldsSnippet(Arrays.asList(
fieldWithPath("a.b").description("one")
.attributes(key("foo").value("alpha")),
@@ -287,30 +266,33 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
.content(
"{\"a\": {\"b\": 5, \"c\": \"charlie\"}}")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description", "Foo")
.row("a.b", "Number", "one", "alpha")
.row("a.c", "String", "two", "bravo")
.row("a", "Object", "three", "charlie"));
}
@Test
public void fieldWithExplictExactlyMatchingType() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a`",
"`Number`", "one"));
new RequestFieldsSnippet(Arrays
.asList(fieldWithPath("a").description("one").type(JsonFieldType.NUMBER)))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": 5 }").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a`", "`Number`",
"one"));
}
@Test
public void fieldWithExplictVariesType() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a`",
"`Varies`", "one"));
new RequestFieldsSnippet(Arrays
.asList(fieldWithPath("a").description("one").type(JsonFieldType.VARIES)))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": 5 }").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a`", "`Varies`",
"one"));
}
@Test
@@ -329,11 +311,6 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
}
private void xmlRequestFields(MediaType contentType) throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a/b`", "`b`", "one").row("`a/c`", "`c`", "two")
.row("`a`", "`a`", "three"));
new RequestFieldsSnippet(Arrays.asList(
fieldWithPath("a/b").description("one").type("b"),
fieldWithPath("a/c").description("two").type("c"),
@@ -342,13 +319,13 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
.content("<a><b>5</b><c>charlie</c></a>")
.header(HttpHeaders.CONTENT_TYPE, contentType.toString())
.build());
assertThat(this.generatedSnippets.requestFields()).is(
tableWithHeader("Path", "Type", "Description").row("`a/b`", "`b`", "one")
.row("`a/c`", "`c`", "two").row("`a`", "`a`", "three"));
}
@Test
public void entireSubsectionOfXmlPayloadCanBeDocumented() throws IOException {
this.snippets.expectRequestFields().withContents(
tableWithHeader("Path", "Type", "Description").row("`a`", "`a`", "one"));
new RequestFieldsSnippet(
Arrays.asList(subsectionWithPath("a").description("one").type("a")))
.document(this.operationBuilder.request("http://localhost")
@@ -356,57 +333,51 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_XML_VALUE)
.build());
assertThat(this.generatedSnippets.requestFields()).is(
tableWithHeader("Path", "Type", "Description").row("`a`", "`a`", "one"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
PayloadDocumentation
.requestFields(fieldWithPath("a.b").description("one"),
fieldWithPath("a.c").description("two"))
.and(fieldWithPath("a").description("three"))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": 5, \"c\": \"charlie\"}}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
}
@Test
public void prefixedAdditionalDescriptors() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`Object`", "one").row("`a.b`", "`Number`", "two")
.row("`a.c`", "`String`", "three"));
PayloadDocumentation.requestFields(fieldWithPath("a").description("one"))
.andWithPrefix("a.", fieldWithPath("b").description("two"),
fieldWithPath("c").description("three"))
.document(this.operationBuilder.request("http://localhost")
.content("{\"a\": {\"b\": 5, \"c\": \"charlie\"}}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`Object`", "one").row("`a.b`", "`Number`", "two")
.row("`a.c`", "`String`", "three"));
}
@Test
public void requestWithFieldsWithEscapedContent() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("`one|two`"),
escapeIfNecessary("three|four")));
new RequestFieldsSnippet(Arrays.asList(
fieldWithPath("Foo|Bar").type("one|two").description("three|four")))
.document(this.operationBuilder.request("http://localhost")
.content("{\"Foo|Bar\": 5}").build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("`one|two`"),
escapeIfNecessary("three|four")));
}
@Test
public void mapRequestWithVaryingKeysMatchedUsingWildcard() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`things.*.size`", "`String`", "one")
.row("`things.*.type`", "`String`", "two"));
new RequestFieldsSnippet(
Arrays.asList(fieldWithPath("things.*.size").description("one"),
fieldWithPath("things.*.type").description("two"))).document(
@@ -416,13 +387,14 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
+ "\"gzM33\" : {\"type\": \"Screw\","
+ "\"size\": \"SMALL\"}}}")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`things.*.size`", "`String`", "one")
.row("`things.*.type`", "`String`", "two"));
}
@Test
public void requestWithArrayContainingFieldThatIsSometimesNull() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`assets[].name`", "`String`", "one"));
new RequestFieldsSnippet(Arrays.asList(fieldWithPath("assets[].name")
.description("one").type(JsonFieldType.STRING).optional()))
.document(this.operationBuilder.request("http://localhost")
@@ -430,14 +402,13 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
+ "{\"name\": null}, "
+ "{\"name\": \"sample2\"}]}")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`assets[].name`",
"`String`", "one"));
}
@Test
public void optionalFieldBeneathArrayThatIsSometimesAbsent() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a[].b`", "`Number`", "one")
.row("`a[].c`", "`Number`", "two"));
new RequestFieldsSnippet(Arrays.asList(
fieldWithPath("a[].b").description("one").type(JsonFieldType.NUMBER)
.optional(),
@@ -447,17 +418,21 @@ public class RequestFieldsSnippetTests extends AbstractSnippetTests {
.content("{\"a\":[{\"b\": 1,\"c\": 2}, "
+ "{\"c\": 2}, {\"b\": 1,\"c\": 2}]}")
.build());
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a[].b`", "`Number`", "one")
.row("`a[].c`", "`Number`", "two"));
}
@Test
public void typeDeterminationDoesNotSetTypeOnDescriptor() throws IOException {
this.snippets.expectRequestFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`Number`", "one"));
FieldDescriptor descriptor = fieldWithPath("a.b").description("one");
new RequestFieldsSnippet(Arrays.asList(descriptor)).document(this.operationBuilder
.request("http://localhost").content("{\"a\": {\"b\": 5}}").build());
assertThat(descriptor.getType(), is(nullValue()));
assertThat(descriptor.getType()).isNull();
assertThat(this.generatedSnippets.requestFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`Number`", "one"));
}
private String escapeIfNecessary(String input) {

View File

@@ -26,6 +26,7 @@ import org.springframework.restdocs.AbstractSnippetTests;
import org.springframework.restdocs.operation.Operation;
import org.springframework.restdocs.templates.TemplateFormat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.payload.PayloadDocumentation.beneathPath;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
@@ -43,11 +44,6 @@ public class RequestPartFieldsSnippetTests extends AbstractSnippetTests {
@Test
public void mapRequestPartFields() throws IOException {
this.snippets.expectRequestPartFields("one")
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
new RequestPartFieldsSnippet("one", Arrays.asList(
fieldWithPath("a.b").description("one"),
fieldWithPath("a.c").description("two"),
@@ -55,52 +51,50 @@ public class RequestPartFieldsSnippetTests extends AbstractSnippetTests {
.request("http://localhost")
.part("one", "{\"a\": {\"b\": 5, \"c\": \"charlie\"}}".getBytes())
.build());
assertThat(this.generatedSnippets.requestPartFields("one"))
.is(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
}
@Test
public void mapRequestPartSubsectionFields() throws IOException {
this.snippets.expect("request-part-one-fields-beneath-a")
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
new RequestPartFieldsSnippet("one", beneathPath("a"), Arrays.asList(
fieldWithPath("b").description("one"),
fieldWithPath("c").description("two"))).document(this.operationBuilder
.request("http://localhost")
.part("one", "{\"a\": {\"b\": 5, \"c\": \"charlie\"}}".getBytes())
.build());
assertThat(this.generatedSnippets.snippet("request-part-one-fields-beneath-a"))
.is(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
}
@Test
public void multipleRequestParts() throws IOException {
this.snippets.expectRequestPartFields("one");
this.snippets.expectRequestPartFields("two");
Operation operation = this.operationBuilder.request("http://localhost")
.part("one", "{}".getBytes()).and().part("two", "{}".getBytes()).build();
new RequestPartFieldsSnippet("one", Collections.<FieldDescriptor>emptyList())
.document(operation);
new RequestPartFieldsSnippet("two", Collections.<FieldDescriptor>emptyList())
.document(operation);
assertThat(this.generatedSnippets.requestPartFields("one")).isNotNull();
assertThat(this.generatedSnippets.requestPartFields("two")).isNotNull();
}
@Test
public void allUndocumentedRequestPartFieldsCanBeIgnored() throws IOException {
this.snippets.expectRequestPartFields("one")
.withContents(tableWithHeader("Path", "Type", "Description").row("`b`",
"`Number`", "Field b"));
new RequestPartFieldsSnippet("one",
Arrays.asList(fieldWithPath("b").description("Field b")), true)
.document(this.operationBuilder.request("http://localhost")
.part("one", "{\"a\": 5, \"b\": 4}".getBytes()).build());
assertThat(this.generatedSnippets.requestPartFields("one"))
.is(tableWithHeader("Path", "Type", "Description").row("`b`", "`Number`",
"Field b"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectRequestPartFields("one")
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
PayloadDocumentation
.requestPartFields("one", fieldWithPath("a.b").description("one"),
fieldWithPath("a.c").description("two"))
@@ -108,15 +102,14 @@ public class RequestPartFieldsSnippetTests extends AbstractSnippetTests {
.document(this.operationBuilder.request("http://localhost")
.part("one", "{\"a\": {\"b\": 5, \"c\": \"charlie\"}}".getBytes())
.build());
assertThat(this.generatedSnippets.requestPartFields("one"))
.is(tableWithHeader("Path", "Type", "Description")
.row("`a.b`", "`Number`", "one").row("`a.c`", "`String`", "two")
.row("`a`", "`Object`", "three"));
}
@Test
public void prefixedAdditionalDescriptors() throws IOException {
this.snippets.expectRequestPartFields("one")
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`Object`", "one").row("`a.b`", "`Number`", "two")
.row("`a.c`", "`String`", "three"));
PayloadDocumentation
.requestPartFields("one", fieldWithPath("a").description("one"))
.andWithPrefix("a.", fieldWithPath("b").description("two"),
@@ -124,6 +117,10 @@ public class RequestPartFieldsSnippetTests extends AbstractSnippetTests {
.document(this.operationBuilder.request("http://localhost")
.part("one", "{\"a\": {\"b\": 5, \"c\": \"charlie\"}}".getBytes())
.build());
assertThat(this.generatedSnippets.requestPartFields("one"))
.is(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`Object`", "one").row("`a.b`", "`Number`", "two")
.row("`a.c`", "`String`", "three"));
}
}

View File

@@ -26,6 +26,7 @@ import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.payload.PayloadDocumentation.beneathPath;
@@ -46,42 +47,39 @@ public class ResponseBodySnippetTests extends AbstractSnippetTests {
@Test
public void responseWithBody() throws IOException {
this.snippets.expect("response-body")
.withContents(codeBlock(null, "nowrap").content("some content"));
PayloadDocumentation.responseBody().document(
new ResponseBodySnippet().document(
this.operationBuilder.response().content("some content").build());
assertThat(this.generatedSnippets.snippet("response-body"))
.is(codeBlock(null, "nowrap").withContent("some content"));
}
@Test
public void responseWithNoBody() throws IOException {
this.snippets.expect("response-body")
.withContents(codeBlock(null, "nowrap").content(""));
PayloadDocumentation.responseBody()
.document(this.operationBuilder.response().build());
new ResponseBodySnippet().document(this.operationBuilder.response().build());
assertThat(this.generatedSnippets.snippet("response-body"))
.is(codeBlock(null, "nowrap").withContent(""));
}
@Test
public void subsectionOfResponseBody() throws IOException {
this.snippets.expect("response-body-beneath-a.b")
.withContents(codeBlock(null, "nowrap").content("{\"c\":5}"));
responseBody(beneathPath("a.b")).document(this.operationBuilder.response()
.content("{\"a\":{\"b\":{\"c\":5}}}").build());
assertThat(this.generatedSnippets.snippet("response-body-beneath-a.b"))
.is(codeBlock(null, "nowrap").withContent("{\"c\":5}"));
}
@Test
public void customSnippetAttributes() throws IOException {
this.snippets.expect("response-body")
.withContents(codeBlock("json", "nowrap").content("{\"a\":\"alpha\"}"));
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("response-body"))
.willReturn(snippetResource("response-body-with-language"));
responseBody(attributes(key("language").value("json")))
new ResponseBodySnippet(attributes(key("language").value("json")))
.document(this.operationBuilder
.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.response().content("{\"a\":\"alpha\"}").build());
assertThat(this.generatedSnippets.snippet("response-body"))
.is(codeBlock("json", "nowrap").withContent("{\"a\":\"alpha\"}"));
}
}

View File

@@ -27,7 +27,6 @@ import org.junit.rules.ExpectedException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.endsWith;
@@ -47,9 +46,6 @@ public class ResponseFieldsSnippetFailureTests {
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
@Rule
public ExpectedException thrown = ExpectedException.none();

View File

@@ -30,10 +30,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.payload.PayloadDocumentation.beneathPath;
@@ -55,13 +52,6 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
@Test
public void mapResponseWithFields() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`id`", "`Number`", "one").row("`date`", "`String`", "two")
.row("`assets`", "`Array`", "three")
.row("`assets[]`", "`Array`", "four")
.row("`assets[].id`", "`Number`", "five")
.row("`assets[].name`", "`String`", "six"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("id").description("one"),
fieldWithPath("date").description("two"),
fieldWithPath("assets").description("three"),
@@ -73,49 +63,50 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
"{\"id\": 67,\"date\": \"2015-01-20\",\"assets\":"
+ " [{\"id\":356,\"name\": \"sample\"}]}")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`id`", "`Number`", "one").row("`date`", "`String`", "two")
.row("`assets`", "`Array`", "three")
.row("`assets[]`", "`Array`", "four")
.row("`assets[].id`", "`Number`", "five")
.row("`assets[].name`", "`String`", "six"));
}
@Test
public void mapResponseWithNullField() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`Null`", "one"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a.b").description("one")))
.document(this.operationBuilder.response()
.content("{\"a\": {\"b\": null}}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a.b`", "`Null`",
"one"));
}
@Test
public void subsectionOfMapResponse() throws IOException {
this.snippets.expect("response-fields-beneath-a")
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
responseFields(beneathPath("a"), fieldWithPath("b").description("one"),
fieldWithPath("c").description("two"))
.document(this.operationBuilder.response()
.content("{\"a\": {\"b\": 5, \"c\": \"charlie\"}}")
.build());
assertThat(this.generatedSnippets.snippet("response-fields-beneath-a"))
.is(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "one").row("`c`", "`String`", "two"));
}
@Test
public void subsectionOfMapResponseWithCommonsPrefix() throws IOException {
this.snippets.expect("response-fields-beneath-a")
.withContents(tableWithHeader("Path", "Type", "Description").row("`b.c`",
"`String`", "two"));
responseFields(beneathPath("a"))
.andWithPrefix("b.", fieldWithPath("c").description("two"))
.document(this.operationBuilder.response()
.content("{\"a\": {\"b\": {\"c\": \"charlie\"}}}").build());
assertThat(this.generatedSnippets.snippet("response-fields-beneath-a"))
.is(tableWithHeader("Path", "Type", "Description").row("`b.c`",
"`String`", "two"));
}
@Test
public void arrayResponseWithFields() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`[]a.b`", "`Number`", "one")
.row("`[]a.c`", "`String`", "two")
.row("`[]a`", "`Object`", "three"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("[]a.b").description("one"),
fieldWithPath("[]a.c").description("two"),
fieldWithPath("[]a").description("three")))
@@ -123,68 +114,69 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
.content("[{\"a\": {\"b\": 5, \"c\":\"charlie\"}},"
+ "{\"a\": {\"b\": 4, \"c\":\"chalk\"}}]")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`[]a.b`", "`Number`", "one")
.row("`[]a.c`", "`String`", "two")
.row("`[]a`", "`Object`", "three"));
}
@Test
public void arrayResponseWithAlwaysNullField() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`[]a.b`", "`Null`", "one"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("[]a.b").description("one")))
.document(this.operationBuilder.response().content(
"[{\"a\": {\"b\": null}}," + "{\"a\": {\"b\": null}}]")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`[]a.b`",
"`Null`", "one"));
}
@Test
public void arrayResponse() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`[]`",
"`Array`", "one"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("[]").description("one")))
.document(this.operationBuilder.response()
.content("[\"a\", \"b\", \"c\"]").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`[]`", "`Array`",
"one"));
}
@Test
public void ignoredResponseField() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`b`",
"`Number`", "Field b"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a").ignored(),
fieldWithPath("b").description("Field b")))
.document(this.operationBuilder.response()
.content("{\"a\": 5, \"b\": 4}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`b`", "`Number`",
"Field b"));
}
@Test
public void allUndocumentedFieldsCanBeIgnored() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`b`",
"`Number`", "Field b"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("b").description("Field b")), true)
.document(this.operationBuilder.response()
.content("{\"a\": 5, \"b\": 4}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`b`", "`Number`",
"Field b"));
}
@Test
public void allUndocumentedFieldsContinueToBeIgnoredAfterAddingDescriptors()
throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "Field b")
.row("`c.d`", "`Number`", "Field d"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("b").description("Field b")), true)
.andWithPrefix("c.", fieldWithPath("d").description("Field d"))
.document(this.operationBuilder.response()
.content("{\"a\":5,\"b\":4,\"c\":{\"d\": 3}}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`b`", "`Number`", "Field b")
.row("`c.d`", "`Number`", "Field d"));
}
@Test
@@ -192,8 +184,6 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("response-fields"))
.willReturn(snippetResource("response-fields-with-title"));
this.snippets.expectResponseFields().withContents(containsString("Custom title"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("a").description("one")), attributes(
key("title").value("Custom title")))
@@ -204,37 +194,38 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
resolver))
.response().content("{\"a\": \"foo\"}")
.build());
assertThat(this.generatedSnippets.responseFields()).contains("Custom title");
}
@Test
public void missingOptionalResponseField() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a.b").description("one")
.type(JsonFieldType.STRING).optional()))
.document(this.operationBuilder.response().content("{}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
}
@Test
public void missingIgnoredOptionalResponseFieldDoesNotRequireAType()
throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description"));
new ResponseFieldsSnippet(Arrays
.asList(fieldWithPath("a.b").description("one").ignored().optional()))
.document(this.operationBuilder.response().content("{}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description"));
}
@Test
public void presentOptionalResponseField() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("a.b").description("one")
.type(JsonFieldType.STRING).optional()))
.document(this.operationBuilder.response()
.content("{\"a\": { \"b\": \"bravo\"}}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a.b`",
"`String`", "one"));
}
@Test
@@ -242,12 +233,6 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("response-fields"))
.willReturn(snippetResource("response-fields-with-extra-column"));
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description", "Foo")
.row("a.b", "Number", "one", "alpha")
.row("a.c", "String", "two", "bravo")
.row("a", "Object", "three", "charlie"));
new ResponseFieldsSnippet(Arrays.asList(
fieldWithPath("a.b").description("one")
.attributes(key("foo").value("alpha")),
@@ -262,30 +247,33 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
.content(
"{\"a\": {\"b\": 5, \"c\": \"charlie\"}}")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description", "Foo")
.row("a.b", "Number", "one", "alpha")
.row("a.c", "String", "two", "bravo")
.row("a", "Object", "three", "charlie"));
}
@Test
public void fieldWithExplictExactlyMatchingType() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a`",
"`Number`", "one"));
new ResponseFieldsSnippet(Arrays
.asList(fieldWithPath("a").description("one").type(JsonFieldType.NUMBER)))
.document(this.operationBuilder.response().content("{\"a\": 5 }")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a`", "`Number`",
"one"));
}
@Test
public void fieldWithExplictVariesType() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`a`",
"`Varies`", "one"));
new ResponseFieldsSnippet(Arrays
.asList(fieldWithPath("a").description("one").type(JsonFieldType.VARIES)))
.document(this.operationBuilder.response().content("{\"a\": 5 }")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`a`", "`Varies`",
"one"));
}
@Test
@@ -304,10 +292,6 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
}
private void xmlResponseFields(MediaType contentType) throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a/b`", "`b`", "one").row("`a/c`", "`c`", "two")
.row("`a`", "`a`", "three"));
new ResponseFieldsSnippet(Arrays.asList(
fieldWithPath("a/b").description("one").type("b"),
fieldWithPath("a/c").description("two").type("c"),
@@ -316,13 +300,13 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
.content("<a><b>5</b><c>charlie</c></a>")
.header(HttpHeaders.CONTENT_TYPE, contentType.toString())
.build());
assertThat(this.generatedSnippets.responseFields()).is(
tableWithHeader("Path", "Type", "Description").row("`a/b`", "`b`", "one")
.row("`a/c`", "`c`", "two").row("`a`", "`a`", "three"));
}
@Test
public void xmlAttribute() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`b`", "one").row("`a/@id`", "`c`", "two"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("a").description("one").type("b"),
fieldWithPath("a/@id").description("two").type("c")))
@@ -332,13 +316,13 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_XML_VALUE)
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`b`", "one").row("`a/@id`", "`c`", "two"));
}
@Test
public void missingOptionalXmlAttribute() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`b`", "one").row("`a/@id`", "`c`", "two"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("a").description("one").type("b"),
fieldWithPath("a/@id").description("two").type("c").optional()))
@@ -348,29 +332,25 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_XML_VALUE)
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`b`", "one").row("`a/@id`", "`c`", "two"));
}
@Test
public void undocumentedAttributeDoesNotCauseFailure() throws IOException {
this.snippets.expectResponseFields().withContents(
tableWithHeader("Path", "Type", "Description").row("`a`", "`a`", "one"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("a").description("one").type("a"))).document(
this.operationBuilder.response().content("<a id=\"foo\">bar</a>")
.header(HttpHeaders.CONTENT_TYPE,
MediaType.APPLICATION_XML_VALUE)
.build());
assertThat(this.generatedSnippets.responseFields()).is(
tableWithHeader("Path", "Type", "Description").row("`a`", "`a`", "one"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`id`", "`Number`", "one").row("`date`", "`String`", "two")
.row("`assets`", "`Array`", "three")
.row("`assets[]`", "`Array`", "four")
.row("`assets[].id`", "`Number`", "five")
.row("`assets[].name`", "`String`", "six"));
PayloadDocumentation
.responseFields(fieldWithPath("id").description("one"),
fieldWithPath("date").description("two"),
@@ -382,42 +362,42 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
.content("{\"id\": 67,\"date\": \"2015-01-20\",\"assets\":"
+ " [{\"id\":356,\"name\": \"sample\"}]}")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`id`", "`Number`", "one").row("`date`", "`String`", "two")
.row("`assets`", "`Array`", "three")
.row("`assets[]`", "`Array`", "four")
.row("`assets[].id`", "`Number`", "five")
.row("`assets[].name`", "`String`", "six"));
}
@Test
public void prefixedAdditionalDescriptors() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`Object`", "one").row("`a.b`", "`Number`", "two")
.row("`a.c`", "`String`", "three"));
PayloadDocumentation.responseFields(fieldWithPath("a").description("one"))
.andWithPrefix("a.", fieldWithPath("b").description("two"),
fieldWithPath("c").description("three"))
.document(this.operationBuilder.response()
.content("{\"a\": {\"b\": 5, \"c\": \"charlie\"}}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a`", "`Object`", "one").row("`a.b`", "`Number`", "two")
.row("`a.c`", "`String`", "three"));
}
@Test
public void responseWithFieldsWithEscapedContent() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("`one|two`"),
escapeIfNecessary("three|four")));
new ResponseFieldsSnippet(Arrays.asList(
fieldWithPath("Foo|Bar").type("one|two").description("three|four")))
.document(this.operationBuilder.response()
.content("{\"Foo|Bar\": 5}").build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("`one|two`"),
escapeIfNecessary("three|four")));
}
@Test
public void mapResponseWithVaryingKeysMatchedUsingWildcard() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`things.*.size`", "`String`", "one")
.row("`things.*.type`", "`String`", "two"));
new ResponseFieldsSnippet(
Arrays.asList(fieldWithPath("things.*.size").description("one"),
fieldWithPath("things.*.type").description("two")))
@@ -427,13 +407,14 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
+ "\"gzM33\" : {\"type\": \"Screw\","
+ "\"size\": \"SMALL\"}}}")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`things.*.size`", "`String`", "one")
.row("`things.*.type`", "`String`", "two"));
}
@Test
public void responseWithArrayContainingFieldThatIsSometimesNull() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`assets[].name`", "`String`", "one"));
new ResponseFieldsSnippet(Arrays.asList(fieldWithPath("assets[].name")
.description("one").type(JsonFieldType.STRING).optional()))
.document(this.operationBuilder.response()
@@ -441,14 +422,13 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
+ "{\"name\": null}, "
+ "{\"name\": \"sample2\"}]}")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`assets[].name`",
"`String`", "one"));
}
@Test
public void optionalFieldBeneathArrayThatIsSometimesAbsent() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description")
.row("`a[].b`", "`Number`", "one")
.row("`a[].c`", "`Number`", "two"));
new ResponseFieldsSnippet(Arrays.asList(
fieldWithPath("a[].b").description("one").type(JsonFieldType.NUMBER)
.optional(),
@@ -458,17 +438,21 @@ public class ResponseFieldsSnippetTests extends AbstractSnippetTests {
.content("{\"a\":[{\"b\": 1,\"c\": 2}, "
+ "{\"c\": 2}, {\"b\": 1,\"c\": 2}]}")
.build());
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description")
.row("`a[].b`", "`Number`", "one")
.row("`a[].c`", "`Number`", "two"));
}
@Test
public void typeDeterminationDoesNotSetTypeOnDescriptor() throws IOException {
this.snippets.expectResponseFields()
.withContents(tableWithHeader("Path", "Type", "Description").row("`id`",
"`Number`", "one"));
FieldDescriptor descriptor = fieldWithPath("id").description("one");
new ResponseFieldsSnippet(Arrays.asList(descriptor)).document(
this.operationBuilder.response().content("{\"id\": 67}").build());
assertThat(descriptor.getType(), is(nullValue()));
assertThat(descriptor.getType()).isNull();
assertThat(this.generatedSnippets.responseFields())
.is(tableWithHeader("Path", "Type", "Description").row("`id`", "`Number`",
"one"));
}
private String escapeIfNecessary(String input) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -22,10 +22,7 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.payload.PayloadDocumentation.fieldWithPath;
import static org.springframework.restdocs.payload.PayloadDocumentation.subsectionWithPath;
@@ -43,7 +40,7 @@ public class XmlContentHandlerTests {
public void topLevelElementCanBeDocumented() {
String undocumentedContent = createHandler("<a>5</a>").getUndocumentedContent(
Arrays.asList(fieldWithPath("a").type("a").description("description")));
assertThat(undocumentedContent, is(nullValue()));
assertThat(undocumentedContent).isNull();
}
@Test
@@ -51,7 +48,7 @@ public class XmlContentHandlerTests {
String undocumentedContent = createHandler("<a><b>5</b></a>")
.getUndocumentedContent(Arrays.asList(
fieldWithPath("a/b").type("b").description("description")));
assertThat(undocumentedContent, is(equalTo(String.format("<a/>%n"))));
assertThat(undocumentedContent).isEqualTo(String.format("<a/>%n"));
}
@Test
@@ -59,8 +56,8 @@ public class XmlContentHandlerTests {
String undocumentedContent = createHandler("<a><b>5</b></a>")
.getUndocumentedContent(Arrays
.asList(fieldWithPath("a").type("a").description("description")));
assertThat(undocumentedContent,
is(equalTo(String.format("<a>%n <b>5</b>%n</a>%n"))));
assertThat(undocumentedContent)
.isEqualTo(String.format("<a>%n <b>5</b>%n</a>%n"));
}
@Test
@@ -68,7 +65,7 @@ public class XmlContentHandlerTests {
String undocumentedContent = createHandler("<a><b>5</b></a>")
.getUndocumentedContent(Arrays.asList(
subsectionWithPath("a").type("a").description("description")));
assertThat(undocumentedContent, is(nullValue()));
assertThat(undocumentedContent).isNull();
}
@Test
@@ -77,7 +74,7 @@ public class XmlContentHandlerTests {
.getUndocumentedContent(Arrays.asList(
fieldWithPath("a").type("a").description("description"),
fieldWithPath("a/b").type("b").description("description")));
assertThat(undocumentedContent, is(nullValue()));
assertThat(undocumentedContent).isNull();
}
@Test
@@ -86,7 +83,7 @@ public class XmlContentHandlerTests {
.getUndocumentedContent(Arrays.asList(
fieldWithPath("a/b").type("b").description("description"),
fieldWithPath("a").type("a").description("description")));
assertThat(undocumentedContent, is(nullValue()));
assertThat(undocumentedContent).isNull();
}
@Test

View File

@@ -26,7 +26,6 @@ import org.junit.rules.ExpectedException;
import org.springframework.restdocs.generate.RestDocumentationGenerator;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.equalTo;
@@ -44,9 +43,6 @@ public class PathParametersSnippetFailureTests {
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
@Rule
public ExpectedException thrown = ExpectedException.none();

View File

@@ -29,7 +29,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
@@ -49,86 +49,86 @@ public class PathParametersSnippetTests extends AbstractSnippetTests {
@Test
public void pathParameters() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
new PathParametersSnippet(Arrays.asList(parameterWithName("a").description("one"),
parameterWithName("b").description("two"))).document(this.operationBuilder
.attribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}/{b}")
.build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
}
@Test
public void ignoredPathParameter() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle(), "Parameter", "Description").row("`b`",
"two"));
new PathParametersSnippet(Arrays.asList(parameterWithName("a").ignored(),
parameterWithName("b").description("two"))).document(this.operationBuilder
.attribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}/{b}")
.build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`b`", "two"));
}
@Test
public void allUndocumentedPathParametersCanBeIgnored() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle(), "Parameter", "Description").row("`b`",
"two"));
new PathParametersSnippet(
Arrays.asList(parameterWithName("b").description("two")), true)
.document(this.operationBuilder.attribute(
RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}/{b}").build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`b`", "two"));
}
@Test
public void missingOptionalPathParameter() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle("/{a}"), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
new PathParametersSnippet(Arrays.asList(parameterWithName("a").description("one"),
parameterWithName("b").description("two").optional()))
.document(this.operationBuilder.attribute(
RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}").build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle("/{a}"), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
}
@Test
public void presentOptionalPathParameter() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle("/{a}"), "Parameter", "Description")
.row("`a`", "one"));
new PathParametersSnippet(
Arrays.asList(parameterWithName("a").description("one").optional()))
.document(this.operationBuilder.attribute(
RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}").build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle("/{a}"), "Parameter", "Description")
.row("`a`", "one"));
}
@Test
public void pathParametersWithQueryString() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
new PathParametersSnippet(Arrays.asList(parameterWithName("a").description("one"),
parameterWithName("b").description("two"))).document(this.operationBuilder
.attribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}/{b}?foo=bar")
.build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
}
@Test
public void pathParametersWithQueryStringWithParameters() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
new PathParametersSnippet(Arrays.asList(parameterWithName("a").description("one"),
parameterWithName("b").description("two"))).document(this.operationBuilder
.attribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}/{b}?foo={c}")
.build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
}
@Test
@@ -136,8 +136,6 @@ public class PathParametersSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("path-parameters"))
.willReturn(snippetResource("path-parameters-with-title"));
this.snippets.expectPathParameters().withContents(containsString("The title"));
new PathParametersSnippet(
Arrays.asList(
parameterWithName("a").description("one")
@@ -151,7 +149,7 @@ public class PathParametersSnippetTests extends AbstractSnippetTests {
.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.build());
assertThat(this.generatedSnippets.pathParameters()).contains("The title");
}
@Test
@@ -159,10 +157,6 @@ public class PathParametersSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("path-parameters"))
.willReturn(snippetResource("path-parameters-with-extra-column"));
this.snippets.expectPathParameters()
.withContents(tableWithHeader("Parameter", "Description", "Foo")
.row("a", "one", "alpha").row("b", "two", "bravo"));
new PathParametersSnippet(Arrays.asList(
parameterWithName("a").description("one")
.attributes(key("foo").value("alpha")),
@@ -173,34 +167,36 @@ public class PathParametersSnippetTests extends AbstractSnippetTests {
.attribute(TemplateEngine.class.getName(),
new MustacheTemplateEngine(resolver))
.build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithHeader("Parameter", "Description", "Foo")
.row("a", "one", "alpha").row("b", "two", "bravo"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectPathParameters().withContents(
tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
RequestDocumentation.pathParameters(parameterWithName("a").description("one"))
.and(parameterWithName("b").description("two"))
.document(this.operationBuilder
.attribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"/{a}/{b}")
.build());
assertThat(this.generatedSnippets.pathParameters())
.is(tableWithTitleAndHeader(getTitle(), "Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
}
@Test
public void pathParametersWithEscapedContent() throws IOException {
this.snippets.expectPathParameters()
.withContents(tableWithTitleAndHeader(getTitle("{Foo|Bar}"), "Parameter",
"Description").row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
RequestDocumentation
.pathParameters(parameterWithName("Foo|Bar").description("one|two"))
.document(this.operationBuilder
.attribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
"{Foo|Bar}")
.build());
assertThat(this.generatedSnippets.pathParameters()).is(
tableWithTitleAndHeader(getTitle("{Foo|Bar}"), "Parameter", "Description")
.row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
}
private String escapeIfNecessary(String input) {

View File

@@ -25,7 +25,6 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.equalTo;
@@ -43,9 +42,6 @@ public class RequestParametersSnippetFailureTests {
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
@Rule
public ExpectedException thrown = ExpectedException.none();

View File

@@ -28,7 +28,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
@@ -48,66 +48,66 @@ public class RequestParametersSnippetTests extends AbstractSnippetTests {
@Test
public void requestParameters() throws IOException {
this.snippets.expectRequestParameters()
.withContents(tableWithHeader("Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
new RequestParametersSnippet(
Arrays.asList(parameterWithName("a").description("one"),
parameterWithName("b").description("two"))).document(
this.operationBuilder.request("http://localhost")
.param("a", "bravo").param("b", "bravo").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row("`a`", "one")
.row("`b`", "two"));
}
@Test
public void requestParameterWithNoValue() throws IOException {
this.snippets.expectRequestParameters().withContents(
tableWithHeader("Parameter", "Description").row("`a`", "one"));
new RequestParametersSnippet(
Arrays.asList(parameterWithName("a").description("one")))
.document(this.operationBuilder.request("http://localhost")
.param("a").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row("`a`", "one"));
}
@Test
public void ignoredRequestParameter() throws IOException {
this.snippets.expectRequestParameters().withContents(
tableWithHeader("Parameter", "Description").row("`b`", "two"));
new RequestParametersSnippet(Arrays.asList(parameterWithName("a").ignored(),
parameterWithName("b").description("two")))
.document(this.operationBuilder.request("http://localhost")
.param("a", "bravo").param("b", "bravo").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row("`b`", "two"));
}
@Test
public void allUndocumentedRequestParametersCanBeIgnored() throws IOException {
this.snippets.expectRequestParameters().withContents(
tableWithHeader("Parameter", "Description").row("`b`", "two"));
new RequestParametersSnippet(
Arrays.asList(parameterWithName("b").description("two")), true)
.document(this.operationBuilder.request("http://localhost")
.param("a", "bravo").param("b", "bravo").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row("`b`", "two"));
}
@Test
public void missingOptionalRequestParameter() throws IOException {
this.snippets.expectRequestParameters()
.withContents(tableWithHeader("Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
new RequestParametersSnippet(
Arrays.asList(parameterWithName("a").description("one").optional(),
parameterWithName("b").description("two"))).document(
this.operationBuilder.request("http://localhost")
.param("b", "bravo").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row("`a`", "one")
.row("`b`", "two"));
}
@Test
public void presentOptionalRequestParameter() throws IOException {
this.snippets.expectRequestParameters().withContents(
tableWithHeader("Parameter", "Description").row("`a`", "one"));
new RequestParametersSnippet(
Arrays.asList(parameterWithName("a").description("one").optional()))
.document(this.operationBuilder.request("http://localhost")
.param("a", "one").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row("`a`", "one"));
}
@Test
@@ -115,8 +115,6 @@ public class RequestParametersSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-parameters"))
.willReturn(snippetResource("request-parameters-with-title"));
this.snippets.expectRequestParameters().withContents(containsString("The title"));
new RequestParametersSnippet(Arrays.asList(
parameterWithName("a").description("one")
.attributes(key("foo").value("alpha")),
@@ -128,6 +126,7 @@ public class RequestParametersSnippetTests extends AbstractSnippetTests {
new MustacheTemplateEngine(resolver))
.request("http://localhost").param("a", "alpha")
.param("b", "bravo").build());
assertThat(this.generatedSnippets.requestParameters()).contains("The title");
}
@Test
@@ -135,10 +134,6 @@ public class RequestParametersSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-parameters"))
.willReturn(snippetResource("request-parameters-with-extra-column"));
this.snippets.expectRequestParameters()
.withContents(tableWithHeader("Parameter", "Description", "Foo")
.row("a", "one", "alpha").row("b", "two", "bravo"));
new RequestParametersSnippet(Arrays.asList(
parameterWithName("a").description("one")
.attributes(key("foo").value("alpha")),
@@ -152,6 +147,9 @@ public class RequestParametersSnippetTests extends AbstractSnippetTests {
.request("http://localhost")
.param("a", "alpha").param("b", "bravo")
.build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description", "Foo")
.row("a", "one", "alpha").row("b", "two", "bravo"));
}
@Test
@@ -159,10 +157,6 @@ public class RequestParametersSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-parameters"))
.willReturn(snippetResource("request-parameters-with-optional-column"));
this.snippets.expectRequestParameters()
.withContents(tableWithHeader("Parameter", "Optional", "Description")
.row("a", "true", "one").row("b", "false", "two"));
new RequestParametersSnippet(
Arrays.asList(parameterWithName("a").description("one").optional(),
parameterWithName("b").description("two")))
@@ -174,29 +168,31 @@ public class RequestParametersSnippetTests extends AbstractSnippetTests {
.request("http://localhost")
.param("a", "alpha").param("b", "bravo")
.build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Optional", "Description")
.row("a", "true", "one").row("b", "false", "two"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectRequestParameters()
.withContents(tableWithHeader("Parameter", "Description")
.row("`a`", "one").row("`b`", "two"));
RequestDocumentation.requestParameters(parameterWithName("a").description("one"))
.and(parameterWithName("b").description("two"))
.document(this.operationBuilder.request("http://localhost")
.param("a", "bravo").param("b", "bravo").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row("`a`", "one")
.row("`b`", "two"));
}
@Test
public void requestParametersWithEscapedContent() throws IOException {
this.snippets.expectRequestParameters()
.withContents(tableWithHeader("Parameter", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("one|two")));
RequestDocumentation
.requestParameters(parameterWithName("Foo|Bar").description("one|two"))
.document(this.operationBuilder.request("http://localhost")
.param("Foo|Bar", "baz").build());
assertThat(this.generatedSnippets.requestParameters())
.is(tableWithHeader("Parameter", "Description").row(
escapeIfNecessary("`Foo|Bar`"), escapeIfNecessary("one|two")));
}
private String escapeIfNecessary(String input) {

View File

@@ -25,7 +25,6 @@ import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.restdocs.snippet.SnippetException;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.equalTo;
@@ -43,9 +42,6 @@ public class RequestPartsSnippetFailureTests {
@Rule
public OperationBuilder operationBuilder = new OperationBuilder(asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(asciidoctor());
@Rule
public ExpectedException thrown = ExpectedException.none();

View File

@@ -28,7 +28,7 @@ import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.templates.TemplateResourceResolver;
import org.springframework.restdocs.templates.mustache.MustacheTemplateEngine;
import static org.hamcrest.CoreMatchers.containsString;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.request.RequestDocumentation.partWithName;
@@ -48,57 +48,57 @@ public class RequestPartsSnippetTests extends AbstractSnippetTests {
@Test
public void requestParts() throws IOException {
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Description").row("`a`", "one")
.row("`b`", "two"));
new RequestPartsSnippet(Arrays.asList(partWithName("a").description("one"),
partWithName("b").description("two")))
.document(this.operationBuilder.request("http://localhost")
.part("a", "bravo".getBytes()).and()
.part("b", "bravo".getBytes()).build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Description").row("`a`", "one").row("`b`",
"two"));
}
@Test
public void ignoredRequestPart() throws IOException {
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Description").row("`b`", "two"));
new RequestPartsSnippet(Arrays.asList(partWithName("a").ignored(),
partWithName("b").description("two")))
.document(this.operationBuilder.request("http://localhost")
.part("a", "bravo".getBytes()).and()
.part("b", "bravo".getBytes()).build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Description").row("`b`", "two"));
}
@Test
public void allUndocumentedRequestPartsCanBeIgnored() throws IOException {
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Description").row("`b`", "two"));
new RequestPartsSnippet(Arrays.asList(partWithName("b").description("two")), true)
.document(this.operationBuilder.request("http://localhost")
.part("a", "bravo".getBytes()).and().part("b", "bravo".getBytes())
.build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Description").row("`b`", "two"));
}
@Test
public void missingOptionalRequestPart() throws IOException {
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Description").row("`a`", "one")
.row("`b`", "two"));
new RequestPartsSnippet(
Arrays.asList(partWithName("a").description("one").optional(),
partWithName("b").description("two"))).document(
this.operationBuilder.request("http://localhost")
.part("b", "bravo".getBytes()).build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Description").row("`a`", "one").row("`b`",
"two"));
}
@Test
public void presentOptionalRequestPart() throws IOException {
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Description").row("`a`", "one"));
new RequestPartsSnippet(
Arrays.asList(partWithName("a").description("one").optional()))
.document(this.operationBuilder.request("http://localhost")
.part("a", "one".getBytes()).build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Description").row("`a`", "one"));
}
@Test
@@ -106,8 +106,6 @@ public class RequestPartsSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-parts"))
.willReturn(snippetResource("request-parts-with-title"));
this.snippets.expectRequestParts().withContents(containsString("The title"));
new RequestPartsSnippet(Arrays.asList(
partWithName("a").description("one")
.attributes(key("foo").value("alpha")),
@@ -119,6 +117,7 @@ public class RequestPartsSnippetTests extends AbstractSnippetTests {
new MustacheTemplateEngine(resolver))
.request("http://localhost").part("a", "alpha".getBytes())
.and().part("b", "bravo".getBytes()).build());
assertThat(this.generatedSnippets.requestParts()).contains("The title");
}
@Test
@@ -126,10 +125,6 @@ public class RequestPartsSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-parts"))
.willReturn(snippetResource("request-parts-with-extra-column"));
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Description", "Foo")
.row("a", "one", "alpha").row("b", "two", "bravo"));
new RequestPartsSnippet(Arrays.asList(
partWithName("a").description("one")
.attributes(key("foo").value("alpha")),
@@ -143,6 +138,9 @@ public class RequestPartsSnippetTests extends AbstractSnippetTests {
.request("http://localhost")
.part("a", "alpha".getBytes()).and()
.part("b", "bravo".getBytes()).build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Description", "Foo").row("a", "one", "alpha")
.row("b", "two", "bravo"));
}
@Test
@@ -150,10 +148,6 @@ public class RequestPartsSnippetTests extends AbstractSnippetTests {
TemplateResourceResolver resolver = mock(TemplateResourceResolver.class);
given(resolver.resolveTemplateResource("request-parts"))
.willReturn(snippetResource("request-parts-with-optional-column"));
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Optional", "Description")
.row("a", "true", "one").row("b", "false", "two"));
new RequestPartsSnippet(
Arrays.asList(partWithName("a").description("one").optional(),
partWithName("b").description("two")))
@@ -165,29 +159,31 @@ public class RequestPartsSnippetTests extends AbstractSnippetTests {
.request("http://localhost")
.part("a", "alpha".getBytes()).and()
.part("b", "bravo".getBytes()).build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Optional", "Description")
.row("a", "true", "one").row("b", "false", "two"));
}
@Test
public void additionalDescriptors() throws IOException {
this.snippets.expectRequestParts()
.withContents(tableWithHeader("Part", "Description").row("`a`", "one")
.row("`b`", "two"));
RequestDocumentation.requestParts(partWithName("a").description("one"))
.and(partWithName("b").description("two"))
.document(this.operationBuilder.request("http://localhost")
.part("a", "bravo".getBytes()).and().part("b", "bravo".getBytes())
.build());
assertThat(this.generatedSnippets.requestParts())
.is(tableWithHeader("Part", "Description").row("`a`", "one").row("`b`",
"two"));
}
@Test
public void requestPartsWithEscapedContent() throws IOException {
this.snippets.expectRequestParts().withContents(
tableWithHeader("Part", "Description").row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
RequestDocumentation.requestParts(partWithName("Foo|Bar").description("one|two"))
.document(this.operationBuilder.request("http://localhost")
.part("Foo|Bar", "baz".getBytes()).build());
assertThat(this.generatedSnippets.requestParts()).is(
tableWithHeader("Part", "Description").row(escapeIfNecessary("`Foo|Bar`"),
escapeIfNecessary("one|two")));
}
private String escapeIfNecessary(String input) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2015 the original author or authors.
* Copyright 2014-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.
@@ -22,8 +22,7 @@ import org.springframework.restdocs.ManualRestDocumentation;
import org.springframework.restdocs.RestDocumentationContext;
import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link RestDocumentationContextPlaceholderResolver}.
@@ -35,43 +34,45 @@ public class RestDocumentationContextPlaceholderResolverTests {
@Test
public void kebabCaseMethodName() throws Exception {
assertThat(createResolver("dashSeparatedMethodName").resolvePlaceholder(
"method-name"), equalTo("dash-separated-method-name"));
assertThat(createResolver("dashSeparatedMethodName")
.resolvePlaceholder("method-name"))
.isEqualTo("dash-separated-method-name");
}
@Test
public void snakeCaseMethodName() throws Exception {
assertThat(createResolver("underscoreSeparatedMethodName").resolvePlaceholder(
"method_name"), equalTo("underscore_separated_method_name"));
assertThat(createResolver("underscoreSeparatedMethodName")
.resolvePlaceholder("method_name"))
.isEqualTo("underscore_separated_method_name");
}
@Test
public void camelCaseMethodName() throws Exception {
assertThat(createResolver("camelCaseMethodName").resolvePlaceholder("methodName"),
equalTo("camelCaseMethodName"));
assertThat(createResolver("camelCaseMethodName").resolvePlaceholder("methodName"))
.isEqualTo("camelCaseMethodName");
}
@Test
public void kebabCaseClassName() throws Exception {
assertThat(createResolver().resolvePlaceholder("class-name"),
equalTo("rest-documentation-context-placeholder-resolver-tests"));
assertThat(createResolver().resolvePlaceholder("class-name"))
.isEqualTo("rest-documentation-context-placeholder-resolver-tests");
}
@Test
public void snakeCaseClassName() throws Exception {
assertThat(createResolver().resolvePlaceholder("class_name"),
equalTo("rest_documentation_context_placeholder_resolver_tests"));
assertThat(createResolver().resolvePlaceholder("class_name"))
.isEqualTo("rest_documentation_context_placeholder_resolver_tests");
}
@Test
public void camelCaseClassName() throws Exception {
assertThat(createResolver().resolvePlaceholder("ClassName"),
equalTo("RestDocumentationContextPlaceholderResolverTests"));
assertThat(createResolver().resolvePlaceholder("ClassName"))
.isEqualTo("RestDocumentationContextPlaceholderResolverTests");
}
@Test
public void stepCount() throws Exception {
assertThat(createResolver("stepCount").resolvePlaceholder("step"), equalTo("1"));
assertThat(createResolver("stepCount").resolvePlaceholder("step")).isEqualTo("1");
}
private PlaceholderResolver createResolver() {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-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.
@@ -30,9 +30,7 @@ import org.springframework.restdocs.RestDocumentationContext;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.PropertyPlaceholderHelper.PlaceholderResolver;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
@@ -56,29 +54,26 @@ public class StandardWriterResolverTests {
@Test
public void absoluteInput() {
String absolutePath = new File("foo").getAbsolutePath();
assertThat(
this.resolver.resolveFile(absolutePath, "bar.txt",
createContext(absolutePath)),
is(new File(absolutePath, "bar.txt")));
assertThat(this.resolver.resolveFile(absolutePath, "bar.txt",
createContext(absolutePath)))
.isEqualTo(new File(absolutePath, "bar.txt"));
}
@Test
public void configuredOutputAndRelativeInput() {
File outputDir = new File("foo").getAbsoluteFile();
assertThat(
this.resolver.resolveFile("bar", "baz.txt",
createContext(outputDir.getAbsolutePath())),
is(new File(outputDir, "bar/baz.txt")));
assertThat(this.resolver.resolveFile("bar", "baz.txt",
createContext(outputDir.getAbsolutePath())))
.isEqualTo(new File(outputDir, "bar/baz.txt"));
}
@Test
public void configuredOutputAndAbsoluteInput() {
File outputDir = new File("foo").getAbsoluteFile();
String absolutePath = new File("bar").getAbsolutePath();
assertThat(
this.resolver.resolveFile(absolutePath, "baz.txt",
createContext(outputDir.getAbsolutePath())),
is(new File(absolutePath, "baz.txt")));
assertThat(this.resolver.resolveFile(absolutePath, "baz.txt",
createContext(outputDir.getAbsolutePath())))
.isEqualTo(new File(absolutePath, "baz.txt"));
}
@Test
@@ -117,9 +112,9 @@ public class StandardWriterResolverTests {
throws IOException {
writer.write("test");
writer.flush();
assertThat(expectedLocation.exists(), is(true));
assertThat(FileCopyUtils.copyToString(new FileReader(expectedLocation)),
is(equalTo("test")));
assertThat(expectedLocation).exists();
assertThat(FileCopyUtils.copyToString(new FileReader(expectedLocation)))
.isEqualTo("test");
}
}

View File

@@ -26,15 +26,10 @@ import org.junit.Test;
import org.springframework.restdocs.operation.Operation;
import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.restdocs.test.ExpectedSnippets;
import org.springframework.restdocs.test.GeneratedSnippets;
import org.springframework.restdocs.test.OperationBuilder;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link TemplatedSnippet}.
@@ -48,7 +43,7 @@ public class TemplatedSnippetTests {
TemplateFormats.asciidoctor());
@Rule
public ExpectedSnippets snippets = new ExpectedSnippets(
public GeneratedSnippets snippets = new GeneratedSnippets(
TemplateFormats.asciidoctor());
@Test
@@ -57,30 +52,30 @@ public class TemplatedSnippetTests {
attributes.put("a", "alpha");
TemplatedSnippet snippet = new TestTemplatedSnippet(attributes);
attributes.put("b", "bravo");
assertThat(snippet.getAttributes().size(), is(1));
assertThat(snippet.getAttributes(), hasEntry("a", (Object) "alpha"));
assertThat(snippet.getAttributes()).hasSize(1);
assertThat(snippet.getAttributes()).containsEntry("a", "alpha");
}
@Test
public void nullAttributesAreTolerated() {
assertThat(new TestTemplatedSnippet(null).getAttributes(), is(not(nullValue())));
assertThat(new TestTemplatedSnippet(null).getAttributes().size(), is(0));
assertThat(new TestTemplatedSnippet(null).getAttributes()).isNotNull();
assertThat(new TestTemplatedSnippet(null).getAttributes()).isEmpty();
}
@Test
public void snippetName() {
assertThat(new TestTemplatedSnippet(Collections.<String, Object>emptyMap())
.getSnippetName(), is(equalTo("test")));
.getSnippetName()).isEqualTo("test");
}
@Test
public void multipleSnippetsCanBeProducedFromTheSameTemplate() throws IOException {
this.snippets.expect("multiple-snippets-one");
this.snippets.expect("multiple-snippets-two");
new TestTemplatedSnippet("one", "multiple-snippets")
.document(this.operationBuilder.build());
new TestTemplatedSnippet("two", "multiple-snippets")
.document(this.operationBuilder.build());
assertThat(this.snippets.snippet("multiple-snippets-one")).isNotNull();
assertThat(this.snippets.snippet("multiple-snippets-two")).isNotNull();
}
private static class TestTemplatedSnippet extends TemplatedSnippet {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -27,9 +27,8 @@ import org.junit.rules.ExpectedException;
import org.springframework.core.io.Resource;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
/**
@@ -69,8 +68,8 @@ public class StandardTemplateResourceResolverTests {
});
assertThat(snippet.getURL(), is(
equalTo(getClass().getResource("test-format-specific-custom.snippet"))));
assertThat(snippet.getURL())
.isEqualTo(getClass().getResource("test-format-specific-custom.snippet"));
}
@Test
@@ -93,8 +92,8 @@ public class StandardTemplateResourceResolverTests {
});
assertThat(snippet.getURL(),
is(equalTo(getClass().getResource("test-custom.snippet"))));
assertThat(snippet.getURL())
.isEqualTo(getClass().getResource("test-custom.snippet"));
}
@Test
@@ -113,8 +112,8 @@ public class StandardTemplateResourceResolverTests {
});
assertThat(snippet.getURL(),
is(equalTo(getClass().getResource("test-default.snippet"))));
assertThat(snippet.getURL())
.isEqualTo(getClass().getResource("test-default.snippet"));
}
@Test

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-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.
@@ -23,9 +23,7 @@ import org.junit.Test;
import org.springframework.restdocs.mustache.Template.Fragment;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
@@ -42,7 +40,7 @@ public class AsciidoctorTableCellContentLambdaTests {
given(fragment.execute()).willReturn("|foo|bar|baz|");
StringWriter writer = new StringWriter();
new AsciidoctorTableCellContentLambda().execute(fragment, writer);
assertThat(writer.toString(), is(equalTo("\\|foo\\|bar\\|baz\\|")));
assertThat(writer.toString()).isEqualTo("\\|foo\\|bar\\|baz\\|");
}
@Test
@@ -51,7 +49,7 @@ public class AsciidoctorTableCellContentLambdaTests {
given(fragment.execute()).willReturn("\\|foo|bar\\|baz|");
StringWriter writer = new StringWriter();
new AsciidoctorTableCellContentLambda().execute(fragment, writer);
assertThat(writer.toString(), is(equalTo("\\|foo\\|bar\\|baz\\|")));
assertThat(writer.toString()).isEqualTo("\\|foo\\|bar\\|baz\\|");
}
}

View File

@@ -1,181 +0,0 @@
/*
* Copyright 2014-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.test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.hamcrest.Matcher;
import org.junit.runners.model.Statement;
import org.springframework.restdocs.snippet.TemplatedSnippet;
import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.test.SnippetMatchers.SnippetMatcher;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
/**
* The {@code ExpectedSnippets} rule is used to verify that a test of a
* {@link TemplatedSnippet} has generated the expected snippets.
*
* @author Andy Wilkinson
* @author Andreas Evers
*/
public class ExpectedSnippets extends OperationTestRule {
private final TemplateFormat templateFormat;
private String operationName;
private File outputDirectory;
private List<ExpectedSnippet> expectations = new ArrayList<>();
public ExpectedSnippets(TemplateFormat templateFormat) {
this.templateFormat = templateFormat;
}
@Override
public Statement apply(final Statement base, File outputDirectory,
String operationName) {
this.outputDirectory = outputDirectory;
this.operationName = operationName;
return new ExpectedSnippetsStatement(base);
}
private void verifySnippets() throws IOException {
if (this.outputDirectory != null && this.operationName != null) {
File snippetDir = new File(this.outputDirectory, this.operationName);
for (ExpectedSnippet expectation : this.expectations) {
expectation.verify(snippetDir);
}
}
}
public ExpectedSnippet expectCurlRequest() {
return expect("curl-request");
}
public ExpectedSnippet expectHttpieRequest() {
return expect("httpie-request");
}
public ExpectedSnippet expectRequestFields() {
return expect("request-fields");
}
public ExpectedSnippet expectRequestPartFields(String partName) {
return expect("request-part-" + partName + "-fields");
}
public ExpectedSnippet expectResponseFields() {
return expect("response-fields");
}
public ExpectedSnippet expectRequestHeaders() {
return expect("request-headers");
}
public ExpectedSnippet expectResponseHeaders() {
return expect("response-headers");
}
public ExpectedSnippet expectLinks() {
return expect("links");
}
public ExpectedSnippet expectHttpRequest() {
return expect("http-request");
}
public ExpectedSnippet expectHttpResponse() {
return expect("http-response");
}
public ExpectedSnippet expectRequestParameters() {
return expect("request-parameters");
}
public ExpectedSnippet expectPathParameters() {
return expect("path-parameters");
}
public ExpectedSnippet expectRequestParts() {
return expect("request-parts");
}
public ExpectedSnippet expect(String type) {
ExpectedSnippet expectedSnippet = new ExpectedSnippet(
SnippetMatchers.snippet(this.templateFormat), type);
this.expectations.add(expectedSnippet);
return expectedSnippet;
}
public File getOutputDirectory() {
return this.outputDirectory;
}
public String getOperationName() {
return this.operationName;
}
/**
* Expecations for a particular snippet.
*/
public final class ExpectedSnippet {
private final SnippetMatcher snippetMatcher;
private final String snippetName;
private ExpectedSnippet(SnippetMatcher snippetMatcher, String snippetName) {
this.snippetMatcher = snippetMatcher;
this.snippetName = snippetName;
}
private void verify(File snippetDir) {
File snippetFile = new File(snippetDir, this.snippetName + "."
+ ExpectedSnippets.this.templateFormat.getFileExtension());
assertThat(snippetFile, is(this.snippetMatcher));
}
public void withContents(Matcher<String> matcher) {
this.snippetMatcher.withContents(matcher);
}
}
private final class ExpectedSnippetsStatement extends Statement {
private final Statement delegate;
private ExpectedSnippetsStatement(Statement delegate) {
this.delegate = delegate;
}
@Override
public void evaluate() throws Throwable {
this.delegate.evaluate();
verifySnippets();
}
}
}

View File

@@ -0,0 +1,132 @@
/*
* Copyright 2014-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.restdocs.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import org.junit.runners.model.Statement;
import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.util.FileCopyUtils;
import static org.assertj.core.api.Assertions.fail;
/**
* The {@code GeneratedSnippets} rule is used to capture the snippets generated by a test
* and assert their existence and content.
*
* @author Andy Wilkinson
* @author Andreas Evers
*/
public class GeneratedSnippets extends OperationTestRule {
private final TemplateFormat templateFormat;
private String operationName;
private File outputDirectory;
public GeneratedSnippets(TemplateFormat templateFormat) {
this.templateFormat = templateFormat;
}
@Override
public Statement apply(Statement base, File outputDirectory, String operationName) {
this.outputDirectory = outputDirectory;
this.operationName = operationName;
return base;
}
public String curlRequest() {
return snippet("curl-request");
}
public String httpieRequest() {
return snippet("httpie-request");
}
public String requestHeaders() {
return snippet("request-headers");
}
public String responseHeaders() {
return snippet("response-headers");
}
public String httpRequest() {
return snippet("http-request");
}
public String httpResponse() {
return snippet("http-response");
}
public String links() {
return snippet("links");
}
public String requestFields() {
return snippet("request-fields");
}
public String requestParts() {
return snippet("request-parts");
}
public String requestPartFields(String partName) {
return snippet("request-part-" + partName + "-fields");
}
public String responseFields() {
return snippet("response-fields");
}
public String pathParameters() {
return snippet("path-parameters");
}
public String requestParameters() {
return snippet("request-parameters");
}
public String snippet(String name) {
File snippetFile = getSnippetFile(name);
try {
return FileCopyUtils.copyToString(new InputStreamReader(
new FileInputStream(snippetFile), StandardCharsets.UTF_8));
}
catch (Exception ex) {
fail("Failed to read '" + snippetFile + "'", ex);
return null;
}
}
private File getSnippetFile(String name) {
if (this.outputDirectory == null) {
fail("Output directory was null");
}
if (this.operationName == null) {
fail("Operation name was null");
}
File snippetDir = new File(this.outputDirectory, this.operationName);
return new File(snippetDir, name + "." + this.templateFormat.getFileExtension());
}
}

View File

@@ -23,13 +23,14 @@ import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import org.assertj.core.api.HamcrestCondition;
import org.hamcrest.Matcher;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.Matchers.allOf;
import static org.junit.Assert.assertThat;
/**
* JUnit {@code @Rule} to capture output from System.out and System.err.
@@ -59,8 +60,8 @@ public class OutputCapture implements TestRule {
finally {
try {
if (!OutputCapture.this.matchers.isEmpty()) {
assertThat(getOutputAsString(),
allOf(OutputCapture.this.matchers));
assertThat(getOutputAsString()).is(new HamcrestCondition<>(
allOf(OutputCapture.this.matchers)));
}
}
finally {

View File

@@ -0,0 +1,370 @@
/*
* Copyright 2014-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.restdocs.test;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.assertj.core.api.Condition;
import org.assertj.core.description.Description;
import org.springframework.http.HttpStatus;
import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* {@link Condition Conditions} for verify the contents of generated documentation
* snippets.
*
* @author Andy Wilkinson
*/
public final class SnippetConditions {
private SnippetConditions() {
}
public static TableCondition<?> tableWithHeader(TemplateFormat format,
String... headers) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorTableCondition(null, headers);
}
return new MarkdownTableCondition(null, headers);
}
public static TableCondition<?> tableWithTitleAndHeader(TemplateFormat format,
String title, String... headers) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorTableCondition(title, headers);
}
return new MarkdownTableCondition(title, headers);
}
public static HttpRequestCondition httpRequest(TemplateFormat format,
RequestMethod requestMethod, String uri) {
if ("adoc".equals(format.getFileExtension())) {
return new HttpRequestCondition(requestMethod, uri,
new AsciidoctorCodeBlockCondition<>("http", "nowrap"), 3);
}
return new HttpRequestCondition(requestMethod, uri,
new MarkdownCodeBlockCondition<>("http"), 2);
}
public static HttpResponseCondition httpResponse(TemplateFormat format,
HttpStatus status) {
if ("adoc".equals(format.getFileExtension())) {
return new HttpResponseCondition(status,
new AsciidoctorCodeBlockCondition<>("http", "nowrap"), 3);
}
return new HttpResponseCondition(status, new MarkdownCodeBlockCondition<>("http"),
2);
}
@SuppressWarnings({ "rawtypes" })
public static CodeBlockCondition<?> codeBlock(TemplateFormat format,
String language) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorCodeBlockCondition(language, null);
}
return new MarkdownCodeBlockCondition(language);
}
@SuppressWarnings({ "rawtypes" })
public static CodeBlockCondition<?> codeBlock(TemplateFormat format, String language,
String options) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorCodeBlockCondition(language, options);
}
return new MarkdownCodeBlockCondition(language);
}
private static abstract class AbstractSnippetContentCondition
extends Condition<String> {
private List<String> lines = new ArrayList<>();
protected AbstractSnippetContentCondition() {
as(new Description() {
@Override
public String value() {
return getLinesAsString();
}
});
}
protected void addLine(String line) {
this.lines.add(line);
}
protected void addLine(int index, String line) {
this.lines.add(determineIndex(index), line);
}
private int determineIndex(int index) {
if (index >= 0) {
return index;
}
return index + this.lines.size();
}
@Override
public boolean matches(String content) {
return getLinesAsString().equals(content);
}
private String getLinesAsString() {
StringWriter writer = new StringWriter();
Iterator<String> iterator = this.lines.iterator();
while (iterator.hasNext()) {
writer.append(String.format("%s", iterator.next()));
if (iterator.hasNext()) {
writer.append(String.format("%n"));
}
}
return writer.toString();
}
}
/**
* Base class for code block Conditions.
*
* @param <T> The type of the Condition
*/
public static class CodeBlockCondition<T extends CodeBlockCondition<T>>
extends AbstractSnippetContentCondition {
@SuppressWarnings("unchecked")
public T withContent(String content) {
this.addLine(-1, content);
return (T) this;
}
}
/**
* A {@link Condition} for an Asciidoctor code block.
*
* @param <T> The type of the Condition
*/
public static class AsciidoctorCodeBlockCondition<T extends AsciidoctorCodeBlockCondition<T>>
extends CodeBlockCondition<T> {
protected AsciidoctorCodeBlockCondition(String language, String options) {
this.addLine("[source" + (language == null ? "" : "," + language)
+ (options == null ? "" : ",options=\"" + options + "\"") + "]");
this.addLine("----");
this.addLine("----");
}
}
/**
* A {@link Condition} for a Markdown code block.
*
* @param <T> The type of the Condition
*/
public static class MarkdownCodeBlockCondition<T extends MarkdownCodeBlockCondition<T>>
extends CodeBlockCondition<T> {
protected MarkdownCodeBlockCondition(String language) {
this.addLine("```" + (language == null ? "" : language));
this.addLine("```");
}
}
/**
* A {@link Condition} for an HTTP request or response.
*
* @param <T> The type of the Condition
*/
public static abstract class HttpCondition<T extends HttpCondition<T>>
extends Condition<String> {
private final CodeBlockCondition<?> delegate;
private int headerOffset;
protected HttpCondition(CodeBlockCondition<?> delegate, int headerOffset) {
this.delegate = delegate;
this.headerOffset = headerOffset;
}
@SuppressWarnings("unchecked")
public T header(String name, String value) {
this.delegate.addLine(this.headerOffset++, name + ": " + value);
return (T) this;
}
@SuppressWarnings("unchecked")
public T header(String name, long value) {
this.delegate.addLine(this.headerOffset++, name + ": " + value);
return (T) this;
}
@SuppressWarnings("unchecked")
public T content(String content) {
this.delegate.addLine(-1, content);
return (T) this;
}
@Override
public boolean matches(String item) {
return this.delegate.matches(item);
}
// @Override
// public void describeTo(Description description) {
// this.delegate.describeTo(description);
// }
}
/**
* A {@link Condition} for an HTTP response.
*/
public static final class HttpResponseCondition
extends HttpCondition<HttpResponseCondition> {
private HttpResponseCondition(HttpStatus status, CodeBlockCondition<?> delegate,
int headerOffset) {
super(delegate, headerOffset);
this.content("HTTP/1.1 " + status.value() + " " + status.getReasonPhrase());
this.content("");
}
}
/**
* A {@link Condition} for an HTTP request.
*/
public static final class HttpRequestCondition
extends HttpCondition<HttpRequestCondition> {
private HttpRequestCondition(RequestMethod requestMethod, String uri,
CodeBlockCondition<?> delegate, int headerOffset) {
super(delegate, headerOffset);
this.content(requestMethod.name() + " " + uri + " HTTP/1.1");
this.content("");
}
}
/**
* Base class for table Conditions.
*
* @param <T> The concrete type of the Condition
*/
public static abstract class TableCondition<T extends TableCondition<T>>
extends AbstractSnippetContentCondition {
public abstract T row(String... entries);
public abstract T configuration(String configuration);
}
/**
* A {@link Condition} for an Asciidoctor table.
*/
public static final class AsciidoctorTableCondition
extends TableCondition<AsciidoctorTableCondition> {
private AsciidoctorTableCondition(String title, String... columns) {
if (StringUtils.hasText(title)) {
this.addLine("." + title);
}
this.addLine("|===");
String header = "|" + StringUtils
.collectionToDelimitedString(Arrays.asList(columns), "|");
this.addLine(header);
this.addLine("");
this.addLine("|===");
}
@Override
public AsciidoctorTableCondition row(String... entries) {
for (String entry : entries) {
this.addLine(-1, "|" + escapeEntry(entry));
}
this.addLine(-1, "");
return this;
}
private String escapeEntry(String entry) {
if (entry.startsWith("`") && entry.endsWith("`")) {
return "`+" + entry.substring(1, entry.length() - 1) + "+`";
}
return entry;
}
@Override
public AsciidoctorTableCondition configuration(String configuration) {
this.addLine(0, configuration);
return this;
}
}
/**
* A {@link Condition} for a Markdown table.
*/
public static final class MarkdownTableCondition
extends TableCondition<MarkdownTableCondition> {
private MarkdownTableCondition(String title, String... columns) {
if (StringUtils.hasText(title)) {
this.addLine(title);
this.addLine("");
}
String header = StringUtils
.collectionToDelimitedString(Arrays.asList(columns), " | ");
this.addLine(header);
List<String> components = new ArrayList<>();
for (String column : columns) {
StringBuilder dashes = new StringBuilder();
for (int i = 0; i < column.length(); i++) {
dashes.append("-");
}
components.add(dashes.toString());
}
this.addLine(StringUtils.collectionToDelimitedString(components, " | "));
this.addLine("");
}
@Override
public MarkdownTableCondition row(String... entries) {
this.addLine(-1, StringUtils
.collectionToDelimitedString(Arrays.asList(entries), " | "));
return this;
}
@Override
public MarkdownTableCondition configuration(String configuration) {
throw new UnsupportedOperationException(
"Markdown does not support table configuration");
}
}
}

View File

@@ -1,474 +0,0 @@
/*
* Copyright 2014-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.restdocs.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.springframework.http.HttpStatus;
import org.springframework.restdocs.templates.TemplateFormat;
import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMethod;
/**
* {@link Matcher Matchers} for verify the contents of generated documentation snippets.
*
* @author Andy Wilkinson
*/
public final class SnippetMatchers {
private SnippetMatchers() {
}
public static SnippetMatcher snippet(TemplateFormat templateFormat) {
return new SnippetMatcher(templateFormat);
}
public static TableMatcher<?> tableWithHeader(TemplateFormat format,
String... headers) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorTableMatcher(null, headers);
}
return new MarkdownTableMatcher(null, headers);
}
public static TableMatcher<?> tableWithTitleAndHeader(TemplateFormat format,
String title, String... headers) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorTableMatcher(title, headers);
}
return new MarkdownTableMatcher(title, headers);
}
public static HttpRequestMatcher httpRequest(TemplateFormat format,
RequestMethod requestMethod, String uri) {
if ("adoc".equals(format.getFileExtension())) {
return new HttpRequestMatcher(requestMethod, uri,
new AsciidoctorCodeBlockMatcher<>("http", "nowrap"), 3);
}
return new HttpRequestMatcher(requestMethod, uri,
new MarkdownCodeBlockMatcher<>("http"), 2);
}
public static HttpResponseMatcher httpResponse(TemplateFormat format,
HttpStatus status) {
if ("adoc".equals(format.getFileExtension())) {
return new HttpResponseMatcher(status,
new AsciidoctorCodeBlockMatcher<>("http", "nowrap"), 3);
}
return new HttpResponseMatcher(status, new MarkdownCodeBlockMatcher<>("http"), 2);
}
@SuppressWarnings({ "rawtypes" })
public static CodeBlockMatcher<?> codeBlock(TemplateFormat format, String language) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorCodeBlockMatcher(language, null);
}
return new MarkdownCodeBlockMatcher(language);
}
@SuppressWarnings({ "rawtypes" })
public static CodeBlockMatcher<?> codeBlock(TemplateFormat format, String language,
String options) {
if ("adoc".equals(format.getFileExtension())) {
return new AsciidoctorCodeBlockMatcher(language, options);
}
return new MarkdownCodeBlockMatcher(language);
}
private static abstract class AbstractSnippetContentMatcher
extends BaseMatcher<String> {
private final TemplateFormat templateFormat;
private List<String> lines = new ArrayList<>();
protected AbstractSnippetContentMatcher(TemplateFormat templateFormat) {
this.templateFormat = templateFormat;
}
protected void addLine(String line) {
this.lines.add(line);
}
protected void addLine(int index, String line) {
this.lines.add(determineIndex(index), line);
}
private int determineIndex(int index) {
if (index >= 0) {
return index;
}
return index + this.lines.size();
}
@Override
public boolean matches(Object item) {
return getLinesAsString().equals(item);
}
@Override
public void describeTo(Description description) {
description.appendText(this.templateFormat.getFileExtension() + " snippet");
description.appendText(getLinesAsString());
}
@Override
public void describeMismatch(Object item, Description description) {
description.appendText("was:");
if (item instanceof String) {
description.appendText((String) item);
}
else {
description.appendValue(item);
}
}
private String getLinesAsString() {
StringWriter writer = new StringWriter();
Iterator<String> iterator = this.lines.iterator();
while (iterator.hasNext()) {
writer.append(String.format("%s", iterator.next()));
if (iterator.hasNext()) {
writer.append(String.format("%n"));
}
}
return writer.toString();
}
}
/**
* Base class for code block matchers.
*
* @param <T> The type of the matcher
*/
public static class CodeBlockMatcher<T extends CodeBlockMatcher<T>>
extends AbstractSnippetContentMatcher {
protected CodeBlockMatcher(TemplateFormat templateFormat) {
super(templateFormat);
}
@SuppressWarnings("unchecked")
public T content(String content) {
this.addLine(-1, content);
return (T) this;
}
}
/**
* A {@link Matcher} for an Asciidoctor code block.
*
* @param <T> The type of the matcher
*/
public static class AsciidoctorCodeBlockMatcher<T extends AsciidoctorCodeBlockMatcher<T>>
extends CodeBlockMatcher<T> {
protected AsciidoctorCodeBlockMatcher(String language, String options) {
super(TemplateFormats.asciidoctor());
this.addLine("[source" + (language == null ? "" : "," + language)
+ (options == null ? "" : ",options=\"" + options + "\"") + "]");
this.addLine("----");
this.addLine("----");
}
}
/**
* A {@link Matcher} for a Markdown code block.
*
* @param <T> The type of the matcher
*/
public static class MarkdownCodeBlockMatcher<T extends MarkdownCodeBlockMatcher<T>>
extends CodeBlockMatcher<T> {
protected MarkdownCodeBlockMatcher(String language) {
super(TemplateFormats.markdown());
this.addLine("```" + (language == null ? "" : language));
this.addLine("```");
}
}
/**
* A {@link Matcher} for an HTTP request or response.
*
* @param <T> The type of the matcher
*/
public static abstract class HttpMatcher<T extends HttpMatcher<T>>
extends BaseMatcher<String> {
private final CodeBlockMatcher<?> delegate;
private int headerOffset;
protected HttpMatcher(CodeBlockMatcher<?> delegate, int headerOffset) {
this.delegate = delegate;
this.headerOffset = headerOffset;
}
@SuppressWarnings("unchecked")
public T header(String name, String value) {
this.delegate.addLine(this.headerOffset++, name + ": " + value);
return (T) this;
}
@SuppressWarnings("unchecked")
public T header(String name, long value) {
this.delegate.addLine(this.headerOffset++, name + ": " + value);
return (T) this;
}
@SuppressWarnings("unchecked")
public T content(String content) {
this.delegate.addLine(-1, content);
return (T) this;
}
@Override
public boolean matches(Object item) {
return this.delegate.matches(item);
}
@Override
public void describeTo(Description description) {
this.delegate.describeTo(description);
}
}
/**
* A {@link Matcher} for an HTTP response.
*/
public static final class HttpResponseMatcher
extends HttpMatcher<HttpResponseMatcher> {
private HttpResponseMatcher(HttpStatus status, CodeBlockMatcher<?> delegate,
int headerOffset) {
super(delegate, headerOffset);
this.content("HTTP/1.1 " + status.value() + " " + status.getReasonPhrase());
this.content("");
}
}
/**
* A {@link Matcher} for an HTTP request.
*/
public static final class HttpRequestMatcher extends HttpMatcher<HttpRequestMatcher> {
private HttpRequestMatcher(RequestMethod requestMethod, String uri,
CodeBlockMatcher<?> delegate, int headerOffset) {
super(delegate, headerOffset);
this.content(requestMethod.name() + " " + uri + " HTTP/1.1");
this.content("");
}
}
/**
* Base class for table matchers.
*
* @param <T> The concrete type of the matcher
*/
public static abstract class TableMatcher<T extends TableMatcher<T>>
extends AbstractSnippetContentMatcher {
protected TableMatcher(TemplateFormat templateFormat) {
super(templateFormat);
}
public abstract T row(String... entries);
public abstract T configuration(String configuration);
}
/**
* A {@link Matcher} for an Asciidoctor table.
*/
public static final class AsciidoctorTableMatcher
extends TableMatcher<AsciidoctorTableMatcher> {
private AsciidoctorTableMatcher(String title, String... columns) {
super(TemplateFormats.asciidoctor());
if (StringUtils.hasText(title)) {
this.addLine("." + title);
}
this.addLine("|===");
String header = "|" + StringUtils
.collectionToDelimitedString(Arrays.asList(columns), "|");
this.addLine(header);
this.addLine("");
this.addLine("|===");
}
@Override
public AsciidoctorTableMatcher row(String... entries) {
for (String entry : entries) {
this.addLine(-1, "|" + escapeEntry(entry));
}
this.addLine(-1, "");
return this;
}
private String escapeEntry(String entry) {
if (entry.startsWith("`") && entry.endsWith("`")) {
return "`+" + entry.substring(1, entry.length() - 1) + "+`";
}
return entry;
}
@Override
public AsciidoctorTableMatcher configuration(String configuration) {
this.addLine(0, configuration);
return this;
}
}
/**
* A {@link Matcher} for a Markdown table.
*/
public static final class MarkdownTableMatcher
extends TableMatcher<MarkdownTableMatcher> {
private MarkdownTableMatcher(String title, String... columns) {
super(TemplateFormats.asciidoctor());
if (StringUtils.hasText(title)) {
this.addLine(title);
this.addLine("");
}
String header = StringUtils
.collectionToDelimitedString(Arrays.asList(columns), " | ");
this.addLine(header);
List<String> components = new ArrayList<>();
for (String column : columns) {
StringBuilder dashes = new StringBuilder();
for (int i = 0; i < column.length(); i++) {
dashes.append("-");
}
components.add(dashes.toString());
}
this.addLine(StringUtils.collectionToDelimitedString(components, " | "));
this.addLine("");
}
@Override
public MarkdownTableMatcher row(String... entries) {
this.addLine(-1, StringUtils
.collectionToDelimitedString(Arrays.asList(entries), " | "));
return this;
}
@Override
public MarkdownTableMatcher configuration(String configuration) {
throw new UnsupportedOperationException(
"Markdown does not support table configuration");
}
}
/**
* A {@link Matcher} for a snippet file.
*/
public static final class SnippetMatcher extends BaseMatcher<File> {
private final TemplateFormat templateFormat;
private Matcher<String> expectedContents;
private SnippetMatcher(TemplateFormat templateFormat) {
this.templateFormat = templateFormat;
}
@Override
public boolean matches(Object item) {
if (snippetFileExists(item)) {
if (this.expectedContents != null) {
try {
return this.expectedContents.matches(read((File) item));
}
catch (IOException e) {
return false;
}
}
return true;
}
return false;
}
private boolean snippetFileExists(Object item) {
return item instanceof File && ((File) item).isFile();
}
private String read(File snippetFile) throws IOException {
return FileCopyUtils.copyToString(
new InputStreamReader(new FileInputStream(snippetFile), "UTF-8"));
}
@Override
public void describeMismatch(Object item, Description description) {
if (!snippetFileExists(item)) {
description.appendText("The file " + item + " does not exist");
}
else if (this.expectedContents != null) {
try {
this.expectedContents.describeMismatch(read((File) item),
description);
}
catch (IOException e) {
description
.appendText("The contents of " + item + " cound not be read");
}
}
}
@Override
public void describeTo(Description description) {
if (this.expectedContents != null) {
this.expectedContents.describeTo(description);
}
else {
description
.appendText(this.templateFormat.getFileExtension() + " snippet");
}
}
public SnippetMatcher withContents(Matcher<String> matcher) {
this.expectedContents = matcher;
return this;
}
}
}

View File

@@ -36,12 +36,7 @@ import org.springframework.restdocs.operation.RequestCookie;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.BDDMockito.given;
import static org.mockito.Mockito.mock;
@@ -58,8 +53,8 @@ public class MockMvcRequestConverterTests {
public void httpRequest() throws Exception {
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.get("/foo"));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
@@ -68,26 +63,27 @@ public class MockMvcRequestConverterTests {
.buildRequest(new MockServletContext());
mockRequest.setServerPort(8080);
OperationRequest request = this.factory.convert(mockRequest);
assertThat(request.getUri(), is(URI.create("http://localhost:8080/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
public void requestWithContextPath() throws Exception {
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));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo/bar"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
public void requestWithHeaders() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders
.get("/foo").header("a", "alpha", "apple").header("b", "bravo"));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getHeaders(), hasEntry("a", Arrays.asList("alpha", "apple")));
assertThat(request.getHeaders(), hasEntry("b", Arrays.asList("bravo")));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
assertThat(request.getHeaders()).containsEntry("a",
Arrays.asList("alpha", "apple"));
assertThat(request.getHeaders()).containsEntry("b", Arrays.asList("bravo"));
}
@Test
@@ -96,19 +92,19 @@ public class MockMvcRequestConverterTests {
MockMvcRequestBuilders.get("/foo").cookie(
new javax.servlet.http.Cookie("cookieName1", "cookieVal1"),
new javax.servlet.http.Cookie("cookieName2", "cookieVal2")));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getCookies().size(), is(equalTo(2)));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
assertThat(request.getCookies().size()).isEqualTo(2);
Iterator<RequestCookie> cookieIterator = request.getCookies().iterator();
RequestCookie cookie1 = cookieIterator.next();
assertThat(cookie1.getName(), is(equalTo("cookieName1")));
assertThat(cookie1.getValue(), is(equalTo("cookieVal1")));
assertThat(cookie1.getName()).isEqualTo("cookieName1");
assertThat(cookie1.getValue()).isEqualTo("cookieVal1");
RequestCookie cookie2 = cookieIterator.next();
assertThat(cookie2.getName(), is(equalTo("cookieName2")));
assertThat(cookie2.getValue(), is(equalTo("cookieVal2")));
assertThat(cookie2.getName()).isEqualTo("cookieName2");
assertThat(cookie2.getValue()).isEqualTo("cookieVal2");
}
@Test
@@ -118,8 +114,8 @@ public class MockMvcRequestConverterTests {
mockRequest.setScheme("https");
mockRequest.setServerPort(443);
OperationRequest request = this.factory.convert(mockRequest);
assertThat(request.getUri(), is(URI.create("https://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("https://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
@@ -129,45 +125,45 @@ public class MockMvcRequestConverterTests {
mockRequest.setScheme("https");
mockRequest.setServerPort(8443);
OperationRequest request = this.factory.convert(mockRequest);
assertThat(request.getUri(), is(URI.create("https://localhost:8443/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("https://localhost:8443/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
public void getRequestWithParametersProducesUriWithQueryString() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders
.get("/foo").param("a", "alpha", "apple").param("b", "br&vo"));
assertThat(request.getUri(),
is(URI.create("http://localhost/foo?a=alpha&a=apple&b=br%26vo")));
assertThat(request.getParameters().size(), is(2));
assertThat(request.getParameters(),
hasEntry("a", Arrays.asList("alpha", "apple")));
assertThat(request.getParameters(), hasEntry("b", Arrays.asList("br&vo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&a=apple&b=br%26vo"));
assertThat(request.getParameters().size()).isEqualTo(2);
assertThat(request.getParameters()).containsEntry("a",
Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
public void getRequestWithQueryStringPopulatesParameters() throws Exception {
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));
assertThat(request.getParameters(), hasEntry("a", Arrays.asList("alpha")));
assertThat(request.getParameters(), hasEntry("b", Arrays.asList("bravo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&b=bravo"));
assertThat(request.getParameters().size()).isEqualTo(2);
assertThat(request.getParameters()).containsEntry("a", Arrays.asList("alpha"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("bravo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
public void postRequestWithParameters() throws Exception {
OperationRequest request = createOperationRequest(MockMvcRequestBuilders
.post("/foo").param("a", "alpha", "apple").param("b", "br&vo"));
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParameters().size(), is(2));
assertThat(request.getParameters(),
hasEntry("a", Arrays.asList("alpha", "apple")));
assertThat(request.getParameters(), hasEntry("b", Arrays.asList("br&vo")));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParameters().size()).isEqualTo(2);
assertThat(request.getParameters()).containsEntry("a",
Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
}
@Test
@@ -175,15 +171,15 @@ public class MockMvcRequestConverterTests {
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.multipart("/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));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParts().size()).isEqualTo(1);
OperationRequestPart part = request.getParts().iterator().next();
assertThat(part.getName(), is(equalTo("file")));
assertThat(part.getSubmittedFileName(), is(nullValue()));
assertThat(part.getHeaders().size(), is(1));
assertThat(part.getHeaders().getContentLength(), is(4L));
assertThat(part.getContent(), is(equalTo(new byte[] { 1, 2, 3, 4 })));
assertThat(part.getName()).isEqualTo("file");
assertThat(part.getSubmittedFileName()).isNull();
assertThat(part.getHeaders().size()).isEqualTo(1);
assertThat(part.getHeaders().getContentLength()).isEqualTo(4L);
assertThat(part.getContent()).isEqualTo(new byte[] { 1, 2, 3, 4 });
}
@Test
@@ -191,14 +187,14 @@ public class MockMvcRequestConverterTests {
OperationRequest request = createOperationRequest(
MockMvcRequestBuilders.multipart("/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));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParts().size()).isEqualTo(1);
OperationRequestPart part = request.getParts().iterator().next();
assertThat(part.getName(), is(equalTo("file")));
assertThat(part.getSubmittedFileName(), is(equalTo("original")));
assertThat(part.getHeaders().getContentType(), is(MediaType.IMAGE_PNG));
assertThat(part.getContent(), is(equalTo(new byte[] { 1, 2, 3, 4 })));
assertThat(part.getName()).isEqualTo("file");
assertThat(part.getSubmittedFileName()).isEqualTo("original");
assertThat(part.getHeaders().getContentType()).isEqualTo(MediaType.IMAGE_PNG);
assertThat(part.getContent()).isEqualTo(new byte[] { 1, 2, 3, 4 });
}
@Test
@@ -215,14 +211,14 @@ public class MockMvcRequestConverterTests {
given(mockPart.getSubmittedFileName()).willReturn("submitted.txt");
mockRequest.addPart(mockPart);
OperationRequest request = this.factory.convert(mockRequest);
assertThat(request.getParts().size(), is(1));
assertThat(request.getParts().size()).isEqualTo(1);
OperationRequestPart part = request.getParts().iterator().next();
assertThat(part.getName(), is(equalTo("part-name")));
assertThat(part.getSubmittedFileName(), is(equalTo("submitted.txt")));
assertThat(part.getHeaders().getContentType(), is(nullValue()));
assertThat(part.getHeaders().get("a"), contains("alpha"));
assertThat(part.getHeaders().get("b"), contains("bravo", "banana"));
assertThat(part.getContent(), is(equalTo(new byte[] { 1, 2, 3, 4 })));
assertThat(part.getName()).isEqualTo("part-name");
assertThat(part.getSubmittedFileName()).isEqualTo("submitted.txt");
assertThat(part.getHeaders().getContentType()).isNull();
assertThat(part.getHeaders().get("a")).containsExactly("alpha");
assertThat(part.getHeaders().get("b")).containsExactly("bravo", "banana");
assertThat(part.getContent()).isEqualTo(new byte[] { 1, 2, 3, 4 });
}
@Test
@@ -240,14 +236,14 @@ public class MockMvcRequestConverterTests {
given(mockPart.getContentType()).willReturn("image/png");
mockRequest.addPart(mockPart);
OperationRequest request = this.factory.convert(mockRequest);
assertThat(request.getParts().size(), is(1));
assertThat(request.getParts().size()).isEqualTo(1);
OperationRequestPart part = request.getParts().iterator().next();
assertThat(part.getName(), is(equalTo("part-name")));
assertThat(part.getSubmittedFileName(), is(equalTo("submitted.png")));
assertThat(part.getHeaders().getContentType(), is(MediaType.IMAGE_PNG));
assertThat(part.getHeaders().get("a"), contains("alpha"));
assertThat(part.getHeaders().get("b"), contains("bravo", "banana"));
assertThat(part.getContent(), is(equalTo(new byte[] { 1, 2, 3, 4 })));
assertThat(part.getName()).isEqualTo("part-name");
assertThat(part.getSubmittedFileName()).isEqualTo("submitted.png");
assertThat(part.getHeaders().getContentType()).isEqualTo(MediaType.IMAGE_PNG);
assertThat(part.getHeaders().get("a")).containsExactly("alpha");
assertThat(part.getHeaders().get("b")).containsExactly("bravo", "banana");
assertThat(part.getContent()).isEqualTo(new byte[] { 1, 2, 3, 4 });
}
private OperationRequest createOperationRequest(MockHttpServletRequestBuilder builder)

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,10 +28,7 @@ import org.springframework.http.HttpStatus;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.restdocs.operation.OperationResponse;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link MockMvcResponseConverter}.
@@ -46,29 +43,22 @@ public class MockMvcResponseConverterTests {
public void basicResponse() {
MockHttpServletResponse response = new MockHttpServletResponse();
response.setStatus(HttpServletResponse.SC_OK);
OperationResponse operationResponse = this.factory.convert(response);
assertThat(operationResponse.getStatus(), is(HttpStatus.OK));
assertThat(operationResponse.getStatus()).isEqualTo(HttpStatus.OK);
}
@Test
public void responseWithCookie() {
MockHttpServletResponse response = new MockHttpServletResponse();
response.setStatus(HttpServletResponse.SC_OK);
Cookie cookie = new Cookie("name", "value");
cookie.setDomain("localhost");
cookie.setHttpOnly(true);
response.addCookie(cookie);
OperationResponse operationResponse = this.factory.convert(response);
assertThat(operationResponse.getHeaders().size(), is(1));
assertTrue(operationResponse.getHeaders().containsKey(HttpHeaders.SET_COOKIE));
assertThat(operationResponse.getHeaders().get(HttpHeaders.SET_COOKIE), equalTo(
Collections.singletonList("name=value; Domain=localhost; HttpOnly")));
assertThat(operationResponse.getHeaders()).hasSize(1);
assertThat(operationResponse.getHeaders()).containsEntry(HttpHeaders.SET_COOKIE,
Collections.singletonList("name=value; Domain=localhost; HttpOnly"));
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2016 the original author or authors.
* Copyright 2014-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,10 +28,7 @@ import org.springframework.test.web.servlet.request.RequestPostProcessor;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link MockMvcRestDocumentationConfigurer}.
@@ -51,7 +48,6 @@ public class MockMvcRestDocumentationConfigurerTests {
RequestPostProcessor postProcessor = new MockMvcRestDocumentationConfigurer(
this.restDocumentation).beforeMockMvcCreated(null, null);
postProcessor.postProcessRequest(this.request);
assertUriConfiguration("http", "localhost", 8080);
}
@@ -61,7 +57,6 @@ public class MockMvcRestDocumentationConfigurerTests {
this.restDocumentation).uris().withScheme("https")
.beforeMockMvcCreated(null, null);
postProcessor.postProcessRequest(this.request);
assertUriConfiguration("https", "localhost", 8080);
}
@@ -71,7 +66,6 @@ public class MockMvcRestDocumentationConfigurerTests {
this.restDocumentation).uris().withHost("api.example.com")
.beforeMockMvcCreated(null, null);
postProcessor.postProcessRequest(this.request);
assertUriConfiguration("http", "api.example.com", 8080);
}
@@ -81,7 +75,6 @@ public class MockMvcRestDocumentationConfigurerTests {
this.restDocumentation).uris().withPort(8081).beforeMockMvcCreated(null,
null);
postProcessor.postProcessRequest(this.request);
assertUriConfiguration("http", "localhost", 8081);
}
@@ -91,20 +84,20 @@ public class MockMvcRestDocumentationConfigurerTests {
this.restDocumentation).uris().withPort(8081).beforeMockMvcCreated(null,
null);
postProcessor.postProcessRequest(this.request);
assertThat(this.request.getHeader("Content-Length"), is(nullValue()));
assertThat(this.request.getHeader("Content-Length")).isNull();
}
private void assertUriConfiguration(String scheme, String host, int port) {
assertEquals(scheme, this.request.getScheme());
assertEquals(host, this.request.getServerName());
assertEquals(port, this.request.getServerPort());
assertThat(scheme).isEqualTo(this.request.getScheme());
assertThat(host).isEqualTo(this.request.getServerName());
assertThat(port).isEqualTo(this.request.getServerPort());
RequestContextHolder
.setRequestAttributes(new ServletRequestAttributes(this.request));
try {
URI uri = BasicLinkBuilder.linkToCurrentMapping().toUri();
assertEquals(scheme, uri.getScheme());
assertEquals(host, uri.getHost());
assertEquals(port, uri.getPort());
assertThat(scheme).isEqualTo(uri.getScheme());
assertThat(host).isEqualTo(uri.getHost());
assertThat(port).isEqualTo(uri.getPort());
}
finally {
RequestContextHolder.resetRequestAttributes();

View File

@@ -17,8 +17,12 @@
package org.springframework.restdocs.mockmvc;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@@ -28,6 +32,7 @@ import java.util.regex.Pattern;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.assertj.core.api.Condition;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -43,13 +48,14 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.restdocs.JUnitRestDocumentation;
import org.springframework.restdocs.mockmvc.MockMvcRestDocumentationIntegrationTests.TestConfiguration;
import org.springframework.restdocs.test.SnippetMatchers.HttpRequestMatcher;
import org.springframework.restdocs.test.SnippetConditions.HttpRequestCondition;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.FileSystemUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@@ -57,11 +63,8 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.springframework.restdocs.cli.CliDocumentation.curlRequest;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders;
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel;
@@ -85,14 +88,11 @@ import static org.springframework.restdocs.request.RequestDocumentation.partWith
import static org.springframework.restdocs.request.RequestDocumentation.pathParameters;
import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;
import static org.springframework.restdocs.request.RequestDocumentation.requestParts;
import static org.springframework.restdocs.snippet.Attributes.attributes;
import static org.springframework.restdocs.snippet.Attributes.key;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
import static org.springframework.restdocs.templates.TemplateFormats.markdown;
import static org.springframework.restdocs.test.SnippetMatchers.codeBlock;
import static org.springframework.restdocs.test.SnippetMatchers.httpRequest;
import static org.springframework.restdocs.test.SnippetMatchers.httpResponse;
import static org.springframework.restdocs.test.SnippetMatchers.snippet;
import static org.springframework.restdocs.test.SnippetConditions.codeBlock;
import static org.springframework.restdocs.test.SnippetConditions.httpRequest;
import static org.springframework.restdocs.test.SnippetConditions.httpResponse;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.multipart;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -132,7 +132,6 @@ public class MockMvcRestDocumentationIntegrationTests {
.apply(new MockMvcRestDocumentationConfigurer(this.restDocumentation)
.snippets().withEncoding("UTF-8"))
.build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("basic"));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/basic"),
@@ -145,7 +144,6 @@ public class MockMvcRestDocumentationIntegrationTests {
.apply(new MockMvcRestDocumentationConfigurer(this.restDocumentation)
.snippets().withEncoding("UTF-8").withTemplateFormat(markdown()))
.build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("basic-markdown"));
assertExpectedSnippetFilesExist(
@@ -157,33 +155,29 @@ public class MockMvcRestDocumentationIntegrationTests {
public void curlSnippetWithContent() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(post("/").accept(MediaType.APPLICATION_JSON).content("content"))
.andExpect(status().isOk()).andDo(document("curl-snippet-with-content"));
assertThat(new File(
"build/generated-snippets/curl-snippet-with-content/curl-request.adoc"),
is(snippet(asciidoctor())
.withContents(codeBlock(asciidoctor(), "bash").content(String
"build/generated-snippets/curl-snippet-with-content/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(String
.format("$ curl 'http://localhost:8080/' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -d 'content'")))));
+ " -d 'content'"))));
}
@Test
public void curlSnippetWithCookies() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)
.cookie(new Cookie("cookieName", "cookieVal"))).andExpect(status().isOk())
.andDo(document("curl-snippet-with-cookies"));
assertThat(new File(
"build/generated-snippets/curl-snippet-with-cookies/curl-request.adoc"),
is(snippet(asciidoctor())
.withContents(codeBlock(asciidoctor(), "bash").content(String
"build/generated-snippets/curl-snippet-with-cookies/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(String
.format("$ curl 'http://localhost:8080/' -i -X GET \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " --cookie 'cookieName=cookieVal'")))));
+ " --cookie 'cookieName=cookieVal'"))));
}
@Test
@@ -194,12 +188,12 @@ public class MockMvcRestDocumentationIntegrationTests {
.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(String.format("$ curl "
+ "'http://localhost:8080/?foo=bar' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -d 'a=alpha'")))));
"build/generated-snippets/curl-snippet-with-query-string/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash")
.withContent(String.format("$ curl "
+ "'http://localhost:8080/?foo=bar' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -d 'a=alpha'"))));
}
@Test
@@ -210,44 +204,41 @@ public class MockMvcRestDocumentationIntegrationTests {
.content("some content")).andExpect(status().isOk())
.andDo(document("curl-snippet-with-content-and-parameters"));
assertThat(new File(
"build/generated-snippets/curl-snippet-with-content-and-parameters/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(
codeBlock(asciidoctor(), "bash").content(String.format(
"$ curl 'http://localhost:8080/?a=alpha' -i -X POST \\%n"
"build/generated-snippets/curl-snippet-with-content-and-parameters/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(String
.format("$ curl 'http://localhost:8080/?a=alpha' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -d 'some content'")))));
+ " -d 'some content'"))));
}
@Test
public void httpieSnippetWithContent() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(post("/").accept(MediaType.APPLICATION_JSON).content("content"))
.andExpect(status().isOk())
.andDo(document("httpie-snippet-with-content"));
assertThat(new File(
"build/generated-snippets/httpie-snippet-with-content/httpie-request.adoc"),
is(snippet(asciidoctor()).withContents(codeBlock(asciidoctor(), "bash")
.content(String.format("$ echo 'content' | "
+ "http POST 'http://localhost:8080/' \\%n"
+ " 'Accept:application/json'")))));
"build/generated-snippets/httpie-snippet-with-content/httpie-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash")
.withContent(String.format("$ echo 'content' | "
+ "http POST 'http://localhost:8080/' \\%n"
+ " 'Accept:application/json'"))));
}
@Test
public void httpieSnippetWithCookies() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON)
.cookie(new Cookie("cookieName", "cookieVal"))).andExpect(status().isOk())
.andDo(document("httpie-snippet-with-cookies"));
assertThat(new File(
"build/generated-snippets/httpie-snippet-with-cookies/httpie-request.adoc"),
is(snippet(asciidoctor()).withContents(codeBlock(asciidoctor(), "bash")
.content(String.format("$ http GET 'http://localhost:8080/' \\%n"
+ " 'Accept:application/json' \\%n"
+ " 'Cookie:cookieName=cookieVal'")))));
"build/generated-snippets/httpie-snippet-with-cookies/httpie-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(
String.format("$ http GET 'http://localhost:8080/' \\%n"
+ " 'Accept:application/json' \\%n"
+ " 'Cookie:cookieName=cookieVal'"))));
}
@Test
@@ -258,11 +249,11 @@ public class MockMvcRestDocumentationIntegrationTests {
.accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
.andDo(document("httpie-snippet-with-query-string"));
assertThat(new File(
"build/generated-snippets/httpie-snippet-with-query-string/httpie-request.adoc"),
is(snippet(asciidoctor()).withContents(
codeBlock(asciidoctor(), "bash").content(String.format("$ http "
+ "--form POST 'http://localhost:8080/?foo=bar' \\%n"
+ " 'Accept:application/json' \\%n 'a=alpha'")))));
"build/generated-snippets/httpie-snippet-with-query-string/httpie-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash")
.withContent(String.format("$ http "
+ "--form POST 'http://localhost:8080/?foo=bar' \\%n"
+ " 'Accept:application/json' \\%n 'a=alpha'"))));
}
@Test
@@ -273,18 +264,17 @@ public class MockMvcRestDocumentationIntegrationTests {
.accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk())
.andDo(document("httpie-snippet-post-with-content-and-parameters"));
assertThat(new File(
"build/generated-snippets/httpie-snippet-post-with-content-and-parameters/httpie-request.adoc"),
is(snippet(asciidoctor()).withContents(codeBlock(asciidoctor(), "bash")
.content(String.format("$ echo " + "'some content' | http POST "
+ "'http://localhost:8080/?a=alpha' \\%n"
+ " 'Accept:application/json'")))));
"build/generated-snippets/httpie-snippet-post-with-content-and-parameters/httpie-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(
String.format("$ echo " + "'some content' | http POST "
+ "'http://localhost:8080/?a=alpha' \\%n"
+ " 'Accept:application/json'"))));
}
@Test
public void linksSnippet() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("links",
links(linkWithRel("rel").description("The description"))));
@@ -298,11 +288,9 @@ public class MockMvcRestDocumentationIntegrationTests {
public void pathParametersSnippet() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.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"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
"path-parameters.adoc");
@@ -312,11 +300,9 @@ public class MockMvcRestDocumentationIntegrationTests {
public void requestParametersSnippet() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.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"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
"request-parameters.adoc");
@@ -326,12 +312,10 @@ public class MockMvcRestDocumentationIntegrationTests {
public void requestFieldsSnippet() throws Exception {
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"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
"request-fields.adoc");
@@ -341,11 +325,9 @@ public class MockMvcRestDocumentationIntegrationTests {
public void requestPartsSnippet() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(multipart("/upload").file("foo", "bar".getBytes()))
.andExpect(status().isOk()).andDo(document("request-parts", requestParts(
partWithName("foo").description("The description"))));
assertExpectedSnippetFilesExist(
new File("build/generated-snippets/request-parts"), "http-request.adoc",
"http-response.adoc", "curl-request.adoc", "request-parts.adoc");
@@ -355,14 +337,12 @@ public class MockMvcRestDocumentationIntegrationTests {
public void responseFieldsSnippet() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/").param("foo", "bar").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("links",
responseFields(fieldWithPath("a").description("The description"),
subsectionWithPath("links")
.description("Links to other resources"))));
assertExpectedSnippetFilesExist(new File("build/generated-snippets/links"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc",
"response-fields.adoc");
@@ -372,24 +352,20 @@ public class MockMvcRestDocumentationIntegrationTests {
public void responseWithSetCookie() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/set-cookie")).andExpect(status().isOk())
.andDo(document("set-cookie",
responseHeaders(headerWithName(HttpHeaders.SET_COOKIE)
.description("set-cookie"))));
assertThat(new File("build/generated-snippets/set-cookie/http-response.adoc"),
is(snippet(asciidoctor())
.withContents(httpResponse(asciidoctor(), HttpStatus.OK).header(
HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly"))));
assertThat(new File("build/generated-snippets/set-cookie/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK).header(
HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly")));
}
@Test
public void parameterizedOutputDirectory() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(document("{method-name}"));
assertExpectedSnippetFilesExist(
@@ -402,13 +378,11 @@ public class MockMvcRestDocumentationIntegrationTests {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation))
.alwaysDo(document("{method-name}-{step}")).build();
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());
assertExpectedSnippetFilesExist(
@@ -428,11 +402,9 @@ public class MockMvcRestDocumentationIntegrationTests {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation))
.alwaysDo(documentation).build();
mockMvc.perform(get("/").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk()).andDo(documentation.document(
responseHeaders(headerWithName("a").description("one"))));
assertExpectedSnippetFilesExist(
new File(
"build/generated-snippets/always-do-with-additional-snippets-1/"),
@@ -444,9 +416,7 @@ public class MockMvcRestDocumentationIntegrationTests {
public void preprocessedRequest() throws Exception {
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(this.context)
.apply(documentationConfiguration(this.restDocumentation)).build();
Pattern pattern = Pattern.compile("(\"alpha\")");
MvcResult result = mockMvc
.perform(get("/").header("a", "alpha").header("b", "bravo")
.contentType(MediaType.APPLICATION_JSON)
@@ -458,18 +428,17 @@ public class MockMvcRestDocumentationIntegrationTests {
HttpHeaders.CONTENT_LENGTH),
replacePattern(pattern, "\"<<beta>>\""))))
.andReturn();
HttpRequestMatcher originalRequest = httpRequest(asciidoctor(), RequestMethod.GET,
"/");
HttpRequestCondition originalRequest = httpRequest(asciidoctor(),
RequestMethod.GET, "/");
for (String headerName : iterable(result.getRequest().getHeaderNames())) {
originalRequest.header(headerName, result.getRequest().getHeader(headerName));
}
assertThat(
new File("build/generated-snippets/original-request/http-request.adoc"),
is(snippet(asciidoctor()).withContents(originalRequest
.header("Host", "localhost:8080").header("Content-Length", "13")
.content("{\"a\":\"alpha\"}"))));
HttpRequestMatcher preprocessedRequest = httpRequest(asciidoctor(),
new File("build/generated-snippets/original-request/http-request.adoc"))
.has(content(originalRequest.header("Host", "localhost:8080")
.header("Content-Length", "13")
.content("{\"a\":\"alpha\"}")));
HttpRequestCondition preprocessedRequest = httpRequest(asciidoctor(),
RequestMethod.GET, "/");
List<String> removedHeaders = Arrays.asList("a", HttpHeaders.HOST,
HttpHeaders.CONTENT_LENGTH);
@@ -481,9 +450,8 @@ public class MockMvcRestDocumentationIntegrationTests {
}
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\"%n}");
assertThat(new File(
"build/generated-snippets/preprocessed-request/http-request.adoc"),
is(snippet(asciidoctor())
.withContents(preprocessedRequest.content(prettyPrinted))));
"build/generated-snippets/preprocessed-request/http-request.adoc"))
.has(content(preprocessedRequest.content(prettyPrinted)));
}
@Test
@@ -503,7 +471,7 @@ public class MockMvcRestDocumentationIntegrationTests {
.accept(MediaType.APPLICATION_JSON).content("{\"a\":\"alpha\"}"))
.andDo(document("default-preprocessed-request")).andReturn();
HttpRequestMatcher preprocessedRequest = httpRequest(asciidoctor(),
HttpRequestCondition preprocessedRequest = httpRequest(asciidoctor(),
RequestMethod.GET, "/");
List<String> removedHeaders = Arrays.asList("a", HttpHeaders.HOST,
HttpHeaders.CONTENT_LENGTH);
@@ -515,9 +483,8 @@ public class MockMvcRestDocumentationIntegrationTests {
}
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\"%n}");
assertThat(new File(
"build/generated-snippets/default-preprocessed-request/http-request.adoc"),
is(snippet(asciidoctor())
.withContents(preprocessedRequest.content(prettyPrinted))));
"build/generated-snippets/default-preprocessed-request/http-request.adoc"))
.has(content(preprocessedRequest.content(prettyPrinted)));
}
@Test
@@ -536,23 +503,22 @@ public class MockMvcRestDocumentationIntegrationTests {
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")
new File("build/generated-snippets/original-response/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK)
.header("a", "alpha")
.header("Content-Type", "application/json;charset=UTF-8")
.header(HttpHeaders.CONTENT_LENGTH,
original.getBytes().length)
.content(original))));
.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)
"build/generated-snippets/preprocessed-response/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK)
.header("Content-Type", "application/json;charset=UTF-8")
.header(HttpHeaders.CONTENT_LENGTH,
prettyPrinted.getBytes().length)
.content(prettyPrinted))));
.content(prettyPrinted)));
}
@Test
@@ -572,20 +538,18 @@ public class MockMvcRestDocumentationIntegrationTests {
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\",%n \"links\" : "
+ "[ {%n \"rel\" : \"rel\",%n \"href\" : \"...\"%n } ]%n}");
assertThat(new File(
"build/generated-snippets/default-preprocessed-response/http-response.adoc"),
is(snippet(asciidoctor())
.withContents(httpResponse(asciidoctor(), HttpStatus.OK)
"build/generated-snippets/default-preprocessed-response/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK)
.header("Content-Type", "application/json;charset=UTF-8")
.header(HttpHeaders.CONTENT_LENGTH,
prettyPrinted.getBytes().length)
.content(prettyPrinted))));
.content(prettyPrinted)));
}
@Test
public void customSnippetTemplate() throws Exception {
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() },
getClass().getClassLoader());
@@ -600,11 +564,8 @@ public class MockMvcRestDocumentationIntegrationTests {
Thread.currentThread().setContextClassLoader(previous);
}
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")))));
"build/generated-snippets/custom-snippet-template/curl-request.adoc"))
.hasContent("Custom curl request");
}
@Test
@@ -615,13 +576,11 @@ public class MockMvcRestDocumentationIntegrationTests {
mockMvc.perform(
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"),
is(snippet(asciidoctor()).withContents(
codeBlock(asciidoctor(), "bash").content(String.format(
"$ curl 'http://localhost:8080/custom/' -i -X GET \\%n"
+ " -H 'Accept: application/json'")))));
assertThat(new File(
"build/generated-snippets/custom-context-path/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(String
.format("$ curl 'http://localhost:8080/custom/' -i -X GET \\%n"
+ " -H 'Accept: application/json'"))));
}
@Test
@@ -635,10 +594,29 @@ public class MockMvcRestDocumentationIntegrationTests {
private void assertExpectedSnippetFilesExist(File directory, String... snippets) {
for (String snippet : snippets) {
assertTrue(new File(directory, snippet).isFile());
assertThat(new File(directory, snippet)).isFile();
}
}
private Condition<File> content(final Condition<String> delegate) {
return new Condition<File>() {
@Override
public boolean matches(File value) {
try {
return delegate
.matches(FileCopyUtils.copyToString(new InputStreamReader(
new FileInputStream(value), StandardCharsets.UTF_8)));
}
catch (IOException ex) {
fail("Failed to read '" + value + "'", ex);
return false;
}
}
};
}
/**
* Test configuration that enables Spring MVC.
*/

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2018 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -28,9 +28,7 @@ import org.springframework.mock.web.MockServletContext;
import org.springframework.restdocs.generate.RestDocumentationGenerator;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.delete;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.fileUpload;
import static org.springframework.restdocs.mockmvc.RestDocumentationRequestBuilders.get;
@@ -144,18 +142,17 @@ public class RestDocumentationRequestBuildersTests {
private void assertTemplate(MockHttpServletRequestBuilder builder,
HttpMethod httpMethod) {
MockHttpServletRequest request = builder.buildRequest(this.servletContext);
assertThat(
(String) request.getAttribute(
RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE),
is(equalTo("{template}")));
assertThat(request.getRequestURI(), is(equalTo("t")));
assertThat(request.getMethod(), is(equalTo(httpMethod.name())));
assertThat((String) request
.getAttribute(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE))
.isEqualTo("{template}");
assertThat(request.getRequestURI()).isEqualTo("t");
assertThat(request.getMethod()).isEqualTo(httpMethod.name());
}
private void assertUri(MockHttpServletRequestBuilder builder, HttpMethod httpMethod) {
MockHttpServletRequest request = builder.buildRequest(this.servletContext);
assertThat(request.getRequestURI(), is(equalTo("/uri")));
assertThat(request.getMethod(), is(equalTo(httpMethod.name())));
assertThat(request.getRequestURI()).isEqualTo("/uri");
assertThat(request.getMethod()).isEqualTo(httpMethod.name());
}
}

View File

@@ -5,8 +5,9 @@ dependencies {
compile 'io.rest-assured:rest-assured'
testCompile 'org.apache.tomcat.embed:tomcat-embed-core:8.5.13'
testCompile 'org.mockito:mockito-core'
testCompile 'org.assertj:assertj-core'
testCompile 'org.hamcrest:hamcrest-library'
testCompile 'org.mockito:mockito-core'
testCompile project(path: ':spring-restdocs-core', configuration: 'testArtifacts')
}

View File

@@ -23,6 +23,7 @@ import java.io.FileNotFoundException;
import java.net.URI;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import io.restassured.RestAssured;
@@ -33,15 +34,14 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.restdocs.operation.OperationRequest;
import org.springframework.restdocs.operation.OperationRequestPart;
import org.springframework.restdocs.operation.RequestCookie;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link RestAssuredRequestConverter}.
@@ -64,8 +64,8 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/foo/bar");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getUri(), is(equalTo(
URI.create("http://localhost:" + tomcat.getPort() + "/foo/bar"))));
assertThat(request.getUri()).isEqualTo(
URI.create("http://localhost:" + tomcat.getPort() + "/foo/bar"));
}
@Test
@@ -74,7 +74,7 @@ public class RestAssuredRequestConverterTests {
requestSpec.head("/foo/bar");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getMethod(), is(equalTo(HttpMethod.HEAD)));
assertThat(request.getMethod()).isEqualTo(HttpMethod.HEAD);
}
@Test
@@ -84,8 +84,9 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParameters().size(), is(1));
assertThat(request.getParameters().get("foo"), is(equalTo(Arrays.asList("bar"))));
assertThat(request.getParameters()).hasSize(1);
assertThat(request.getParameters()).containsEntry("foo",
Collections.singletonList("bar"));
}
@Test
@@ -94,9 +95,9 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/?foo=bar&foo=qix");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParameters().size(), is(1));
assertThat(request.getParameters().get("foo"),
is(equalTo(Arrays.asList("bar", "qix"))));
assertThat(request.getParameters()).hasSize(1);
assertThat(request.getParameters()).containsEntry("foo",
Arrays.asList("bar", "qix"));
}
@Test
@@ -106,8 +107,9 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParameters().size(), is(1));
assertThat(request.getParameters().get("foo"), is(equalTo(Arrays.asList("bar"))));
assertThat(request.getParameters()).hasSize(1);
assertThat(request.getParameters()).containsEntry("foo",
Collections.singletonList("bar"));
}
@Test
@@ -117,8 +119,9 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParameters().size(), is(1));
assertThat(request.getParameters().get("foo"), is(equalTo(Arrays.asList("bar"))));
assertThat(request.getParameters()).hasSize(1);
assertThat(request.getParameters()).containsEntry("foo",
Collections.singletonList("bar"));
}
@Test
@@ -128,10 +131,11 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getHeaders().toString(), request.getHeaders().size(), is(2));
assertThat(request.getHeaders().get("Foo"), is(equalTo(Arrays.asList("bar"))));
assertThat(request.getHeaders().get("Host"),
is(equalTo(Arrays.asList("localhost:" + tomcat.getPort()))));
assertThat(request.getHeaders()).hasSize(2);
assertThat(request.getHeaders()).containsEntry("Foo",
Collections.singletonList("bar"));
assertThat(request.getHeaders()).containsEntry("Host",
Collections.singletonList("localhost:" + tomcat.getPort()));
}
@Test
@@ -141,12 +145,13 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getHeaders().toString(), request.getHeaders().size(), is(3));
assertThat(request.getHeaders().get("Foo"), is(equalTo(Arrays.asList("bar"))));
assertThat(request.getHeaders().get("Accept"),
is(equalTo(Arrays.asList("application/json"))));
assertThat(request.getHeaders().get("Host"),
is(equalTo(Arrays.asList("localhost:" + tomcat.getPort()))));
assertThat(request.getHeaders()).hasSize(3);
assertThat(request.getHeaders()).containsEntry("Foo",
Collections.singletonList("bar"));
assertThat(request.getHeaders()).containsEntry("Accept",
Collections.singletonList("application/json"));
assertThat(request.getHeaders()).containsEntry("Host",
Collections.singletonList("localhost:" + tomcat.getPort()));
}
@Test
@@ -156,17 +161,17 @@ public class RestAssuredRequestConverterTests {
requestSpec.get("/");
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getCookies().size(), is(equalTo(2)));
assertThat(request.getCookies().size()).isEqualTo(2);
Iterator<RequestCookie> cookieIterator = request.getCookies().iterator();
RequestCookie cookie1 = cookieIterator.next();
assertThat(cookie1.getName(), is(equalTo("cookie1")));
assertThat(cookie1.getValue(), is(equalTo("cookieVal1")));
assertThat(cookie1.getName()).isEqualTo("cookie1");
assertThat(cookie1.getValue()).isEqualTo("cookieVal1");
RequestCookie cookie2 = cookieIterator.next();
assertThat(cookie2.getName(), is(equalTo("cookie2")));
assertThat(cookie2.getValue(), is(equalTo("cookieVal2")));
assertThat(cookie2.getName()).isEqualTo("cookie2");
assertThat(cookie2.getValue()).isEqualTo("cookieVal2");
}
@Test
@@ -178,19 +183,15 @@ public class RestAssuredRequestConverterTests {
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
Collection<OperationRequestPart> parts = request.getParts();
assertThat(parts.size(), is(2));
Iterator<OperationRequestPart> iterator = parts.iterator();
OperationRequestPart part = iterator.next();
assertThat(part.getName(), is(equalTo("a")));
assertThat(part.getSubmittedFileName(), is(equalTo("a.txt")));
assertThat(part.getContentAsString(), is(equalTo("alpha")));
assertThat(part.getHeaders().getContentType(), is(equalTo(MediaType.TEXT_PLAIN)));
part = iterator.next();
assertThat(part.getName(), is(equalTo("b")));
assertThat(part.getSubmittedFileName(), is(equalTo("file")));
assertThat(part.getContentAsString(), is(equalTo("{\"foo\":\"bar\"}")));
assertThat(part.getHeaders().getContentType(),
is(equalTo(MediaType.APPLICATION_JSON)));
assertThat(parts).hasSize(2);
assertThat(parts).extracting("name").containsExactly("a", "b");
assertThat(parts).extracting("submittedFileName").containsExactly("a.txt",
"file");
assertThat(parts).extracting("contentAsString").containsExactly("alpha",
"{\"foo\":\"bar\"}");
assertThat(parts).extracting("headers").extracting(HttpHeaders.CONTENT_TYPE)
.containsExactly(Collections.singletonList(MediaType.TEXT_PLAIN_VALUE),
Collections.singletonList(MediaType.APPLICATION_JSON_VALUE));
}
@Test
@@ -208,7 +209,7 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getContentAsString(), is(equalTo("body")));
assertThat(request.getContentAsString()).isEqualTo("body");
}
@Test
@@ -218,7 +219,7 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getContentAsString(), is(equalTo("{\"foo\":\"bar\"}")));
assertThat(request.getContentAsString()).isEqualTo("{\"foo\":\"bar\"}");
}
@Test
@@ -229,7 +230,7 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getContent(), is(equalTo(new byte[] { 1, 2, 3, 4 })));
assertThat(request.getContent()).isEqualTo(new byte[] { 1, 2, 3, 4 });
}
@Test
@@ -239,7 +240,7 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getContentAsString(), is(equalTo("file")));
assertThat(request.getContentAsString()).isEqualTo("file");
}
@Test
@@ -261,8 +262,8 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParts().iterator().next().getContentAsString(),
is(equalTo("foo")));
assertThat(request.getParts().iterator().next().getContentAsString())
.isEqualTo("foo");
}
@Test
@@ -272,8 +273,8 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParts().iterator().next().getContentAsString(),
is(equalTo("foo")));
assertThat(request.getParts().iterator().next().getContentAsString())
.isEqualTo("foo");
}
@Test
@@ -283,8 +284,8 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParts().iterator().next().getContentAsString(),
is(equalTo("foo")));
assertThat(request.getParts().iterator().next().getContentAsString())
.isEqualTo("foo");
}
@Test
@@ -294,8 +295,8 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParts().iterator().next().getContentAsString(),
is(equalTo("file")));
assertThat(request.getParts().iterator().next().getContentAsString())
.isEqualTo("file");
}
@Test
@@ -317,8 +318,8 @@ public class RestAssuredRequestConverterTests {
requestSpec.post();
OperationRequest request = this.factory
.convert((FilterableRequestSpecification) requestSpec);
assertThat(request.getParts().iterator().next().getContentAsString(),
is(equalTo("{\"foo\":\"bar\"}")));
assertThat(request.getParts().iterator().next().getContentAsString())
.isEqualTo("{\"foo\":\"bar\"}");
}
/**

View File

@@ -34,10 +34,7 @@ import org.springframework.restdocs.operation.preprocess.Preprocessors;
import org.springframework.restdocs.snippet.WriterResolver;
import org.springframework.restdocs.templates.TemplateEngine;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -83,20 +80,19 @@ public class RestAssuredRestDocumentationConfigurerTests {
configurationCaptor.capture());
@SuppressWarnings("unchecked")
Map<String, Object> configuration = configurationCaptor.getValue();
assertThat(configuration, hasEntry(equalTo(TemplateEngine.class.getName()),
instanceOf(TemplateEngine.class)));
assertThat(configuration, hasEntry(equalTo(WriterResolver.class.getName()),
instanceOf(WriterResolver.class)));
assertThat(configuration,
hasEntry(equalTo(
RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS),
instanceOf(List.class)));
assertThat(configuration, hasEntry(equalTo(
RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR),
instanceOf(OperationRequestPreprocessor.class)));
assertThat(configuration, hasEntry(equalTo(
RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR),
instanceOf(OperationResponsePreprocessor.class)));
assertThat(configuration.get(TemplateEngine.class.getName()))
.isInstanceOf(TemplateEngine.class);
assertThat(configuration.get(WriterResolver.class.getName()))
.isInstanceOf(WriterResolver.class);
assertThat(configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_SNIPPETS))
.isInstanceOf(List.class);
assertThat(configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_REQUEST_PREPROCESSOR))
.isInstanceOf(OperationRequestPreprocessor.class);
assertThat(configuration
.get(RestDocumentationGenerator.ATTRIBUTE_NAME_DEFAULT_OPERATION_RESPONSE_PREPROCESSOR))
.isInstanceOf(OperationResponsePreprocessor.class);
}
}

View File

@@ -17,12 +17,17 @@
package org.springframework.restdocs.restassured3;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLClassLoader;
import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
import io.restassured.builder.RequestSpecBuilder;
import io.restassured.specification.RequestSpecification;
import org.assertj.core.api.Condition;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
@@ -31,13 +36,12 @@ import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.restdocs.JUnitRestDocumentation;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMethod;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.springframework.restdocs.headers.HeaderDocumentation.headerWithName;
import static org.springframework.restdocs.headers.HeaderDocumentation.responseHeaders;
import static org.springframework.restdocs.hypermedia.HypermediaDocumentation.linkWithRel;
@@ -61,10 +65,9 @@ import static org.springframework.restdocs.request.RequestDocumentation.requestP
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document;
import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.documentationConfiguration;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
import static org.springframework.restdocs.test.SnippetMatchers.codeBlock;
import static org.springframework.restdocs.test.SnippetMatchers.httpRequest;
import static org.springframework.restdocs.test.SnippetMatchers.httpResponse;
import static org.springframework.restdocs.test.SnippetMatchers.snippet;
import static org.springframework.restdocs.test.SnippetConditions.codeBlock;
import static org.springframework.restdocs.test.SnippetConditions.httpRequest;
import static org.springframework.restdocs.test.SnippetConditions.httpResponse;
/**
* Integration tests for using Spring REST Docs with REST Assured.
@@ -100,13 +103,13 @@ public class RestAssuredRestDocumentationIntegrationTests {
.statusCode(200);
assertThat(new File(
"build/generated-snippets/curl-snippet-with-content/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(codeBlock(asciidoctor(), "bash")
.content(String.format("$ curl 'http://localhost:"
+ tomcat.getPort() + "/' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -H 'Content-Type: " + contentType + "' \\%n"
+ " -d 'content'")))));
"build/generated-snippets/curl-snippet-with-content/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash")
.withContent(String.format("$ curl 'http://localhost:"
+ tomcat.getPort() + "/' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -H 'Content-Type: " + contentType
+ "' \\%n" + " -d 'content'"))));
}
@Test
@@ -118,13 +121,14 @@ public class RestAssuredRestDocumentationIntegrationTests {
.contentType(contentType).cookie("cookieName", "cookieVal").get("/")
.then().statusCode(200);
assertThat(new File(
"build/generated-snippets/curl-snippet-with-cookies/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(codeBlock(asciidoctor(), "bash")
.content(String.format("$ curl 'http://localhost:"
+ tomcat.getPort() + "/' -i -X GET \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -H 'Content-Type: " + contentType + "' \\%n"
+ " --cookie 'cookieName=cookieVal'")))));
"build/generated-snippets/curl-snippet-with-cookies/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash")
.withContent(String.format("$ curl 'http://localhost:"
+ tomcat.getPort() + "/' -i -X GET \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -H 'Content-Type: " + contentType
+ "' \\%n"
+ " --cookie 'cookieName=cookieVal'"))));
}
@Test
@@ -136,13 +140,13 @@ public class RestAssuredRestDocumentationIntegrationTests {
.post("/?foo=bar").then().statusCode(200);
String contentType = "application/x-www-form-urlencoded; charset=ISO-8859-1";
assertThat(new File(
"build/generated-snippets/curl-snippet-with-query-string/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(codeBlock(asciidoctor(), "bash")
.content(String.format("$ curl " + "'http://localhost:"
+ tomcat.getPort() + "/?foo=bar' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -H 'Content-Type: " + contentType + "' \\%n"
+ " -d 'a=alpha'")))));
"build/generated-snippets/curl-snippet-with-query-string/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(
String.format("$ curl " + "'http://localhost:"
+ tomcat.getPort() + "/?foo=bar' -i -X POST \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " -H 'Content-Type: " + contentType
+ "' \\%n" + " -d 'a=alpha'"))));
}
@Test
@@ -219,7 +223,6 @@ public class RestAssuredRestDocumentationIntegrationTests {
subsectionWithPath("links")
.description("Links to other resources"))))
.accept("application/json").get("/").then().statusCode(200);
assertExpectedSnippetFilesExist(
new File("build/generated-snippets/response-fields"), "http-request.adoc",
"http-response.adoc", "curl-request.adoc", "response-fields.adoc");
@@ -281,12 +284,10 @@ public class RestAssuredRestDocumentationIntegrationTests {
.get("/set-cookie").then().statusCode(200);
assertExpectedSnippetFilesExist(new File("build/generated-snippets/set-cookie"),
"http-request.adoc", "http-response.adoc", "curl-request.adoc");
assertThat(new File("build/generated-snippets/set-cookie/http-response.adoc"),
is(snippet(asciidoctor())
.withContents(httpResponse(asciidoctor(), HttpStatus.OK).header(
HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly"))));
assertThat(new File("build/generated-snippets/set-cookie/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK).header(
HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly")));
}
@Test
@@ -304,24 +305,22 @@ public class RestAssuredRestDocumentationIntegrationTests {
removeHeaders("a", HttpHeaders.CONTENT_LENGTH))))
.get("/").then().statusCode(200);
assertThat(
new File("build/generated-snippets/original-request/http-request.adoc"),
is(snippet(asciidoctor())
.withContents(httpRequest(asciidoctor(), RequestMethod.GET, "/")
new File("build/generated-snippets/original-request/http-request.adoc"))
.has(content(httpRequest(asciidoctor(), RequestMethod.GET, "/")
.header("a", "alpha").header("b", "bravo")
.header("Accept", MediaType.APPLICATION_JSON_VALUE)
.header("Content-Type", "application/json; charset=UTF-8")
.header("Host", "localhost:" + tomcat.getPort())
.header("Content-Length", "13")
.content("{\"a\":\"alpha\"}"))));
.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, "/")
"build/generated-snippets/preprocessed-request/http-request.adoc"))
.has(content(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))));
.header("Host", "localhost").content(prettyPrinted)));
}
@Test
@@ -339,13 +338,12 @@ public class RestAssuredRestDocumentationIntegrationTests {
.statusCode(200);
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\"%n}");
assertThat(new File(
"build/generated-snippets/default-preprocessed-request/http-request.adoc"),
is(snippet(asciidoctor())
.withContents(httpRequest(asciidoctor(), RequestMethod.GET, "/")
"build/generated-snippets/default-preprocessed-request/http-request.adoc"))
.has(content(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))));
.header("Host", "localhost").content(prettyPrinted)));
}
@Test
@@ -363,14 +361,13 @@ public class RestAssuredRestDocumentationIntegrationTests {
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)
"build/generated-snippets/preprocessed-response/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK)
.header("Foo", "https://api.example.com/foo/bar")
.header("Content-Type", "application/json;charset=UTF-8")
.header(HttpHeaders.CONTENT_LENGTH,
prettyPrinted.getBytes().length)
.content(prettyPrinted))));
.content(prettyPrinted)));
}
@Test
@@ -389,14 +386,13 @@ public class RestAssuredRestDocumentationIntegrationTests {
String prettyPrinted = String.format("{%n \"a\" : \"<<beta>>\",%n \"links\" : "
+ "[ {%n \"rel\" : \"rel\",%n \"href\" : \"...\"%n } ]%n}");
assertThat(new File(
"build/generated-snippets/default-preprocessed-response/http-response.adoc"),
is(snippet(asciidoctor())
.withContents(httpResponse(asciidoctor(), HttpStatus.OK)
"build/generated-snippets/default-preprocessed-response/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK)
.header("Foo", "https://api.example.com/foo/bar")
.header("Content-Type", "application/json;charset=UTF-8")
.header(HttpHeaders.CONTENT_LENGTH,
prettyPrinted.getBytes().length)
.content(prettyPrinted))));
.content(prettyPrinted)));
}
@Test
@@ -416,15 +412,33 @@ public class RestAssuredRestDocumentationIntegrationTests {
Thread.currentThread().setContextClassLoader(previous);
}
assertThat(new File(
"build/generated-snippets/custom-snippet-template/curl-request.adoc"),
is(snippet(asciidoctor()).withContents(equalTo("Custom curl request"))));
"build/generated-snippets/custom-snippet-template/curl-request.adoc"))
.hasContent("Custom curl request");
}
private void assertExpectedSnippetFilesExist(File directory, String... snippets) {
for (String snippet : snippets) {
File snippetFile = new File(directory, snippet);
assertTrue("Snippet " + snippetFile + " not found", snippetFile.isFile());
assertThat(new File(directory, snippet)).isFile();
}
}
private Condition<File> content(final Condition<String> delegate) {
return new Condition<File>() {
@Override
public boolean matches(File value) {
try {
return delegate
.matches(FileCopyUtils.copyToString(new InputStreamReader(
new FileInputStream(value), StandardCharsets.UTF_8)));
}
catch (IOException ex) {
fail("Failed to read '" + value + "'", ex);
return false;
}
}
};
}
}

View File

@@ -35,9 +35,7 @@ import org.springframework.restdocs.operation.OperationResponseFactory;
import org.springframework.restdocs.operation.Parameters;
import org.springframework.restdocs.operation.RequestCookie;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link UriModifyingOperationPreprocessor}.
@@ -58,8 +56,7 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.scheme("https");
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://localhost:12345"));
assertThat(processed.getUri(),
is(equalTo(URI.create("https://localhost:12345"))));
assertThat(processed.getUri()).isEqualTo(URI.create("https://localhost:12345"));
}
@Test
@@ -67,10 +64,10 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.host("api.example.com");
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.foo.com:12345"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com:12345"))));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
is(equalTo("api.example.com:12345")));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com:12345"));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST))
.isEqualTo("api.example.com:12345");
}
@Test
@@ -78,10 +75,10 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.port(23456);
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com:23456"))));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
is(equalTo("api.example.com:23456")));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com:23456"));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST))
.isEqualTo("api.example.com:23456");
}
@Test
@@ -89,9 +86,9 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345"));
assertThat(processed.getUri(), is(equalTo(URI.create("http://api.example.com"))));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST),
is(equalTo("api.example.com")));
assertThat(processed.getUri()).isEqualTo(URI.create("http://api.example.com"));
assertThat(processed.getHeaders().getFirst(HttpHeaders.HOST))
.isEqualTo("api.example.com");
}
@Test
@@ -99,8 +96,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345/foo/bar"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com/foo/bar"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com/foo/bar"));
}
@Test
@@ -108,8 +105,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345?foo=bar"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com?foo=bar"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com?foo=bar"));
}
@Test
@@ -117,8 +114,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.removePort();
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://api.example.com:12345#foo"));
assertThat(processed.getUri(),
is(equalTo(URI.create("http://api.example.com#foo"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("http://api.example.com#foo"));
}
@Test
@@ -127,8 +124,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'https://localhost:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'https://localhost:12345' should be used");
}
@Test
@@ -137,8 +134,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://api.example.com:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://api.example.com:12345' should be used");
}
@Test
@@ -147,8 +144,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost:23456' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost:23456' should be used");
}
@Test
@@ -157,8 +154,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost' should be used");
}
@Test
@@ -167,8 +164,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"Use 'http://localhost:12345' or 'https://localhost:23456' to access the service"));
assertThat(new String(processed.getContent()), is(equalTo(
"Use 'http://localhost' or 'https://localhost' to access the service")));
assertThat(new String(processed.getContent())).isEqualTo(
"Use 'http://localhost' or 'https://localhost' to access the service");
}
@Test
@@ -177,8 +174,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345/foo/bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost/foo/bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost/foo/bar' should be used");
}
@Test
@@ -187,8 +184,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345?foo=bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost?foo=bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost?foo=bar' should be used");
}
@Test
@@ -197,8 +194,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithContent(
"The uri 'http://localhost:12345#foo' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost#foo' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost#foo' should be used");
}
@Test
@@ -207,8 +204,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'https://localhost:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'https://localhost:12345' should be used");
}
@Test
@@ -217,8 +214,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://api.example.com:12345' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://api.example.com:12345' should be used");
}
@Test
@@ -227,8 +224,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost:23456' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost:23456' should be used");
}
@Test
@@ -237,8 +234,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost' should be used");
}
@Test
@@ -247,8 +244,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"Use 'http://localhost:12345' or 'https://localhost:23456' to access the service"));
assertThat(new String(processed.getContent()), is(equalTo(
"Use 'http://localhost' or 'https://localhost' to access the service")));
assertThat(new String(processed.getContent())).isEqualTo(
"Use 'http://localhost' or 'https://localhost' to access the service");
}
@Test
@@ -257,8 +254,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345/foo/bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost/foo/bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost/foo/bar' should be used");
}
@Test
@@ -267,8 +264,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345?foo=bar' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost?foo=bar' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost?foo=bar' should be used");
}
@Test
@@ -277,34 +274,33 @@ public class UriModifyingOperationPreprocessorTests {
OperationResponse processed = this.preprocessor
.preprocess(createResponseWithContent(
"The uri 'http://localhost:12345#foo' should be used"));
assertThat(new String(processed.getContent()),
is(equalTo("The uri 'http://localhost#foo' should be used")));
assertThat(new String(processed.getContent()))
.isEqualTo("The uri 'http://localhost#foo' should be used");
}
@Test
public void urisInRequestHeadersCanBeModified() {
OperationRequest processed = this.preprocessor.host("api.example.com")
.preprocess(createRequestWithHeader("Foo", "http://locahost:12345"));
assertThat(processed.getHeaders().getFirst("Foo"),
is(equalTo("http://api.example.com:12345")));
assertThat(processed.getHeaders().getFirst("Host"),
is(equalTo("api.example.com")));
assertThat(processed.getHeaders().getFirst("Foo"))
.isEqualTo("http://api.example.com:12345");
assertThat(processed.getHeaders().getFirst("Host")).isEqualTo("api.example.com");
}
@Test
public void urisInResponseHeadersCanBeModified() {
OperationResponse processed = this.preprocessor.host("api.example.com")
.preprocess(createResponseWithHeader("Foo", "http://locahost:12345"));
assertThat(processed.getHeaders().getFirst("Foo"),
is(equalTo("http://api.example.com:12345")));
assertThat(processed.getHeaders().getFirst("Foo"))
.isEqualTo("http://api.example.com:12345");
}
@Test
public void urisInRequestPartHeadersCanBeModified() {
OperationRequest processed = this.preprocessor.host("api.example.com").preprocess(
createRequestWithPartWithHeader("Foo", "http://locahost:12345"));
assertThat(processed.getParts().iterator().next().getHeaders().getFirst("Foo"),
is(equalTo("http://api.example.com:12345")));
assertThat(processed.getParts().iterator().next().getHeaders().getFirst("Foo"))
.isEqualTo("http://api.example.com:12345");
}
@Test
@@ -312,8 +308,8 @@ public class UriModifyingOperationPreprocessorTests {
OperationRequest processed = this.preprocessor.host("api.example.com")
.preprocess(createRequestWithPartWithContent(
"The uri 'http://localhost:12345' should be used"));
assertThat(new String(processed.getParts().iterator().next().getContent()),
is(equalTo("The uri 'http://api.example.com:12345' should be used")));
assertThat(new String(processed.getParts().iterator().next().getContent()))
.isEqualTo("The uri 'http://api.example.com:12345' should be used");
}
@Test
@@ -321,8 +317,8 @@ public class UriModifyingOperationPreprocessorTests {
this.preprocessor.scheme("https");
OperationRequest processed = this.preprocessor
.preprocess(createRequestWithUri("http://localhost:12345?foo=%7B%7D"));
assertThat(processed.getUri(),
is(equalTo(URI.create("https://localhost:12345?foo=%7B%7D"))));
assertThat(processed.getUri())
.isEqualTo(URI.create("https://localhost:12345?foo=%7B%7D"));
}
@@ -334,7 +330,7 @@ public class UriModifyingOperationPreprocessorTests {
new HttpHeaders(), new Parameters(),
Collections.<OperationRequestPart>emptyList(), cookies);
OperationRequest processed = this.preprocessor.preprocess(request);
assertThat(processed.getCookies().size(), is(equalTo(1)));
assertThat(processed.getCookies().size()).isEqualTo(1);
}
private OperationRequest createRequestWithUri(String uri) {

View File

@@ -18,7 +18,6 @@ package org.springframework.restdocs.webtestclient;
import java.net.URI;
import java.util.Arrays;
import java.util.Iterator;
import org.junit.Test;
@@ -29,7 +28,6 @@ import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.restdocs.operation.OperationRequest;
import org.springframework.restdocs.operation.OperationRequestPart;
import org.springframework.restdocs.operation.RequestCookie;
import org.springframework.test.web.reactive.server.ExchangeResult;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.util.LinkedMultiValueMap;
@@ -39,12 +37,7 @@ import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.Matchers.hasEntry;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
import static org.springframework.web.reactive.function.server.RequestPredicates.POST;
@@ -64,8 +57,8 @@ public class WebTestClientRequestConverterTests {
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
@@ -75,8 +68,8 @@ public class WebTestClientRequestConverterTests {
.configureClient().baseUrl("http://localhost:8080").build().get()
.uri("/foo").exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost:8080/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
@@ -87,10 +80,11 @@ public class WebTestClientRequestConverterTests {
.header("a", "alpha", "apple").header("b", "bravo").exchange()
.expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getHeaders(), hasEntry("a", Arrays.asList("alpha", "apple")));
assertThat(request.getHeaders(), hasEntry("b", Arrays.asList("bravo")));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
assertThat(request.getHeaders()).containsEntry("a",
Arrays.asList("alpha", "apple"));
assertThat(request.getHeaders()).containsEntry("b", Arrays.asList("bravo"));
}
@Test
@@ -100,8 +94,8 @@ public class WebTestClientRequestConverterTests {
.configureClient().baseUrl("https://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("https://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("https://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
@@ -111,8 +105,8 @@ public class WebTestClientRequestConverterTests {
.configureClient().baseUrl("https://localhost:8443").build().get()
.uri("/foo").exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("https://localhost:8443/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri()).isEqualTo(URI.create("https://localhost:8443/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
@@ -122,12 +116,12 @@ public class WebTestClientRequestConverterTests {
.configureClient().baseUrl("http://localhost").build().get()
.uri("/foo?a=alpha&b=bravo").exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(),
is(URI.create("http://localhost/foo?a=alpha&b=bravo")));
assertThat(request.getParameters().size(), is(2));
assertThat(request.getParameters(), hasEntry("a", Arrays.asList("alpha")));
assertThat(request.getParameters(), hasEntry("b", Arrays.asList("bravo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getUri())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&b=bravo"));
assertThat(request.getParameters()).hasSize(2);
assertThat(request.getParameters()).containsEntry("a", Arrays.asList("alpha"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("bravo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
}
@Test
@@ -143,12 +137,12 @@ public class WebTestClientRequestConverterTests {
.uri("/foo").body(BodyInserters.fromFormData(parameters)).exchange()
.expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParameters().size(), is(2));
assertThat(request.getParameters(),
hasEntry("a", Arrays.asList("alpha", "apple")));
assertThat(request.getParameters(), hasEntry("b", Arrays.asList("br&vo")));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParameters()).hasSize(2);
assertThat(request.getParameters()).containsEntry("a",
Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
}
@Test
@@ -161,13 +155,13 @@ public class WebTestClientRequestConverterTests {
.uri(URI.create("http://localhost/foo?a=alpha&a=apple&b=br%26vo"))
.exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(),
is(URI.create("http://localhost/foo?a=alpha&a=apple&b=br%26vo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParameters().size(), is(2));
assertThat(request.getParameters(),
hasEntry("a", Arrays.asList("alpha", "apple")));
assertThat(request.getParameters(), hasEntry("b", Arrays.asList("br&vo")));
assertThat(request.getUri())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&a=apple&b=br%26vo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParameters()).hasSize(2);
assertThat(request.getParameters()).containsEntry("a",
Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
}
@Test
@@ -183,13 +177,13 @@ public class WebTestClientRequestConverterTests {
.body(BodyInserters.fromFormData(parameters)).exchange().expectBody()
.returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(),
is(URI.create("http://localhost/foo?a=alpha&b=br%26vo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParameters().size(), is(2));
assertThat(request.getParameters(),
hasEntry("a", Arrays.asList("alpha", "apple")));
assertThat(request.getParameters(), hasEntry("b", Arrays.asList("br&vo")));
assertThat(request.getUri())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&b=br%26vo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParameters()).hasSize(2);
assertThat(request.getParameters()).containsEntry("a",
Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
}
@Test
@@ -200,8 +194,8 @@ public class WebTestClientRequestConverterTests {
.configureClient().baseUrl("http://localhost").build().post().uri("/foo")
.exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
}
@Test
@@ -216,17 +210,16 @@ public class WebTestClientRequestConverterTests {
.uri("/foo").body(BodyInserters.fromMultipartData(multipartData))
.exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParts().size(), is(1));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParts()).hasSize(1);
OperationRequestPart part = request.getParts().iterator().next();
assertThat(part.getName(), is(equalTo("file")));
assertThat(part.getSubmittedFileName(), is(nullValue()));
assertThat(part.getHeaders().size(), is(2));
assertThat(part.getHeaders().getContentLength(), is(4L));
assertThat(part.getHeaders().getContentDisposition().getName(),
is(equalTo("file")));
assertThat(part.getContent(), is(equalTo(new byte[] { 1, 2, 3, 4 })));
assertThat(part.getName()).isEqualTo("file");
assertThat(part.getSubmittedFileName()).isNull();
assertThat(part.getHeaders()).hasSize(2);
assertThat(part.getHeaders().getContentLength()).isEqualTo(4L);
assertThat(part.getHeaders().getContentDisposition().getName()).isEqualTo("file");
assertThat(part.getContent()).containsExactly(1, 2, 3, 4);
}
@Test
@@ -248,19 +241,19 @@ public class WebTestClientRequestConverterTests {
.uri("/foo").body(BodyInserters.fromMultipartData(multipartData))
.exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.POST));
assertThat(request.getParts().size(), is(1));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
assertThat(request.getParts()).hasSize(1);
OperationRequestPart part = request.getParts().iterator().next();
assertThat(part.getName(), is(equalTo("file")));
assertThat(part.getSubmittedFileName(), is(equalTo("image.png")));
assertThat(part.getHeaders().size(), is(3));
assertThat(part.getHeaders().getContentLength(), is(4L));
assertThat(part.getName()).isEqualTo("file");
assertThat(part.getSubmittedFileName()).isEqualTo("image.png");
assertThat(part.getHeaders()).hasSize(3);
assertThat(part.getHeaders().getContentLength()).isEqualTo(4);
ContentDisposition contentDisposition = part.getHeaders().getContentDisposition();
assertThat(contentDisposition.getName(), is(equalTo("file")));
assertThat(contentDisposition.getFilename(), is(equalTo("image.png")));
assertThat(part.getHeaders().getContentType(), is(equalTo(MediaType.IMAGE_PNG)));
assertThat(part.getContent(), is(equalTo(new byte[] { 1, 2, 3, 4 })));
assertThat(contentDisposition.getName()).isEqualTo("file");
assertThat(contentDisposition.getFilename()).isEqualTo("image.png");
assertThat(part.getHeaders().getContentType()).isEqualTo(MediaType.IMAGE_PNG);
assertThat(part.getContent()).containsExactly(1, 2, 3, 4);
}
@Test
@@ -270,20 +263,16 @@ public class WebTestClientRequestConverterTests {
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.cookie("cookieName1", "cookieVal1").cookie("cookieName2", "cookieVal2")
.exchange().expectBody().returnResult();
assertThat(result.getRequestHeaders().get(HttpHeaders.COOKIE),
is(notNullValue()));
assertThat(result.getRequestHeaders().get(HttpHeaders.COOKIE)).isNotNull();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri(), is(URI.create("http://localhost/foo")));
assertThat(request.getMethod(), is(HttpMethod.GET));
assertThat(request.getCookies().size(), is(equalTo(2)));
assertThat(request.getHeaders().get(HttpHeaders.COOKIE), is(nullValue()));
Iterator<RequestCookie> cookieIterator = request.getCookies().iterator();
RequestCookie cookie1 = cookieIterator.next();
assertThat(cookie1.getName(), is(equalTo("cookieName1")));
assertThat(cookie1.getValue(), is(equalTo("cookieVal1")));
RequestCookie cookie2 = cookieIterator.next();
assertThat(cookie2.getName(), is(equalTo("cookieName2")));
assertThat(cookie2.getValue(), is(equalTo("cookieVal2")));
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
assertThat(request.getCookies()).hasSize(2);
assertThat(request.getHeaders().get(HttpHeaders.COOKIE)).isNull();
assertThat(request.getCookies()).extracting("name").containsExactly("cookieName1",
"cookieName2");
assertThat(request.getCookies()).extracting("value").containsExactly("cookieVal1",
"cookieVal2");
}
}

View File

@@ -30,10 +30,7 @@ import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
/**
@@ -53,11 +50,11 @@ public class WebTestClientResponseConverterTests {
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
OperationResponse response = this.converter.convert(result);
assertThat(response.getStatus(), is(HttpStatus.OK));
assertThat(response.getContentAsString(), is(equalTo("Hello, World!")));
assertThat(response.getHeaders().getContentType(),
is(MediaType.parseMediaType("text/plain;charset=UTF-8")));
assertThat(response.getHeaders().getContentLength(), is(13L));
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK);
assertThat(response.getContentAsString()).isEqualTo("Hello, World!");
assertThat(response.getHeaders().getContentType())
.isEqualTo(MediaType.parseMediaType("text/plain;charset=UTF-8"));
assertThat(response.getHeaders().getContentLength()).isEqualTo(13);
}
@Test
@@ -71,10 +68,9 @@ public class WebTestClientResponseConverterTests {
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
OperationResponse response = this.converter.convert(result);
assertThat(response.getHeaders().size(), is(1));
assertTrue(response.getHeaders().containsKey(HttpHeaders.SET_COOKIE));
assertThat(response.getHeaders().get(HttpHeaders.SET_COOKIE), equalTo(
Collections.singletonList("name=value; Domain=localhost; HttpOnly")));
assertThat(response.getHeaders()).hasSize(1);
assertThat(response.getHeaders()).containsEntry(HttpHeaders.SET_COOKIE,
Collections.singletonList("name=value; Domain=localhost; HttpOnly"));
}
}

View File

@@ -17,7 +17,6 @@
package org.springframework.restdocs.webtestclient;
import java.net.URI;
import java.util.Map;
import org.junit.Rule;
import org.junit.Test;
@@ -29,11 +28,7 @@ import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.web.reactive.function.client.ExchangeFunction;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.CoreMatchers.nullValue;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
@@ -55,11 +50,10 @@ public class WebTestClientRestDocumentationConfigurerTests {
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("/test"))
.header(WebTestClient.WEBTESTCLIENT_REQUEST_ID, "1").build();
this.configurer.filter(request, mock(ExchangeFunction.class));
Map<String, Object> configuration = WebTestClientRestDocumentationConfigurer
.retrieveConfiguration(request.headers());
assertThat(configuration, notNullValue());
assertThat(WebTestClientRestDocumentationConfigurer
.retrieveConfiguration(request.headers()), nullValue());
.retrieveConfiguration(request.headers())).isNotNull();
assertThat(WebTestClientRestDocumentationConfigurer
.retrieveConfiguration(request.headers())).isNull();
}
@Test
@@ -72,8 +66,8 @@ public class WebTestClientRestDocumentationConfigurerTests {
ArgumentCaptor<ClientRequest> requestCaptor = ArgumentCaptor
.forClass(ClientRequest.class);
verify(exchangeFunction).exchange(requestCaptor.capture());
assertThat(requestCaptor.getValue().url(),
is(equalTo(URI.create("http://localhost:8080/test?foo=bar#baz"))));
assertThat(requestCaptor.getValue().url())
.isEqualTo(URI.create("http://localhost:8080/test?foo=bar#baz"));
}
@Test
@@ -87,8 +81,8 @@ public class WebTestClientRestDocumentationConfigurerTests {
ArgumentCaptor<ClientRequest> requestCaptor = ArgumentCaptor
.forClass(ClientRequest.class);
verify(exchangeFunction).exchange(requestCaptor.capture());
assertThat(requestCaptor.getValue().url(),
is(equalTo(URI.create("https://api.example.com:4567/test?foo=bar#baz"))));
assertThat(requestCaptor.getValue().url())
.isEqualTo(URI.create("https://api.example.com:4567/test?foo=bar#baz"));
}
}

View File

@@ -17,6 +17,10 @@
package org.springframework.restdocs.webtestclient;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@@ -24,6 +28,7 @@ import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.assertj.core.api.Condition;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -36,6 +41,7 @@ import org.springframework.restdocs.JUnitRestDocumentation;
import org.springframework.restdocs.templates.TemplateFormats;
import org.springframework.test.web.reactive.server.EntityExchangeResult;
import org.springframework.test.web.reactive.server.WebTestClient;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.FileSystemUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
@@ -46,20 +52,18 @@ import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName;
import static org.springframework.restdocs.request.RequestDocumentation.partWithName;
import static org.springframework.restdocs.request.RequestDocumentation.pathParameters;
import static org.springframework.restdocs.request.RequestDocumentation.requestParameters;
import static org.springframework.restdocs.request.RequestDocumentation.requestParts;
import static org.springframework.restdocs.templates.TemplateFormats.asciidoctor;
import static org.springframework.restdocs.test.SnippetMatchers.codeBlock;
import static org.springframework.restdocs.test.SnippetMatchers.httpResponse;
import static org.springframework.restdocs.test.SnippetMatchers.snippet;
import static org.springframework.restdocs.test.SnippetMatchers.tableWithHeader;
import static org.springframework.restdocs.test.SnippetMatchers.tableWithTitleAndHeader;
import static org.springframework.restdocs.test.SnippetConditions.codeBlock;
import static org.springframework.restdocs.test.SnippetConditions.httpResponse;
import static org.springframework.restdocs.test.SnippetConditions.tableWithHeader;
import static org.springframework.restdocs.test.SnippetConditions.tableWithTitleAndHeader;
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.document;
import static org.springframework.restdocs.webtestclient.WebTestClientRestDocumentation.documentationConfiguration;
import static org.springframework.web.reactive.function.BodyInserters.fromObject;
@@ -118,12 +122,12 @@ public class WebTestClientRestDocumentationIntegrationTests {
parameterWithName("foo").description("Foo description"),
parameterWithName("bar").description("Bar description"))));
assertThat(
new File("build/generated-snippets/path-parameters/path-parameters.adoc"),
is(snippet(asciidoctor()).withContents(
tableWithTitleAndHeader(TemplateFormats.asciidoctor(),
"+/{foo}/{bar}+", "Parameter", "Description")
.row("`foo`", "Foo description")
.row("`bar`", "Bar description"))));
new File("build/generated-snippets/path-parameters/path-parameters.adoc"))
.has(content(
tableWithTitleAndHeader(TemplateFormats.asciidoctor(),
"+/{foo}/{bar}+", "Parameter", "Description")
.row("`foo`", "Foo description")
.row("`bar`", "Bar description")));
}
@Test
@@ -134,11 +138,11 @@ public class WebTestClientRestDocumentationIntegrationTests {
parameterWithName("a").description("Alpha description"),
parameterWithName("b").description("Bravo description"))));
assertThat(new File(
"build/generated-snippets/request-parameters/request-parameters.adoc"),
is(snippet(asciidoctor()).withContents(
tableWithHeader(TemplateFormats.asciidoctor(), "Parameter",
"Description").row("`a`", "Alpha description").row("`b`",
"Bravo description"))));
"build/generated-snippets/request-parameters/request-parameters.adoc"))
.has(content(tableWithHeader(TemplateFormats.asciidoctor(),
"Parameter", "Description")
.row("`a`", "Alpha description")
.row("`b`", "Bravo description")));
}
@Test
@@ -152,22 +156,19 @@ public class WebTestClientRestDocumentationIntegrationTests {
this.webTestClient.post().uri("/upload")
.body(BodyInserters.fromMultipartData(multipartData)).exchange()
.expectStatus().isOk().expectBody().consumeWith(documentation);
assertThat(new File("build/generated-snippets/multipart/request-parts.adoc"),
is(snippet(asciidoctor())
.withContents(tableWithHeader(TemplateFormats.asciidoctor(),
"Part", "Description").row("`a`", "Part a").row("`b`",
"Part b"))));
assertThat(new File("build/generated-snippets/multipart/request-parts.adoc"))
.has(content(tableWithHeader(TemplateFormats.asciidoctor(), "Part",
"Description").row("`a`", "Part a").row("`b`", "Part b")));
}
@Test
public void responseWithSetCookie() throws Exception {
this.webTestClient.get().uri("/set-cookie").exchange().expectStatus().isOk()
.expectBody().consumeWith(document("set-cookie"));
assertThat(new File("build/generated-snippets/set-cookie/http-response.adoc"),
is(snippet(asciidoctor())
.withContents(httpResponse(asciidoctor(), HttpStatus.OK).header(
HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly"))));
assertThat(new File("build/generated-snippets/set-cookie/http-response.adoc"))
.has(content(httpResponse(asciidoctor(), HttpStatus.OK).header(
HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly")));
}
@Test
@@ -176,12 +177,11 @@ public class WebTestClientRestDocumentationIntegrationTests {
.accept(MediaType.APPLICATION_JSON).exchange().expectStatus().isOk()
.expectBody().consumeWith(document("curl-snippet-with-cookies"));
assertThat(new File(
"build/generated-snippets/curl-snippet-with-cookies/curl-request.adoc"),
is(snippet(asciidoctor())
.withContents(codeBlock(asciidoctor(), "bash").content(String
"build/generated-snippets/curl-snippet-with-cookies/curl-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(String
.format("$ curl 'https://api.example.com/' -i -X GET \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " --cookie 'cookieName=cookieVal'")))));
+ " --cookie 'cookieName=cookieVal'"))));
}
@Test
@@ -190,12 +190,11 @@ public class WebTestClientRestDocumentationIntegrationTests {
.accept(MediaType.APPLICATION_JSON).exchange().expectStatus().isOk()
.expectBody().consumeWith(document("httpie-snippet-with-cookies"));
assertThat(new File(
"build/generated-snippets/httpie-snippet-with-cookies/httpie-request.adoc"),
is(snippet(asciidoctor())
.withContents(codeBlock(asciidoctor(), "bash").content(
"build/generated-snippets/httpie-snippet-with-cookies/httpie-request.adoc"))
.has(content(codeBlock(asciidoctor(), "bash").withContent(
String.format("$ http GET 'https://api.example.com/' \\%n"
+ " 'Accept:application/json' \\%n"
+ " 'Cookie:cookieName=cookieVal'")))));
+ " 'Cookie:cookieName=cookieVal'"))));
}
private void assertExpectedSnippetFilesExist(File directory, String... snippets) {
@@ -203,7 +202,26 @@ public class WebTestClientRestDocumentationIntegrationTests {
Set<File> expected = Stream.of(snippets)
.map((snippet) -> new File(directory, snippet))
.collect(Collectors.toSet());
assertThat(actual, equalTo(expected));
assertThat(actual).isEqualTo(expected);
}
private Condition<File> content(final Condition<String> delegate) {
return new Condition<File>() {
@Override
public boolean matches(File value) {
try {
return delegate
.matches(FileCopyUtils.copyToString(new InputStreamReader(
new FileInputStream(value), StandardCharsets.UTF_8)));
}
catch (IOException ex) {
fail("Failed to read '" + value + "'", ex);
return false;
}
}
};
}
/**