Browse Source

MockClientHttpRequest|Response support cookie headers

Issue: SPR-16124
pull/1581/head
Rossen Stoyanchev 8 years ago
parent
commit
579328bd7a
  1. 4
      spring-test/src/main/java/org/springframework/mock/http/client/reactive/MockClientHttpRequest.java
  2. 8
      spring-test/src/main/java/org/springframework/mock/http/client/reactive/MockClientHttpResponse.java
  3. 6
      spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java
  4. 10
      spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java
  5. 56
      spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerTests.java
  6. 4
      spring-web/src/test/java/org/springframework/mock/http/client/reactive/test/MockClientHttpRequest.java
  7. 6
      spring-web/src/test/java/org/springframework/mock/http/client/reactive/test/MockClientHttpResponse.java
  8. 6
      spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpRequest.java

4
spring-test/src/main/java/org/springframework/mock/http/client/reactive/MockClientHttpRequest.java

@ -17,6 +17,7 @@
package org.springframework.mock.http.client.reactive; package org.springframework.mock.http.client.reactive;
import java.net.URI; import java.net.URI;
import java.util.Collection;
import java.util.function.Function; import java.util.function.Function;
import org.reactivestreams.Publisher; import org.reactivestreams.Publisher;
@ -26,6 +27,7 @@ import reactor.core.publisher.Mono;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.http.client.reactive.AbstractClientHttpRequest; import org.springframework.http.client.reactive.AbstractClientHttpRequest;
import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.http.client.reactive.ClientHttpRequest;
@ -114,6 +116,8 @@ public class MockClientHttpRequest extends AbstractClientHttpRequest {
@Override @Override
protected void applyCookies() { protected void applyCookies() {
getCookies().values().stream().flatMap(Collection::stream)
.forEach(cookie -> getHeaders().add(HttpHeaders.COOKIE, cookie.toString()));
} }
@Override @Override

8
spring-test/src/main/java/org/springframework/mock/http/client/reactive/MockClientHttpResponse.java

@ -19,6 +19,7 @@ package org.springframework.mock.http.client.reactive;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Collection;
import org.reactivestreams.Publisher; import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
@ -62,15 +63,22 @@ public class MockClientHttpResponse implements ClientHttpResponse {
} }
@Override
public HttpStatus getStatusCode() { public HttpStatus getStatusCode() {
return this.status; return this.status;
} }
@Override @Override
public HttpHeaders getHeaders() { public HttpHeaders getHeaders() {
String headerName = HttpHeaders.SET_COOKIE;
if (!getCookies().isEmpty() && this.headers.get(headerName) == null) {
getCookies().values().stream().flatMap(Collection::stream)
.forEach(cookie -> getHeaders().add(headerName, cookie.toString()));
}
return this.headers; return this.headers;
} }
@Override
public MultiValueMap<String, ResponseCookie> getCookies() { public MultiValueMap<String, ResponseCookie> getCookies() {
return this.cookies; return this.cookies;
} }

6
spring-test/src/main/java/org/springframework/mock/http/server/reactive/MockServerHttpRequest.java

@ -480,15 +480,17 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
@Override @Override
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) { public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
applyCookies(); applyCookiesIfNecessary();
return new MockServerHttpRequest(this.method, this.url, this.contextPath, return new MockServerHttpRequest(this.method, this.url, this.contextPath,
this.headers, this.cookies, this.remoteAddress, body); this.headers, this.cookies, this.remoteAddress, body);
} }
private void applyCookies() { private void applyCookiesIfNecessary() {
if (this.headers.get(HttpHeaders.COOKIE) == null) {
this.cookies.values().stream().flatMap(Collection::stream) this.cookies.values().stream().flatMap(Collection::stream)
.forEach(cookie -> this.headers.add(HttpHeaders.COOKIE, cookie.toString())); .forEach(cookie -> this.headers.add(HttpHeaders.COOKIE, cookie.toString()));
} }
} }
}
} }

10
spring-test/src/test/java/org/springframework/test/web/reactive/server/HttpHandlerConnectorTests.java

