diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java index 821eefc318..60b39d57e7 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClient.java @@ -89,6 +89,8 @@ class DefaultWebTestClient implements WebTestClient { private final @Nullable MultiValueMap defaultCookies; + private final @Nullable Object defaultApiVersion; + private final @Nullable ApiVersionInserter apiVersionInserter; private final Consumer> entityResultConsumer; @@ -104,7 +106,8 @@ class DefaultWebTestClient implements WebTestClient { ClientHttpConnector connector, ExchangeStrategies exchangeStrategies, Function exchangeFactory, UriBuilderFactory uriBuilderFactory, @Nullable HttpHeaders headers, @Nullable MultiValueMap cookies, - @Nullable ApiVersionInserter apiVersionInserter, Consumer> entityResultConsumer, + @Nullable Object defaultApiVersion, @Nullable ApiVersionInserter apiVersionInserter, + Consumer> entityResultConsumer, @Nullable Duration responseTimeout, DefaultWebTestClientBuilder clientBuilder) { this.wiretapConnector = new WiretapConnector(connector); @@ -114,6 +117,7 @@ class DefaultWebTestClient implements WebTestClient { this.uriBuilderFactory = uriBuilderFactory; this.defaultHeaders = headers; this.defaultCookies = cookies; + this.defaultApiVersion = defaultApiVersion; this.apiVersionInserter = apiVersionInserter; this.entityResultConsumer = entityResultConsumer; this.responseTimeout = (responseTimeout != null ? responseTimeout : Duration.ofSeconds(5)); @@ -386,9 +390,10 @@ class DefaultWebTestClient implements WebTestClient { if (!this.headers.isEmpty()) { headersToUse.putAll(this.headers); } - if (this.apiVersion != null) { + Object version = getApiVersionOrDefault(); + if (version != null) { Assert.state(apiVersionInserter != null, "No ApiVersionInserter configured"); - apiVersionInserter.insertVersion(this.apiVersion, headersToUse); + apiVersionInserter.insertVersion(version, headersToUse); } }) .cookies(cookiesToUse -> { @@ -404,13 +409,18 @@ class DefaultWebTestClient implements WebTestClient { private URI initUri() { URI uriToUse = this.uri != null ? this.uri : DefaultWebTestClient.this.uriBuilderFactory.expand(""); - if (this.apiVersion != null) { + Object version = getApiVersionOrDefault(); + if (version != null) { Assert.state(apiVersionInserter != null, "No ApiVersionInserter configured"); - uriToUse = apiVersionInserter.insertVersion(this.apiVersion, uriToUse); + uriToUse = apiVersionInserter.insertVersion(version, uriToUse); } return uriToUse; } + private @Nullable Object getApiVersionOrDefault() { + return (this.apiVersion != null ? this.apiVersion : DefaultWebTestClient.this.defaultApiVersion); + } + } diff --git a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java index 573e1261eb..70dd95a062 100644 --- a/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java +++ b/spring-test/src/main/java/org/springframework/test/web/reactive/server/DefaultWebTestClientBuilder.java @@ -86,6 +86,8 @@ class DefaultWebTestClientBuilder implements WebTestClient.Builder { private @Nullable MultiValueMap defaultCookies; + private @Nullable Object defaultApiVersion; + private @Nullable ApiVersionInserter apiVersionInserter; private @Nullable List filters; @@ -145,6 +147,7 @@ class DefaultWebTestClientBuilder implements WebTestClient.Builder { } this.defaultCookies = (other.defaultCookies != null ? new LinkedMultiValueMap<>(other.defaultCookies) : null); + this.defaultApiVersion = other.defaultApiVersion; this.apiVersionInserter = other.apiVersionInserter; this.filters = (other.filters != null ? new ArrayList<>(other.filters) : null); this.entityResultConsumer = other.entityResultConsumer; @@ -204,6 +207,12 @@ class DefaultWebTestClientBuilder implements WebTestClient.Builder { return this.defaultCookies; } + @Override + public WebTestClient.Builder defaultApiVersion(Object version) { + this.defaultApiVersion = version; + return this; + } + @Override public WebTestClient.Builder apiVersionInserter(ApiVersionInserter apiVersionInserter) { this.apiVersionInserter = apiVersionInserter; @@ -297,7 +306,7 @@ class DefaultWebTestClientBuilder implements WebTestClient.Builder { connectorToUse, exchangeStrategies, exchangeFactory, initUriBuilderFactory(), (this.defaultHeaders != null ? HttpHeaders.readOnlyHttpHeaders(this.defaultHeaders) : null), (this.defaultCookies != null ? CollectionUtils.unmodifiableMultiValueMap(this.defaultCookies) : null), - this.apiVersionInserter, this.entityResultConsumer, + this.defaultApiVersion, this.apiVersionInserter, this.entityResultConsumer, this.responseTimeout, new DefaultWebTestClientBuilder(this)); } 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 414b657bf6..b8733692d0 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 @@ -430,6 +430,15 @@ public interface WebTestClient { */ Builder defaultCookies(Consumer> cookiesConsumer); + /** + * Global option to specify an API version to add to every request, + * if not already set. + * @param version the version to use + * @return this builder + * @since 7.0 + */ + Builder defaultApiVersion(Object version); + /** * Configure an {@link ApiVersionInserter} to abstract how an API version * specified via {@link RequestHeadersSpec#apiVersion(Object)}