diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java index dc305f7ccc9..571fffb4a99 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/AbstractMockServerSpec.java @@ -71,8 +71,8 @@ abstract class AbstractMockServerSpec> } @Override - public T sslInfo(SslInfo sslInfo) { - this.sslInfo = sslInfo; + public T sslInfo(@Nullable SslInfo info) { + this.sslInfo = info; return self(); } diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java index d3faf8deebd..16127ae8d13 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/WebTestClient.java @@ -277,13 +277,13 @@ public interface WebTestClient { 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 sslInfo(SslInfo sslInfo); + T sslInfo(@Nullable SslInfo info); /** * Shortcut for pre-packaged customizations to the mock server setup. diff --git a/spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerSpecTests.java b/spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerSpecTests.java index 1e98c922d44..dc1a0ce5868 100644 --- a/spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerSpecTests.java +++ b/spring-test/src/test/java/org/springframework/test/web/reactive/server/MockServerSpecTests.java @@ -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; /** * Tests for {@link AbstractMockServerSpec}. - * * @author Rossen Stoyanchev */ 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 { 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 { + 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 { } } - 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 filter(ServerWebExchange exchange, WebFilterChain chain) {