@ -19,6 +19,7 @@ package org.springframework.test.web.reactive.server;
import java.net.URI; import java.net.URI;
import java.time.Duration; import java.time.Duration;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.function.Function; import java.util.function.Function;
import org.junit.Test; import org.junit.Test;
@ -28,6 +29,7 @@ import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.core.io.buffer.support.DataBufferTestUtils; import org.springframework.core.io.buffer.support.DataBufferTestUtils;
import org.springframework.http.HttpCookie; import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ReactiveHttpOutputMessage; import org.springframework.http.ReactiveHttpOutputMessage;
@ -69,8 +71,10 @@ public class HttpHandlerConnectorTests {
assertEquals(HttpMethod.POST, request.getMethod()); assertEquals(HttpMethod.POST, request.getMethod());
assertEquals("/custom-path", request.getURI().toString()); assertEquals("/custom-path", request.getURI().toString());
assertEquals(Arrays.asList("h0", "h1"), request.getHeaders().get("custom-header")); HttpHeaders headers = request.getHeaders();
assertEquals(Arrays.asList("h0", "h1"), headers.get("custom-header"));
assertEquals(new HttpCookie("custom-cookie", "c0"), request.getCookies().getFirst("custom-cookie")); assertEquals(new HttpCookie("custom-cookie", "c0"), request.getCookies().getFirst("custom-cookie"));
assertEquals(Collections.singletonList("custom-cookie=c0"), headers.get(HttpHeaders.COOKIE));
DataBuffer buffer = request.getBody().blockFirst(Duration.ZERO); DataBuffer buffer = request.getBody().blockFirst(Duration.ZERO);
assertEquals("Custom body", DataBufferTestUtils.dumpString(buffer, UTF_8)); assertEquals("Custom body", DataBufferTestUtils.dumpString(buffer, UTF_8));
@ -93,8 +97,10 @@ public class HttpHandlerConnectorTests {
.block(Duration.ofSeconds(5)); .block(Duration.ofSeconds(5));
assertEquals(HttpStatus.OK, response.getStatusCode()); assertEquals(HttpStatus.OK, response.getStatusCode());
assertEquals(Arrays.asList("h0", "h1"), response.getHeaders().get("custom-header")); HttpHeaders headers = response.getHeaders();
assertEquals(Arrays.asList("h0", "h1"), headers.get("custom-header"));
assertEquals(cookie, response.getCookies().getFirst("custom-cookie")); assertEquals(cookie, response.getCookies().getFirst("custom-cookie"));
assertEquals(Collections.singletonList("custom-cookie=c0"), headers.get(HttpHeaders.SET_COOKIE));
DataBuffer buffer = response.getBody().blockFirst(Duration.ZERO); DataBuffer buffer = response.getBody().blockFirst(Duration.ZERO);
assertEquals("Custom body", DataBufferTestUtils.dumpString(buffer, UTF_8)); assertEquals("Custom body", DataBufferTestUtils.dumpString(buffer, UTF_8));

56
spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerIntegrationTests.java → spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerTests.java

@ -15,28 +15,33 @@
*/ */
package org.springframework.test.web.reactive.server; package org.springframework.test.web.reactive.server;
import java.util.Arrays;
import org.junit.Test; import org.junit.Test;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseCookie; import org.springframework.http.ResponseCookie;
import org.springframework.web.server.WebHandler; import org.springframework.http.server.reactive.ServerHttpResponse;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.Assert.*; import static org.junit.Assert.assertEquals;
/** /**
* Mock server integration test scenarios. * Test scenarios involving a mock server.
* @author Rossen Stoyanchev * @author Rossen Stoyanchev
*/ */
public class MockServerIntegrationTests { public class MockServerTests {
@Test @Test // SPR-15674 (in comments)
public void sameSessionInstanceAfterMutate() throws Exception { public void mutateDoesNotCreateNewSession() throws Exception {
WebHandler webHandler = exchange -> { WebTestClient client = WebTestClient
.bindToWebHandler(exchange -> {
if (exchange.getRequest().getURI().getPath().equals("/set")) { if (exchange.getRequest().getURI().getPath().equals("/set")) {
return exchange.getSession() return exchange.getSession()
.doOnNext(session -> session.getAttributes().put("foo", "bar")) .doOnNext(session -> session.getAttributes().put("foo", "bar"))
@ -51,9 +56,8 @@ public class MockServerIntegrationTests {
return exchange.getResponse().writeWith(Mono.just(buffer)); return exchange.getResponse().writeWith(Mono.just(buffer));
}); });
} }
}; })
.build();
WebTestClient client = new DefaultMockServerSpec(webHandler).configureClient().build();
// Set the session attribute // Set the session attribute
EntityExchangeResult<Void> result = client.get().uri("/set").exchange() EntityExchangeResult<Void> result = client.get().uri("/set").exchange()
@ -69,10 +73,13 @@ public class MockServerIntegrationTests {
.expectBody(String.class).isEqualTo("bar"); .expectBody(String.class).isEqualTo("bar");
} }
@Test @Test // SPR-16059
public void mutateDoesCopy() throws Exception { public void mutateDoesCopy() throws Exception {
WebTestClient.Builder builder = WebTestClient.bindToWebHandler(exchange -> exchange.getResponse().setComplete()).configureClient(); WebTestClient.Builder builder = WebTestClient
.bindToWebHandler(exchange -> exchange.getResponse().setComplete())
.configureClient();
builder.filter((request, next) -> next.exchange(request)); builder.filter((request, next) -> next.exchange(request));
builder.defaultHeader("foo", "bar"); builder.defaultHeader("foo", "bar");
builder.defaultCookie("foo", "bar"); builder.defaultCookie("foo", "bar");
@ -103,5 +110,30 @@ public class MockServerIntegrationTests {
clientFromMutatedBuilder.mutate().defaultCookies(cookies -> assertEquals(2, cookies.size())); clientFromMutatedBuilder.mutate().defaultCookies(cookies -> assertEquals(2, cookies.size()));
} }
@Test // SPR-16124
public void exchangeResultHasCookieHeaders() throws Exception {
ExchangeResult result = WebTestClient
.bindToWebHandler(exchange -> {
ServerHttpResponse response = exchange.getResponse();
if (exchange.getRequest().getURI().getPath().equals("/cookie")) {
response.addCookie(ResponseCookie.from("a", "alpha").path("/pathA").build());
response.addCookie(ResponseCookie.from("b", "beta").path("/pathB").build());
}
else {
response.setStatusCode(HttpStatus.NOT_FOUND);
}
return response.setComplete();
})
.build()
.get().uri("/cookie").cookie("a", "alpha").cookie("b", "beta")
.exchange()
.expectStatus().isOk()
.expectHeader().valueEquals(HttpHeaders.SET_COOKIE, "a=alpha; Path=/pathA", "b=beta; Path=/pathB")
.expectBody().isEmpty();
assertEquals(Arrays.asList("a=alpha", "b=beta"),
result.getRequestHeaders().get(HttpHeaders.COOKIE));
}
} }

4
spring-web/src/test/java/org/springframework/mock/http/client/reactive/test/MockClientHttpRequest.java

@ -17,6 +17,7 @@
package org.springframework.mock.http.client.reactive.test; package org.springframework.mock.http.client.reactive.test;
import java.net.URI; import java.net.URI;
import java.util.Collection;
import java.util.function.Function; import java.util.function.Function;
import org.reactivestreams.Publisher; import org.reactivestreams.Publisher;
@ -26,6 +27,7 @@ import reactor.core.publisher.Mono;
import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DataBufferFactory; import org.springframework.core.io.buffer.DataBufferFactory;
import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod; import org.springframework.http.HttpMethod;
import org.springframework.http.client.reactive.AbstractClientHttpRequest; import org.springframework.http.client.reactive.AbstractClientHttpRequest;
import org.springframework.http.client.reactive.ClientHttpRequest; import org.springframework.http.client.reactive.ClientHttpRequest;
@ -114,6 +116,8 @@ public class MockClientHttpRequest extends AbstractClientHttpRequest {
@Override @Override
protected void applyCookies() { protected void applyCookies() {
getCookies().values().stream().flatMap(Collection::stream)
.forEach(cookie -> getHeaders().add(HttpHeaders.COOKIE, cookie.toString()));
} }
@Override @Override

6
spring-web/src/test/java/org/springframework/mock/http/client/reactive/test/MockClientHttpResponse.java

@ -19,6 +19,7 @@ package org.springframework.mock.http.client.reactive.test;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Collection;
import org.reactivestreams.Publisher; import org.reactivestreams.Publisher;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
@ -69,6 +70,11 @@ public class MockClientHttpResponse implements ClientHttpResponse {
@Override @Override
public HttpHeaders getHeaders() { public HttpHeaders getHeaders() {
String headerName = HttpHeaders.SET_COOKIE;
if (!getCookies().isEmpty() && this.headers.get(headerName) == null) {
getCookies().values().stream().flatMap(Collection::stream)
.forEach(cookie -> getHeaders().add(headerName, cookie.toString()));
}
return this.headers; return this.headers;
} }

6
spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpRequest.java

@ -480,15 +480,17 @@ public class MockServerHttpRequest extends AbstractServerHttpRequest {
@Override @Override
public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) { public MockServerHttpRequest body(Publisher<? extends DataBuffer> body) {
applyCookies(); applyCookiesIfNecessary();
return new MockServerHttpRequest(this.method, this.url, this.contextPath, return new MockServerHttpRequest(this.method, this.url, this.contextPath,
this.headers, this.cookies, this.remoteAddress, body); this.headers, this.cookies, this.remoteAddress, body);
} }
private void applyCookies() { private void applyCookiesIfNecessary() {
if (this.headers.get(HttpHeaders.COOKIE) == null) {
this.cookies.values().stream().flatMap(Collection::stream) this.cookies.values().stream().flatMap(Collection::stream)
.forEach(cookie -> this.headers.add(HttpHeaders.COOKIE, cookie.toString())); .forEach(cookie -> this.headers.add(HttpHeaders.COOKIE, cookie.toString()));
} }
} }
}
} }
Loading…
Cancel
Save