Merge branch '1.2.x'

This commit is contained in:
Andy Wilkinson
2019-08-30 11:20:34 +01:00
192 changed files with 3407 additions and 5493 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -34,8 +34,7 @@ public final class WebTestClientOperationPreprocessorsConfigurer extends
OperationPreprocessorsConfigurer<WebTestClientRestDocumentationConfigurer, WebTestClientOperationPreprocessorsConfigurer>
implements ExchangeFilterFunction {
WebTestClientOperationPreprocessorsConfigurer(
WebTestClientRestDocumentationConfigurer parent) {
WebTestClientOperationPreprocessorsConfigurer(WebTestClientRestDocumentationConfigurer parent) {
super(parent);
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -59,8 +59,8 @@ import org.springframework.util.MultiValueMap;
*/
class WebTestClientRequestConverter implements RequestConverter<ExchangeResult> {
private static final ResolvableType FORM_DATA_TYPE = ResolvableType
.forClassWithGenerics(MultiValueMap.class, String.class, String.class);
private static final ResolvableType FORM_DATA_TYPE = ResolvableType.forClassWithGenerics(MultiValueMap.class,
String.class, String.class);
private final QueryStringParser queryStringParser = new QueryStringParser();
@@ -69,9 +69,8 @@ class WebTestClientRequestConverter implements RequestConverter<ExchangeResult>
@Override
public OperationRequest convert(ExchangeResult result) {
HttpHeaders headers = extractRequestHeaders(result);
return new OperationRequestFactory().create(result.getUrl(), result.getMethod(),
result.getRequestBodyContent(), headers, extractParameters(result),
extractRequestParts(result), extractCookies(headers));
return new OperationRequestFactory().create(result.getUrl(), result.getMethod(), result.getRequestBodyContent(),
headers, extractParameters(result), extractRequestParts(result), extractCookies(headers));
}
private HttpHeaders extractRequestHeaders(ExchangeResult result) {
@@ -84,36 +83,30 @@ class WebTestClientRequestConverter implements RequestConverter<ExchangeResult>
private Parameters extractParameters(ExchangeResult result) {
Parameters parameters = new Parameters();
parameters.addAll(this.queryStringParser.parse(result.getUrl()));
if (MediaType.APPLICATION_FORM_URLENCODED
.isCompatibleWith(result.getRequestHeaders().getContentType())) {
if (MediaType.APPLICATION_FORM_URLENCODED.isCompatibleWith(result.getRequestHeaders().getContentType())) {
parameters.addAll(this.formDataReader
.readMono(FORM_DATA_TYPE,
new ExchangeResultReactiveHttpInputMessage(result), null)
.block());
.readMono(FORM_DATA_TYPE, new ExchangeResultReactiveHttpInputMessage(result), null).block());
}
return parameters;
}
private List<OperationRequestPart> extractRequestParts(ExchangeResult result) {
if (!ClassUtils.isPresent(
"org.synchronoss.cloud.nio.multipart.NioMultipartParserListener",
if (!ClassUtils.isPresent("org.synchronoss.cloud.nio.multipart.NioMultipartParserListener",
getClass().getClassLoader())) {
return Collections.emptyList();
}
return new MultipartHttpMessageReader(new SynchronossPartHttpMessageReader())
.readMono(ResolvableType.forClass(Part.class),
new ExchangeResultReactiveHttpInputMessage(result),
.readMono(ResolvableType.forClass(Part.class), new ExchangeResultReactiveHttpInputMessage(result),
Collections.emptyMap())
.onErrorReturn(new LinkedMultiValueMap<>()).block().values().stream()
.flatMap((parts) -> parts.stream().map(this::createOperationRequestPart))
.collect(Collectors.toList());
.flatMap((parts) -> parts.stream().map(this::createOperationRequestPart)).collect(Collectors.toList());
}
private OperationRequestPart createOperationRequestPart(Part part) {
ByteArrayOutputStream content = readPartBodyContent(part);
return new OperationRequestPartFactory().create(part.name(),
(part instanceof FilePart) ? ((FilePart) part).filename() : null,
content.toByteArray(), part.headers());
(part instanceof FilePart) ? ((FilePart) part).filename() : null, content.toByteArray(),
part.headers());
}
private ByteArrayOutputStream readPartBodyContent(Part part) {
@@ -128,8 +121,7 @@ class WebTestClientRequestConverter implements RequestConverter<ExchangeResult>
return Collections.emptyList();
}
headers.remove(HttpHeaders.COOKIE);
return cookieHeaders.stream().map(this::createRequestCookie)
.collect(Collectors.toList());
return cookieHeaders.stream().map(this::createRequestCookie).collect(Collectors.toList());
}
private RequestCookie createRequestCookie(String header) {
@@ -137,8 +129,7 @@ class WebTestClientRequestConverter implements RequestConverter<ExchangeResult>
return new RequestCookie(components[0], components[1]);
}
private final class ExchangeResultReactiveHttpInputMessage
implements ReactiveHttpInputMessage {
private final class ExchangeResultReactiveHttpInputMessage implements ReactiveHttpInputMessage {
private final ExchangeResult result;

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -36,19 +36,17 @@ class WebTestClientResponseConverter implements ResponseConverter<ExchangeResult
@Override
public OperationResponse convert(ExchangeResult result) {
return new OperationResponseFactory().create(result.getStatus(),
extractHeaders(result), result.getResponseBodyContent());
return new OperationResponseFactory().create(result.getStatus(), extractHeaders(result),
result.getResponseBodyContent());
}
private HttpHeaders extractHeaders(ExchangeResult result) {
HttpHeaders headers = result.getResponseHeaders();
if (result.getResponseCookies().isEmpty()
|| headers.containsKey(HttpHeaders.SET_COOKIE)) {
if (result.getResponseCookies().isEmpty() || headers.containsKey(HttpHeaders.SET_COOKIE)) {
return headers;
}
result.getResponseCookies().values().stream().flatMap(Collection::stream)
.forEach((cookie) -> headers.add(HttpHeaders.SET_COOKIE,
generateSetCookieHeader(cookie)));
.forEach((cookie) -> headers.add(HttpHeaders.SET_COOKIE, generateSetCookieHeader(cookie)));
return headers;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -73,11 +73,9 @@ public abstract class WebTestClientRestDocumentation {
* @see BodySpec#consumeWith(Consumer)
* @see BodyContentSpec#consumeWith(Consumer)
*/
public static <T extends ExchangeResult> Consumer<T> document(String identifier,
Snippet... snippets) {
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER,
RESPONSE_CONVERTER, snippets).handle(result, result,
retrieveConfiguration(result));
public static <T extends ExchangeResult> Consumer<T> document(String identifier, Snippet... snippets) {
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER, snippets)
.handle(result, result, retrieveConfiguration(result));
}
/**
@@ -93,9 +91,8 @@ public abstract class WebTestClientRestDocumentation {
*/
public static <T extends ExchangeResult> Consumer<T> document(String identifier,
OperationRequestPreprocessor requestPreprocessor, Snippet... snippets) {
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER,
RESPONSE_CONVERTER, requestPreprocessor, snippets).handle(result, result,
retrieveConfiguration(result));
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER,
requestPreprocessor, snippets).handle(result, result, retrieveConfiguration(result));
}
/**
@@ -111,9 +108,8 @@ public abstract class WebTestClientRestDocumentation {
*/
public static <T extends ExchangeResult> Consumer<T> document(String identifier,
OperationResponsePreprocessor responsePreprocessor, Snippet... snippets) {
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER,
RESPONSE_CONVERTER, responsePreprocessor, snippets).handle(result, result,
retrieveConfiguration(result));
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER,
responsePreprocessor, snippets).handle(result, result, retrieveConfiguration(result));
}
/**
@@ -130,19 +126,17 @@ public abstract class WebTestClientRestDocumentation {
* {@link ExchangeResult}.
*/
public static <T extends ExchangeResult> Consumer<T> document(String identifier,
OperationRequestPreprocessor requestPreprocessor,
OperationResponsePreprocessor responsePreprocessor, Snippet... snippets) {
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER,
RESPONSE_CONVERTER, requestPreprocessor, responsePreprocessor, snippets)
.handle(result, result, retrieveConfiguration(result));
OperationRequestPreprocessor requestPreprocessor, OperationResponsePreprocessor responsePreprocessor,
Snippet... snippets) {
return (result) -> new RestDocumentationGenerator<>(identifier, REQUEST_CONVERTER, RESPONSE_CONVERTER,
requestPreprocessor, responsePreprocessor, snippets).handle(result, result,
retrieveConfiguration(result));
}
private static Map<String, Object> retrieveConfiguration(ExchangeResult result) {
Map<String, Object> configuration = new HashMap<>(
WebTestClientRestDocumentationConfigurer
.retrieveConfiguration(result.getRequestHeaders()));
configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE,
result.getUriTemplate());
WebTestClientRestDocumentationConfigurer.retrieveConfiguration(result.getRequestHeaders()));
configuration.put(RestDocumentationGenerator.ATTRIBUTE_NAME_URL_TEMPLATE, result.getUriTemplate());
return configuration;
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2019 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.
@@ -45,8 +45,7 @@ public class WebTestClientRestDocumentationConfigurer extends
RestDocumentationConfigurer<WebTestClientSnippetConfigurer, WebTestClientOperationPreprocessorsConfigurer, WebTestClientRestDocumentationConfigurer>
implements ExchangeFilterFunction {
private final WebTestClientSnippetConfigurer snippetConfigurer = new WebTestClientSnippetConfigurer(
this);
private final WebTestClientSnippetConfigurer snippetConfigurer = new WebTestClientSnippetConfigurer(this);
private static final Map<String, Map<String, Object>> configurations = new ConcurrentHashMap<>();
@@ -55,8 +54,7 @@ public class WebTestClientRestDocumentationConfigurer extends
private final RestDocumentationContextProvider contextProvider;
WebTestClientRestDocumentationConfigurer(
RestDocumentationContextProvider contextProvider) {
WebTestClientRestDocumentationConfigurer(RestDocumentationContextProvider contextProvider) {
this.contextProvider = contextProvider;
}
@@ -96,9 +94,8 @@ public class WebTestClientRestDocumentationConfigurer extends
return request;
}
try {
requestUri = new URI("http", requestUri.getUserInfo(), "localhost", 8080,
requestUri.getPath(), requestUri.getQuery(),
requestUri.getFragment());
requestUri = new URI("http", requestUri.getUserInfo(), "localhost", 8080, requestUri.getPath(),
requestUri.getQuery(), requestUri.getFragment());
return ClientRequest.from(request).url(requestUri).build();
}
catch (URISyntaxException ex) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2017 the original author or authors.
* Copyright 2014-2019 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.
@@ -31,8 +31,8 @@ import org.springframework.web.reactive.function.client.ExchangeFunction;
* @author Andy Wilkinson
* @since 2.0.0
*/
public class WebTestClientSnippetConfigurer extends
SnippetConfigurer<WebTestClientRestDocumentationConfigurer, WebTestClientSnippetConfigurer>
public class WebTestClientSnippetConfigurer
extends SnippetConfigurer<WebTestClientRestDocumentationConfigurer, WebTestClientSnippetConfigurer>
implements ExchangeFilterFunction {
WebTestClientSnippetConfigurer(WebTestClientRestDocumentationConfigurer parent) {

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -52,10 +52,9 @@ public class WebTestClientRequestConverterTests {
@Test
public void httpRequest() {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo").exchange().expectBody()
.returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
@@ -63,10 +62,9 @@ public class WebTestClientRequestConverterTests {
@Test
public void httpRequestWithCustomPort() {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("http://localhost:8080").build().get()
.uri("/foo").exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("http://localhost:8080").build().get().uri("/foo").exchange().expectBody()
.returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost:8080/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
@@ -74,25 +72,21 @@ public class WebTestClientRequestConverterTests {
@Test
public void requestWithHeaders() {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/"), (req) -> null))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.header("a", "alpha", "apple").header("b", "bravo").exchange()
.expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(GET("/"), (req) -> null))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo").header("a", "alpha", "apple")
.header("b", "bravo").exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
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("a", Arrays.asList("alpha", "apple"));
assertThat(request.getHeaders()).containsEntry("b", Arrays.asList("bravo"));
}
@Test
public void httpsRequest() {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("https://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("https://localhost").build().get().uri("/foo").exchange().expectBody()
.returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri()).isEqualTo(URI.create("https://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
@@ -100,10 +94,9 @@ public class WebTestClientRequestConverterTests {
@Test
public void httpsRequestWithCustomPort() {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("https://localhost:8443").build().get()
.uri("/foo").exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("https://localhost:8443").build().get().uri("/foo").exchange().expectBody()
.returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri()).isEqualTo(URI.create("https://localhost:8443/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.GET);
@@ -111,13 +104,11 @@ public class WebTestClientRequestConverterTests {
@Test
public void getRequestWithQueryStringPopulatesParameters() throws Exception {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("http://localhost").build().get()
.uri("/foo?a=alpha&b=bravo").exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo?a=alpha&b=bravo").exchange()
.expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&b=bravo"));
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"));
@@ -129,38 +120,32 @@ public class WebTestClientRequestConverterTests {
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.addAll("a", Arrays.asList("alpha", "apple"));
parameters.addAll("b", Arrays.asList("br&vo"));
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toFormData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post()
.uri("/foo").body(BodyInserters.fromFormData(parameters)).exchange()
.expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toFormData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post().uri("/foo")
.body(BodyInserters.fromFormData(parameters)).exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
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("a", Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
}
@Test
public void postRequestWithQueryStringParameters() throws Exception {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toFormData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post()
.uri(URI.create("http://localhost/foo?a=alpha&a=apple&b=br%26vo"))
.exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toFormData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post()
.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())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&a=apple&b=br%26vo"));
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("a", Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
}
@@ -168,31 +153,26 @@ public class WebTestClientRequestConverterTests {
public void postRequestWithQueryStringAndFormDataParameters() throws Exception {
MultiValueMap<String, String> parameters = new LinkedMultiValueMap<>();
parameters.addAll("a", Arrays.asList("apple"));
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toFormData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post()
.uri(URI.create("http://localhost/foo?a=alpha&b=br%26vo"))
.body(BodyInserters.fromFormData(parameters)).exchange().expectBody()
.returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toFormData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post()
.uri(URI.create("http://localhost/foo?a=alpha&b=br%26vo")).body(BodyInserters.fromFormData(parameters))
.exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri())
.isEqualTo(URI.create("http://localhost/foo?a=alpha&b=br%26vo"));
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("a", Arrays.asList("alpha", "apple"));
assertThat(request.getParameters()).containsEntry("b", Arrays.asList("br&vo"));
}
@Test
public void postRequestWithNoContentType() throws Exception {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(POST("/foo"),
(req) -> ServerResponse.ok().build()))
.configureClient().baseUrl("http://localhost").build().post().uri("/foo")
.exchange().expectBody().returnResult();
.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> ServerResponse.ok().build()))
.configureClient().baseUrl("http://localhost").build().post().uri("/foo").exchange().expectBody()
.returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
@@ -202,13 +182,11 @@ public class WebTestClientRequestConverterTests {
public void multipartUpload() throws Exception {
MultiValueMap<String, Object> multipartData = new LinkedMultiValueMap<>();
multipartData.add("file", new byte[] { 1, 2, 3, 4 });
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toMultipartData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post()
.uri("/foo").body(BodyInserters.fromMultipartData(multipartData))
.exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toMultipartData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post().uri("/foo")
.body(BodyInserters.fromMultipartData(multipartData)).exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
@@ -233,13 +211,11 @@ public class WebTestClientRequestConverterTests {
}
});
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toMultipartData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post()
.uri("/foo").body(BodyInserters.fromMultipartData(multipartData))
.exchange().expectBody().returnResult();
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(POST("/foo"), (req) -> {
req.body(BodyExtractors.toMultipartData()).block();
return null;
})).configureClient().baseUrl("http://localhost").build().post().uri("/foo")
.body(BodyInserters.fromMultipartData(multipartData)).exchange().expectBody().returnResult();
OperationRequest request = this.converter.convert(result);
assertThat(request.getUri()).isEqualTo(URI.create("http://localhost/foo"));
assertThat(request.getMethod()).isEqualTo(HttpMethod.POST);
@@ -258,21 +234,18 @@ public class WebTestClientRequestConverterTests {
@Test
public void requestWithCookies() throws Exception {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
ExchangeResult result = WebTestClient.bindToRouterFunction(RouterFunctions.route(GET("/foo"), (req) -> null))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.cookie("cookieName1", "cookieVal1").cookie("cookieName2", "cookieVal2")
.exchange().expectBody().returnResult();
.cookie("cookieName1", "cookieVal1").cookie("cookieName2", "cookieVal2").exchange().expectBody()
.returnResult();
assertThat(result.getRequestHeaders().get(HttpHeaders.COOKIE)).isNotNull();
OperationRequest request = this.converter.convert(result);
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");
assertThat(request.getCookies()).extracting("name").containsExactly("cookieName1", "cookieName2");
assertThat(request.getCookies()).extracting("value").containsExactly("cookieVal1", "cookieVal2");
}
}

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -45,10 +45,10 @@ public class WebTestClientResponseConverterTests {
@Test
public void basicResponse() {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"),
(req) -> ServerResponse.ok().syncBody("Hello, World!")))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
.bindToRouterFunction(
RouterFunctions.route(GET("/foo"), (req) -> ServerResponse.ok().syncBody("Hello, World!")))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo").exchange().expectBody()
.returnResult();
OperationResponse response = this.converter.convert(result);
assertThat(response.getStatus()).isEqualTo(HttpStatus.OK);
assertThat(response.getContentAsString()).isEqualTo("Hello, World!");
@@ -62,11 +62,10 @@ public class WebTestClientResponseConverterTests {
ExchangeResult result = WebTestClient
.bindToRouterFunction(RouterFunctions.route(GET("/foo"),
(req) -> ServerResponse.ok()
.cookie(ResponseCookie.from("name", "value")
.domain("localhost").httpOnly(true).build())
.cookie(ResponseCookie.from("name", "value").domain("localhost").httpOnly(true).build())
.build()))
.configureClient().baseUrl("http://localhost").build().get().uri("/foo")
.exchange().expectBody().returnResult();
.configureClient().baseUrl("http://localhost").build().get().uri("/foo").exchange().expectBody()
.returnResult();
OperationResponse response = this.converter.convert(result);
assertThat(response.getHeaders()).hasSize(1);
assertThat(response.getHeaders()).containsEntry(HttpHeaders.SET_COOKIE,

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -50,36 +50,29 @@ 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));
assertThat(WebTestClientRestDocumentationConfigurer
.retrieveConfiguration(request.headers())).isNotNull();
assertThat(WebTestClientRestDocumentationConfigurer
.retrieveConfiguration(request.headers())).isNull();
assertThat(WebTestClientRestDocumentationConfigurer.retrieveConfiguration(request.headers())).isNotNull();
assertThat(WebTestClientRestDocumentationConfigurer.retrieveConfiguration(request.headers())).isNull();
}
@Test
public void requestUriHasDefaultsAppliedWhenItHasNoHost() {
ClientRequest request = ClientRequest
.create(HttpMethod.GET, URI.create("/test?foo=bar#baz"))
ClientRequest request = ClientRequest.create(HttpMethod.GET, URI.create("/test?foo=bar#baz"))
.header(WebTestClient.WEBTESTCLIENT_REQUEST_ID, "1").build();
ExchangeFunction exchangeFunction = mock(ExchangeFunction.class);
this.configurer.filter(request, exchangeFunction);
ArgumentCaptor<ClientRequest> requestCaptor = ArgumentCaptor
.forClass(ClientRequest.class);
ArgumentCaptor<ClientRequest> requestCaptor = ArgumentCaptor.forClass(ClientRequest.class);
verify(exchangeFunction).exchange(requestCaptor.capture());
assertThat(requestCaptor.getValue().url())
.isEqualTo(URI.create("http://localhost:8080/test?foo=bar#baz"));
assertThat(requestCaptor.getValue().url()).isEqualTo(URI.create("http://localhost:8080/test?foo=bar#baz"));
}
@Test
public void requestUriIsNotChangedWhenItHasAHost() {
ClientRequest request = ClientRequest
.create(HttpMethod.GET,
URI.create("https://api.example.com:4567/test?foo=bar#baz"))
.create(HttpMethod.GET, URI.create("https://api.example.com:4567/test?foo=bar#baz"))
.header(WebTestClient.WEBTESTCLIENT_REQUEST_ID, "1").build();
ExchangeFunction exchangeFunction = mock(ExchangeFunction.class);
this.configurer.filter(request, exchangeFunction);
ArgumentCaptor<ClientRequest> requestCaptor = ArgumentCaptor
.forClass(ClientRequest.class);
ArgumentCaptor<ClientRequest> requestCaptor = ArgumentCaptor.forClass(ClientRequest.class);
verify(exchangeFunction).exchange(requestCaptor.capture());
assertThat(requestCaptor.getValue().url())
.isEqualTo(URI.create("https://api.example.com:4567/test?foo=bar#baz"));

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2014-2018 the original author or authors.
* Copyright 2014-2019 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.
@@ -84,23 +84,18 @@ public class WebTestClientRestDocumentationIntegrationTests {
public void setUp() {
RouterFunction<ServerResponse> route = RouterFunctions
.route(RequestPredicates.GET("/"),
(request) -> ServerResponse.status(HttpStatus.OK)
.body(fromObject(new Person("Jane", "Doe"))))
(request) -> ServerResponse.status(HttpStatus.OK).body(fromObject(new Person("Jane", "Doe"))))
.andRoute(RequestPredicates.GET("/{foo}/{bar}"),
(request) -> ServerResponse.status(HttpStatus.OK)
.body(fromObject(new Person("Jane", "Doe"))))
(request) -> ServerResponse.status(HttpStatus.OK).body(fromObject(new Person("Jane", "Doe"))))
.andRoute(RequestPredicates.POST("/upload"),
(request) -> request.body(BodyExtractors.toMultipartData())
.map((parts) -> ServerResponse.status(HttpStatus.OK)
.build().block()))
.map((parts) -> ServerResponse.status(HttpStatus.OK).build().block()))
.andRoute(RequestPredicates.GET("/set-cookie"),
(request) -> ServerResponse.ok()
.cookie(ResponseCookie.from("name", "value")
.domain("localhost").httpOnly(true).build())
.cookie(ResponseCookie.from("name", "value").domain("localhost").httpOnly(true).build())
.build());
this.webTestClient = WebTestClient.bindToRouterFunction(route).configureClient()
.baseUrl("https://api.example.com")
.filter(documentationConfiguration(this.restDocumentation)).build();
.baseUrl("https://api.example.com").filter(documentationConfiguration(this.restDocumentation)).build();
}
@Test
@@ -109,40 +104,30 @@ public class WebTestClientRestDocumentationIntegrationTests {
FileSystemUtils.deleteRecursively(outputDir);
this.webTestClient.get().uri("/").exchange().expectStatus().isOk().expectBody()
.consumeWith(document("default-snippets"));
assertExpectedSnippetFilesExist(outputDir, "http-request.adoc",
"http-response.adoc", "curl-request.adoc", "httpie-request.adoc",
"request-body.adoc", "response-body.adoc");
assertExpectedSnippetFilesExist(outputDir, "http-request.adoc", "http-response.adoc", "curl-request.adoc",
"httpie-request.adoc", "request-body.adoc", "response-body.adoc");
}
@Test
public void pathParametersSnippet() {
this.webTestClient.get().uri("/{foo}/{bar}", "1", "2").exchange().expectStatus()
.isOk().expectBody()
.consumeWith(document("path-parameters", pathParameters(
parameterWithName("foo").description("Foo description"),
parameterWithName("bar").description("Bar description"))));
assertThat(
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")));
this.webTestClient.get().uri("/{foo}/{bar}", "1", "2").exchange().expectStatus().isOk().expectBody()
.consumeWith(document("path-parameters",
pathParameters(parameterWithName("foo").description("Foo description"),
parameterWithName("bar").description("Bar description"))));
assertThat(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
public void requestParametersSnippet() {
this.webTestClient.get().uri("/?a=alpha&b=bravo").exchange().expectStatus().isOk()
.expectBody()
.consumeWith(document("request-parameters", requestParameters(
parameterWithName("a").description("Alpha description"),
parameterWithName("b").description("Bravo description"))));
assertThat(new File(
"build/generated-snippets/request-parameters/request-parameters.adoc"))
.has(content(tableWithHeader(TemplateFormats.asciidoctor(),
"Parameter", "Description")
.row("`a`", "Alpha description")
.row("`b`", "Bravo description")));
this.webTestClient.get().uri("/?a=alpha&b=bravo").exchange().expectStatus().isOk().expectBody()
.consumeWith(document("request-parameters",
requestParameters(parameterWithName("a").description("Alpha description"),
parameterWithName("b").description("Bravo description"))));
assertThat(new File("build/generated-snippets/request-parameters/request-parameters.adoc"))
.has(content(tableWithHeader(TemplateFormats.asciidoctor(), "Parameter", "Description")
.row("`a`", "Alpha description").row("`b`", "Bravo description")));
}
@Test
@@ -151,58 +136,46 @@ public class WebTestClientRestDocumentationIntegrationTests {
multipartData.add("a", "alpha");
multipartData.add("b", "bravo");
Consumer<EntityExchangeResult<byte[]>> documentation = document("multipart",
requestParts(partWithName("a").description("Part a"),
partWithName("b").description("Part b")));
this.webTestClient.post().uri("/upload")
.body(BodyInserters.fromMultipartData(multipartData)).exchange()
requestParts(partWithName("a").description("Part a"), partWithName("b").description("Part b")));
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"))
.has(content(tableWithHeader(TemplateFormats.asciidoctor(), "Part",
"Description").row("`a`", "Part a").row("`b`", "Part b")));
.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"));
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"))
.has(content(httpResponse(TemplateFormats.asciidoctor(), HttpStatus.OK)
.header(HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly")));
.has(content(httpResponse(TemplateFormats.asciidoctor(), HttpStatus.OK).header(HttpHeaders.SET_COOKIE,
"name=value; Domain=localhost; HttpOnly")));
}
@Test
public void curlSnippetWithCookies() throws Exception {
this.webTestClient.get().uri("/").cookie("cookieName", "cookieVal")
.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"))
.has(content(codeBlock(TemplateFormats.asciidoctor(), "bash")
.withContent(String.format(
"$ curl 'https://api.example.com/' -i -X GET \\%n"
+ " -H 'Accept: application/json' \\%n"
+ " --cookie 'cookieName=cookieVal'"))));
this.webTestClient.get().uri("/").cookie("cookieName", "cookieVal").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"))
.has(content(codeBlock(TemplateFormats.asciidoctor(), "bash")
.withContent(String.format("$ curl 'https://api.example.com/' -i -X GET \\%n"
+ " -H 'Accept: application/json' \\%n" + " --cookie 'cookieName=cookieVal'"))));
}
@Test
public void httpieSnippetWithCookies() throws Exception {
this.webTestClient.get().uri("/").cookie("cookieName", "cookieVal")
.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"))
.has(content(codeBlock(TemplateFormats.asciidoctor(), "bash")
.withContent(String.format(
"$ http GET 'https://api.example.com/' \\%n"
+ " 'Accept:application/json' \\%n"
+ " 'Cookie:cookieName=cookieVal'"))));
this.webTestClient.get().uri("/").cookie("cookieName", "cookieVal").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"))
.has(content(codeBlock(TemplateFormats.asciidoctor(), "bash")
.withContent(String.format("$ http GET 'https://api.example.com/' \\%n"
+ " 'Accept:application/json' \\%n" + " 'Cookie:cookieName=cookieVal'"))));
}
private void assertExpectedSnippetFilesExist(File directory, String... snippets) {
Set<File> actual = new HashSet<>(Arrays.asList(directory.listFiles()));
Set<File> expected = Stream.of(snippets)
.map((snippet) -> new File(directory, snippet))
Set<File> expected = Stream.of(snippets).map((snippet) -> new File(directory, snippet))
.collect(Collectors.toSet());
assertThat(actual).isEqualTo(expected);
}
@@ -213,9 +186,8 @@ public class WebTestClientRestDocumentationIntegrationTests {
@Override
public boolean matches(File value) {
try {
return delegate
.matches(FileCopyUtils.copyToString(new InputStreamReader(
new FileInputStream(value), StandardCharsets.UTF_8)));
return delegate.matches(FileCopyUtils
.copyToString(new InputStreamReader(new FileInputStream(value), StandardCharsets.UTF_8)));
}
catch (IOException ex) {
fail("Failed to read '" + value + "'", ex);
@@ -238,15 +210,14 @@ public class WebTestClientRestDocumentationIntegrationTests {
return SnippetConditions.tableWithHeader(format, headers);
}
private TableCondition<?> tableWithTitleAndHeader(TemplateFormat format, String title,
String... headers) {
private TableCondition<?> tableWithTitleAndHeader(TemplateFormat format, String title, String... headers) {
return SnippetConditions.tableWithTitleAndHeader(format, title, headers);
}
/**
* A person.
*/
static class Person {
public static class Person {
private final String firstName;