Browse Source

Make SslInfo nullable

This allows autowiring a MockServerSpec in test class and using a different
identity or none at all with each test.

Polishing in MockServerSpecTests.

See gh-35042
pull/35163/head
rstoyanchev 9 months ago
parent
commit
1b30b469c4
  1. 4
      spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java
  2. 6
      spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java
  3. 65
      spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerSpecTests.java

4
spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java

@ -71,8 +71,8 @@ abstract class AbstractMockServerSpec<B extends WebTestClient.MockServerSpec<B>> @@ -71,8 +71,8 @@ abstract class AbstractMockServerSpec<B extends WebTestClient.MockServerSpec<B>>
}
@Override
public <T extends B> T sslInfo(SslInfo sslInfo) {
this.sslInfo = sslInfo;
public <T extends B> T sslInfo(@Nullable SslInfo info) {
this.sslInfo = info;
return self();
}

6
spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java

@ -277,13 +277,13 @@ public interface WebTestClient { @@ -277,13 +277,13 @@ public interface WebTestClient {
<T extends B> T webSessionManager(WebSessionManager sessionManager);
/**
* Provide SSL session information and certificates for the mock server.
* @param sslInfo the {@link SslInfo} to use
* Set or reset SSL session information to assign to mock server requests.
* @param info the {@link SslInfo} to use
* @since 7.0
* @see SslInfo#from(String)
* @see SslInfo#from(String, java.security.cert.X509Certificate...)
*/
<T extends B> T sslInfo(SslInfo sslInfo);
<T extends B> T sslInfo(@Nullable SslInfo info);
/**
* Shortcut for pre-packaged customizations to the mock server setup.

65
spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerSpecTests.java

@ -18,11 +18,13 @@ package org.springframework.test.web.reactive.server; @@ -18,11 +18,13 @@ package org.springframework.test.web.reactive.server;
import java.nio.charset.StandardCharsets;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
import org.springframework.http.server.reactive.SslInfo;
import org.springframework.web.server.ServerWebExchange;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
@ -32,7 +34,6 @@ import static org.assertj.core.api.Assertions.assertThat; @@ -32,7 +34,6 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* Tests for {@link AbstractMockServerSpec}.
*
* @author Rossen Stoyanchev
*/
public class MockServerSpecTests {
@ -43,30 +44,31 @@ public class MockServerSpecTests { @@ -43,30 +44,31 @@ public class MockServerSpecTests {
@Test
public void applyFiltersAfterConfigurerAdded() {
this.serverSpec.webFilter(new TestWebFilter("A"));
this.serverSpec.apply(new MockServerConfigurer() {
MockServerConfigurer configurer = new MockServerConfigurer() {
@Override
public void afterConfigureAdded(WebTestClient.MockServerSpec<?> spec) {
spec.webFilter(new TestWebFilter("B"));
}
});
};
this.serverSpec.build().get().uri("/")
this.serverSpec
.webFilter(new TestWebFilter("A"))
.apply(configurer)
.build()
.get().uri("/")
.exchange()
.expectBody(String.class)
.consumeWith(result -> assertThat(
result.getResponseBody()).contains("test-attribute=:A:B"));
.consumeWith(result -> {
String body = result.getResponseBody();
assertThat(body).contains("test-attribute=:A:B");
});
}
@Test
public void applyFiltersBeforeServerCreated() {
this.serverSpec.webFilter(new TestWebFilter("App-A"));
this.serverSpec.webFilter(new TestWebFilter("App-B"));
this.serverSpec.apply(new MockServerConfigurer() {
MockServerConfigurer configurer = new MockServerConfigurer() {
@Override
public void beforeServerCreated(WebHttpHandlerBuilder builder) {
@ -75,21 +77,41 @@ public class MockServerSpecTests { @@ -75,21 +77,41 @@ public class MockServerSpecTests {
filters.add(1, new TestWebFilter("Fwk-B"));
});
}
});
this.serverSpec.build().get().uri("/")
.exchange()
};
this.serverSpec
.webFilter(new TestWebFilter("App-A"))
.webFilter(new TestWebFilter("App-B"))
.apply(configurer)
.build()
.get().uri("/").exchange()
.expectBody(String.class)
.consumeWith(result -> assertThat(
result.getResponseBody()).contains("test-attribute=:Fwk-A:Fwk-B:App-A:App-B"));
.consumeWith(result -> {
String body = result.getResponseBody();
assertThat(body).contains("test-attribute=:Fwk-A:Fwk-B:App-A:App-B");
});
}
@Test
void sslInfo() {
SslInfo info = SslInfo.from("123");
this.serverSpec.sslInfo(info).build().get().uri("/").exchange().expectStatus().isOk();
assertThat(this.serverSpec.getSavedSslInfo()).isSameAs(info);
}
private static class TestMockServerSpec extends AbstractMockServerSpec<TestMockServerSpec> {
private @Nullable SslInfo savedSslInfo;
public @Nullable SslInfo getSavedSslInfo() {
return this.savedSslInfo;
}
@Override
protected WebHttpHandlerBuilder initHttpHandlerBuilder() {
return WebHttpHandlerBuilder.webHandler(exchange -> {
this.savedSslInfo = exchange.getRequest().getSslInfo();
DefaultDataBufferFactory factory = DefaultDataBufferFactory.sharedInstance;
String text = exchange.getAttributes().toString();
DataBuffer buffer = factory.wrap(text.getBytes(StandardCharsets.UTF_8));
@ -98,13 +120,8 @@ public class MockServerSpecTests { @@ -98,13 +120,8 @@ public class MockServerSpecTests {
}
}
private static class TestWebFilter implements WebFilter {
private final String name;
TestWebFilter(String name) {
this.name = name;
}
private record TestWebFilter(String name) implements WebFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {

Loading…
Cancel
Save