Browse Source

Polish

pull/1102/merge
Brian Clozel 7 years ago
parent
commit
aa19912e00
  1. 401
      spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java

401
spring-webflux/src/test/java/org/springframework/web/reactive/function/client/WebClientIntegrationTests.java

@ -19,13 +19,13 @@ package org.springframework.web.reactive.function.client; @@ -19,13 +19,13 @@ package org.springframework.web.reactive.function.client;
import java.time.Duration;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import okhttp3.mockwebserver.RecordedRequest;
import org.hamcrest.Matchers;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import reactor.core.publisher.Flux;
@ -39,7 +39,9 @@ import org.springframework.http.MediaType; @@ -39,7 +39,9 @@ import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.http.codec.Pojo;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* Integration tests using a {@link ExchangeFunction} through {@link WebClient}.
@ -56,8 +58,7 @@ public class WebClientIntegrationTests { @@ -56,8 +58,7 @@ public class WebClientIntegrationTests {
@Before
public void setup() {
this.server = new MockWebServer();
String baseUrl = this.server.url("/").toString();
this.webClient = WebClient.create(baseUrl);
this.webClient = WebClient.create(this.server.url("/").toString());
}
@After
@ -65,17 +66,12 @@ public class WebClientIntegrationTests { @@ -65,17 +66,12 @@ public class WebClientIntegrationTests {
this.server.shutdown();
}
@Test
public void headers() throws Exception {
this.server.enqueue(new MockResponse().setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
public void shouldReceiveResponseHeaders() throws Exception {
prepareResponse(response -> response
.setHeader("Content-Type", "text/plain")
.setBody("Hello Spring!"));
this.webClient.get().uri("/test")
.exchange()
.map(response -> {
response.close();
return response.statusCode();
});
Mono<HttpHeaders> result = this.webClient.get()
.uri("/greeting?name=Spring")
.exchange()
@ -87,18 +83,18 @@ public class WebClientIntegrationTests { @@ -87,18 +83,18 @@ public class WebClientIntegrationTests {
assertEquals(MediaType.TEXT_PLAIN, httpHeaders.getContentType());
assertEquals(13L, httpHeaders.getContentLength());
})
.expectComplete()
.verify(Duration.ofSeconds(3));
.expectComplete().verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("*/*", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("/greeting?name=Spring", recordedRequest.getPath());
expectRequestCount(1);
expectRequest(request -> {
assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("/greeting?name=Spring", request.getPath());
});
}
@Test
public void plainText() throws Exception {
this.server.enqueue(new MockResponse().setBody("Hello Spring!"));
public void shouldReceivePlainText() throws Exception {
prepareResponse(response -> response.setBody("Hello Spring!"));
Mono<String> result = this.webClient.get()
.uri("/greeting?name=Spring")
@ -108,94 +104,69 @@ public class WebClientIntegrationTests { @@ -108,94 +104,69 @@ public class WebClientIntegrationTests {
StepVerifier.create(result)
.expectNext("Hello Spring!")
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("testvalue", recordedRequest.getHeader("X-Test-Header"));
Assert.assertEquals("*/*", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("/greeting?name=Spring", recordedRequest.getPath());
}
@Test
public void jsonString() throws Exception {
String content = "{\"bar\":\"barbar\",\"foo\":\"foofoo\"}";
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
.setBody(content));
Mono<String> result = this.webClient.get()
.uri("/json")
.accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.bodyToMono(String.class));
StepVerifier.create(result)
.expectNext(content)
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/json", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
.expectComplete().verify(Duration.ofSeconds(3));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("testvalue", request.getHeader("X-Test-Header"));
assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("/greeting?name=Spring", request.getPath());
});
}
@Test
public void jsonStringRetrieveMono() throws Exception {
public void shouldReceiveJsonAsString() throws Exception {
String content = "{\"bar\":\"barbar\",\"foo\":\"foofoo\"}";
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
.setBody(content));
prepareResponse(response -> response
.setHeader("Content-Type", "application/json").setBody(content));
Mono<String> result = this.webClient.get()
.uri("/json")
.accept(MediaType.APPLICATION_JSON)
.uri("/json").accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(String.class);
StepVerifier.create(result)
.expectNext(content)
.expectComplete()
.verify(Duration.ofSeconds(3));
.expectComplete().verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/json", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/json", request.getPath());
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
});
}
@Test
public void jsonStringRetrieveMonoTypeReference() throws Exception {
public void shouldReceiveJsonAsTypeReferenceString() throws Exception {
String content = "{\"bar\":\"barbar\",\"foo\":\"foofoo\"}";
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
.setBody(content));
prepareResponse(response -> response
.setHeader("Content-Type", "application/json").setBody(content));
Mono<String> result = this.webClient.get()
.uri("/json")
.accept(MediaType.APPLICATION_JSON)
.uri("/json").accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<String>() {});
.bodyToMono(new ParameterizedTypeReference<String>() {
});
StepVerifier.create(result)
.expectNext(content)
.expectComplete()
.verify(Duration.ofSeconds(3));
.expectComplete().verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/json", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/json", request.getPath());
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
});
}
@Test
public void jsonStringExchangeEntity() throws Exception {
public void shouldReceiveJsonAsResponseEntityString() throws Exception {
String content = "{\"bar\":\"barbar\",\"foo\":\"foofoo\"}";
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
.setBody(content));
prepareResponse(response -> response
.setHeader("Content-Type", "application/json").setBody(content));
Mono<ResponseEntity<String>> result = this.webClient.get()
.uri("/json")
.accept(MediaType.APPLICATION_JSON)
.uri("/json").accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.toEntity(String.class));
@ -206,23 +177,23 @@ public class WebClientIntegrationTests { @@ -206,23 +177,23 @@ public class WebClientIntegrationTests {
assertEquals(31, entity.getHeaders().getContentLength());
assertEquals(content, entity.getBody());
})
.expectComplete()
.verify(Duration.ofSeconds(3));
.expectComplete().verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/json", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/json", request.getPath());
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
});
}
@Test
public void jsonStringExchangeEntityList() throws Exception {
public void shouldReceiveJsonAsResponseEntityList() throws Exception {
String content = "[{\"bar\":\"bar1\",\"foo\":\"foo1\"}, {\"bar\":\"bar2\",\"foo\":\"foo2\"}]";
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json").setBody(content));
prepareResponse(response -> response
.setHeader("Content-Type", "application/json").setBody(content));
Mono<ResponseEntity<List<Pojo>>> result = this.webClient.get()
.uri("/json")
.accept(MediaType.APPLICATION_JSON)
.uri("/json").accept(MediaType.APPLICATION_JSON)
.exchange()
.flatMap(response -> response.toEntityList(Pojo.class));
@ -235,64 +206,41 @@ public class WebClientIntegrationTests { @@ -235,64 +206,41 @@ public class WebClientIntegrationTests {
Pojo pojo2 = new Pojo("foo2", "bar2");
assertEquals(Arrays.asList(pojo1, pojo2), entity.getBody());
})
.expectComplete()
.verify(Duration.ofSeconds(3));
.expectComplete().verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/json", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/json", request.getPath());
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
});
}
@Test
public void jsonStringRetrieveFlux() throws Exception {
public void shouldReceiveJsonAsFluxString() throws Exception {
String content = "{\"bar\":\"barbar\",\"foo\":\"foofoo\"}";
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
.setBody(content));
prepareResponse(response -> response
.setHeader("Content-Type", "application/json").setBody(content));
Flux<String> result = this.webClient.get()
.uri("/json")
.accept(MediaType.APPLICATION_JSON)
.uri("/json").accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToFlux(String.class);
StepVerifier.create(result)
.expectNext(content)
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/json", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
}
@Test
public void jsonStringRetrieveFluxTypeReference() throws Exception {
String content = "{\"bar\":\"barbar\",\"foo\":\"foofoo\"}";
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
.setBody(content));
Flux<String> result = this.webClient.get()
.uri("/json")
.accept(MediaType.APPLICATION_JSON)
.retrieve()
.bodyToFlux(new ParameterizedTypeReference<String>() {});
StepVerifier.create(result)
.expectNext(content)
.expectComplete()
.verify(Duration.ofSeconds(3));
.expectComplete().verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/json", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/json", request.getPath());
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
});
}
@Test
public void jsonPojoMono() throws Exception {
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
public void shouldReceiveJsonAsPojo() throws Exception {
prepareResponse(response -> response
.setHeader("Content-Type", "application/json")
.setBody("{\"bar\":\"barbar\",\"foo\":\"foofoo\"}"));
Mono<Pojo> result = this.webClient.get()
@ -306,15 +254,17 @@ public class WebClientIntegrationTests { @@ -306,15 +254,17 @@ public class WebClientIntegrationTests {
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/pojo", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/pojo", request.getPath());
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
});
}
@Test
public void jsonPojoFlux() throws Exception {
this.server.enqueue(new MockResponse().setHeader("Content-Type", "application/json")
public void shouldReceiveJsonAsFluxPojo() throws Exception {
prepareResponse(response -> response
.setHeader("Content-Type", "application/json")
.setBody("[{\"bar\":\"bar1\",\"foo\":\"foo1\"},{\"bar\":\"bar2\",\"foo\":\"foo2\"}]"));
Flux<Pojo> result = this.webClient.get()
@ -329,16 +279,16 @@ public class WebClientIntegrationTests { @@ -329,16 +279,16 @@ public class WebClientIntegrationTests {
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/pojos", recordedRequest.getPath());
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/pojos", request.getPath());
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
});
}
@Test
public void postJsonPojo() throws Exception {
this.server.enqueue(new MockResponse()
.setHeader("Content-Type", "application/json")
public void shouldSendPojoAsJson() throws Exception {
prepareResponse(response -> response.setHeader("Content-Type", "application/json")
.setBody("{\"bar\":\"BARBAR\",\"foo\":\"FOOFOO\"}"));
Mono<Pojo> result = this.webClient.post()
@ -354,18 +304,19 @@ public class WebClientIntegrationTests { @@ -354,18 +304,19 @@ public class WebClientIntegrationTests {
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/pojo/capitalize", recordedRequest.getPath());
Assert.assertEquals("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}", recordedRequest.getBody().readUtf8());
Assert.assertEquals("chunked", recordedRequest.getHeader(HttpHeaders.TRANSFER_ENCODING));
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("application/json", recordedRequest.getHeader(HttpHeaders.CONTENT_TYPE));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/pojo/capitalize", request.getPath());
assertEquals("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}", request.getBody().readUtf8());
assertEquals("chunked", request.getHeader(HttpHeaders.TRANSFER_ENCODING));
assertEquals("application/json", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("application/json", request.getHeader(HttpHeaders.CONTENT_TYPE));
});
}
@Test
public void cookies() throws Exception {
this.server.enqueue(new MockResponse()
public void shouldSendCookies() throws Exception {
prepareResponse(response -> response
.setHeader("Content-Type", "text/plain").setBody("test"));
Mono<String> result = this.webClient.get()
@ -379,15 +330,16 @@ public class WebClientIntegrationTests { @@ -379,15 +330,16 @@ public class WebClientIntegrationTests {
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("/test", recordedRequest.getPath());
Assert.assertEquals("testkey=testvalue", recordedRequest.getHeader(HttpHeaders.COOKIE));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("/test", request.getPath());
assertEquals("testkey=testvalue", request.getHeader(HttpHeaders.COOKIE));
});
}
@Test
public void exchangeNotFound() throws Exception {
this.server.enqueue(new MockResponse().setResponseCode(404)
public void shouldReceive404Response() throws Exception {
prepareResponse(response -> response.setResponseCode(404)
.setHeader("Content-Type", "text/plain").setBody("Not Found"));
Mono<ClientResponse> result = this.webClient.get().uri("/greeting?name=Spring").exchange();
@ -397,15 +349,16 @@ public class WebClientIntegrationTests { @@ -397,15 +349,16 @@ public class WebClientIntegrationTests {
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("*/*", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("/greeting?name=Spring", recordedRequest.getPath());
expectRequestCount(1);
expectRequest(request -> {
assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("/greeting?name=Spring", request.getPath());
});
}
@Test
public void retrieveBodyToMonoNotFound() throws Exception {
this.server.enqueue(new MockResponse().setResponseCode(404)
public void shouldGetErrorSignalOn404() throws Exception {
prepareResponse(response -> response.setResponseCode(404)
.setHeader("Content-Type", "text/plain").setBody("Not Found"));
Mono<String> result = this.webClient.get()
@ -417,16 +370,17 @@ public class WebClientIntegrationTests { @@ -417,16 +370,17 @@ public class WebClientIntegrationTests {
.expectError(WebClientException.class)
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("*/*", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("/greeting?name=Spring", recordedRequest.getPath());
expectRequestCount(1);
expectRequest(request -> {
assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("/greeting?name=Spring", request.getPath());
});
}
@Test
public void retrieveBodyToMonoInternalServerError() throws Exception {
public void shouldGetInternalServerErrorSignal() throws Exception {
String errorMessage = "Internal Server error";
this.server.enqueue(new MockResponse().setResponseCode(500)
prepareResponse(response -> response.setResponseCode(500)
.setHeader("Content-Type", "text/plain").setBody(errorMessage));
Mono<String> result = this.webClient.get()
@ -438,22 +392,22 @@ public class WebClientIntegrationTests { @@ -438,22 +392,22 @@ public class WebClientIntegrationTests {
.expectErrorSatisfies(throwable -> {
assertTrue(throwable instanceof WebClientResponseException);
WebClientResponseException ex = (WebClientResponseException) throwable;
assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, ex.getStatusCode());
assertEquals(MediaType.TEXT_PLAIN, ex.getHeaders().getContentType());
assertEquals(errorMessage, ex.getResponseBodyAsString());
})
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("*/*", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("/greeting?name=Spring", recordedRequest.getPath());
expectRequestCount(1);
expectRequest(request -> {
assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("/greeting?name=Spring", request.getPath());
});
}
@Test
public void retrieveBodyToCustomStatusHandler() throws Exception {
this.server.enqueue(new MockResponse().setResponseCode(500)
public void shouldApplyCustomStatusHandler() throws Exception {
prepareResponse(response -> response.setResponseCode(500)
.setHeader("Content-Type", "text/plain").setBody("Internal Server error"));
Mono<String> result = this.webClient.get()
@ -466,15 +420,16 @@ public class WebClientIntegrationTests { @@ -466,15 +420,16 @@ public class WebClientIntegrationTests {
.expectError(MyException.class)
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("*/*", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("/greeting?name=Spring", recordedRequest.getPath());
expectRequestCount(1);
expectRequest(request -> {
assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("/greeting?name=Spring", request.getPath());
});
}
@Test
public void exchangeToEntityNotFound() throws Exception {
this.server.enqueue(new MockResponse().setResponseCode(404)
public void shouldReceiveNotFoundEntity() throws Exception {
prepareResponse(response -> response.setResponseCode(404)
.setHeader("Content-Type", "text/plain").setBody("Not Found"));
Mono<ResponseEntity<String>> result = this.webClient.get()
@ -487,15 +442,16 @@ public class WebClientIntegrationTests { @@ -487,15 +442,16 @@ public class WebClientIntegrationTests {
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("*/*", recordedRequest.getHeader(HttpHeaders.ACCEPT));
Assert.assertEquals("/greeting?name=Spring", recordedRequest.getPath());
expectRequestCount(1);
expectRequest(request -> {
assertEquals("*/*", request.getHeader(HttpHeaders.ACCEPT));
assertEquals("/greeting?name=Spring", request.getPath());
});
}
@Test
public void filter() throws Exception {
this.server.enqueue(new MockResponse().setHeader("Content-Type", "text/plain")
public void shouldApplyExchangeFilter() throws Exception {
prepareResponse(response -> response.setHeader("Content-Type", "text/plain")
.setBody("Hello Spring!"));
WebClient filteredClient = this.webClient.mutate()
@ -516,29 +472,29 @@ public class WebClientIntegrationTests { @@ -516,29 +472,29 @@ public class WebClientIntegrationTests {
.expectComplete()
.verify(Duration.ofSeconds(3));
RecordedRequest recordedRequest = server.takeRequest();
Assert.assertEquals(1, server.getRequestCount());
Assert.assertEquals("bar", recordedRequest.getHeader("foo"));
expectRequestCount(1);
expectRequest(request -> {
assertEquals("bar", request.getHeader("foo"));
});
}
@Test
public void errorHandlingFilter() throws Exception {
public void shouldApplyErrorHandlingFilter() throws Exception {
ExchangeFilterFunction filter = ExchangeFilterFunction.ofResponseProcessor(
clientResponse -> {
List<String> headerValues = clientResponse.headers().header("Foo");
return headerValues.isEmpty() ? Mono.error(
new MyException("Response does not contain Foo header")) :
Mono.just(clientResponse);
}
);
clientResponse -> {
List<String> headerValues = clientResponse.headers().header("Foo");
return headerValues.isEmpty() ? Mono.error(
new MyException("Response does not contain Foo header")) :
Mono.just(clientResponse);
}
);
WebClient filteredClient = this.webClient.mutate()
.filter(filter)
.build();
WebClient filteredClient = this.webClient.mutate().filter(filter).build();
// header not present
this.server.enqueue(new MockResponse().setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
prepareResponse(response -> response
.setHeader("Content-Type", "text/plain").setBody("Hello Spring!"));
Mono<String> result = filteredClient.get()
.uri("/greeting?name=Spring")
@ -546,31 +502,28 @@ public class WebClientIntegrationTests { @@ -546,31 +502,28 @@ public class WebClientIntegrationTests {
.bodyToMono(String.class);
StepVerifier.create(result)
.expectError(MyException.class)
.verify(Duration.ofSeconds(3));
.expectError(MyException.class).verify(Duration.ofSeconds(3));
// header present
this.server.enqueue(new MockResponse().setHeader("Content-Type", "text/plain")
prepareResponse(response -> response.setHeader("Content-Type", "text/plain")
.setHeader("Foo", "Bar")
.setBody("Hello Spring!"));
result = filteredClient.get()
.uri("/greeting?name=Spring")
.retrieve()
.bodyToMono(String.class);
.retrieve().bodyToMono(String.class);
StepVerifier.create(result)
.expectNext("Hello Spring!")
.expectComplete()
.verify(Duration.ofSeconds(3));
.expectComplete().verify(Duration.ofSeconds(3));
Assert.assertEquals(2, server.getRequestCount());
expectRequestCount(2);
}
@Test
public void exchangeNoContent() throws Exception {
this.server.enqueue(new MockResponse().setHeader("Content-Length", "0"));
public void shouldReceiveEmptyResponse() throws Exception {
prepareResponse(response -> response.setHeader("Content-Length", "0"));
Mono<ClientResponse> result = this.webClient.get()
.uri("/noContent")
@ -583,7 +536,7 @@ public class WebClientIntegrationTests { @@ -583,7 +536,7 @@ public class WebClientIntegrationTests {
}
@Test // SPR-15782
public void absoluteUri() throws Exception {
public void shouldFailWithRelativeUrls() throws Exception {
String uri = "/api/v4/groups/1";
Mono<ClientResponse> responseMono = WebClient.builder().build().get().uri(uri).exchange();
@ -592,6 +545,20 @@ public class WebClientIntegrationTests { @@ -592,6 +545,20 @@ public class WebClientIntegrationTests {
.verify(Duration.ofSeconds(5));
}
private void prepareResponse(Consumer<MockResponse> consumer) {
MockResponse response = new MockResponse();
consumer.accept(response);
this.server.enqueue(response);
}
private void expectRequest(Consumer<RecordedRequest> consumer) throws InterruptedException {
consumer.accept(this.server.takeRequest());
}
private void expectRequestCount(int count) {
assertEquals(count, this.server.getRequestCount());
}
@SuppressWarnings("serial")
private static class MyException extends RuntimeException {

Loading…
Cancel
Save