Add supportedVersionPredicate to ApiVersionConfigurer

Closes gh-35267
This commit is contained in:
rstoyanchev
2025-08-01 12:35:18 +01:00
parent 87838aa4c5
commit 2b1a815167
12 changed files with 117 additions and 48 deletions
@@ -17,6 +17,7 @@
package org.springframework.web.accept;
import java.util.List;
import java.util.function.Predicate;
import org.jspecify.annotations.Nullable;
import org.junit.jupiter.api.Test;
@@ -44,6 +45,13 @@ public class DefaultApiVersionStrategiesTests {
assertThat(strategy.getDefaultVersion()).isEqualTo(parser.parseVersion(version));
}
@Test
void missingRequiredVersion() {
assertThatThrownBy(() -> validateVersion(null, apiVersionStrategy()))
.isInstanceOf(MissingApiVersionException.class)
.hasMessage("400 BAD_REQUEST \"API version is required.\"");
}
@Test
void validateSupportedVersion() {
String version = "1.2";
@@ -53,7 +61,7 @@ public class DefaultApiVersionStrategiesTests {
}
@Test
void rejectUnsupportedVersion() {
void validateUnsupportedVersion() {
assertThatThrownBy(() -> validateVersion("1.2", apiVersionStrategy()))
.isInstanceOf(InvalidApiVersionException.class)
.hasMessage("400 BAD_REQUEST \"Invalid API version: '1.2.0'.\"");
@@ -62,7 +70,7 @@ public class DefaultApiVersionStrategiesTests {
@Test
void validateDetectedVersion() {
String version = "1.2";
DefaultApiVersionStrategy strategy = apiVersionStrategy(null, true);
DefaultApiVersionStrategy strategy = apiVersionStrategy(null, true, null);
strategy.addMappedVersion(version);
validateVersion(version, strategy);
}
@@ -76,30 +84,37 @@ public class DefaultApiVersionStrategiesTests {
}
@Test
void missingRequiredVersion() {
assertThatThrownBy(() -> validateVersion(null, apiVersionStrategy()))
.isInstanceOf(MissingApiVersionException.class)
.hasMessage("400 BAD_REQUEST \"API version is required.\"");
void validateSupportedWithPredicate() {
SemanticApiVersionParser.Version parsedVersion = parser.parseVersion("1.2");
validateVersion("1.2", apiVersionStrategy(null, false, version -> version.equals(parsedVersion)));
}
@Test
void validateUnsupportedWithPredicate() {
DefaultApiVersionStrategy strategy = apiVersionStrategy(null, false, version -> version.equals("1.2"));
assertThatThrownBy(() -> validateVersion("1.2", strategy)).isInstanceOf(InvalidApiVersionException.class);
}
private static DefaultApiVersionStrategy apiVersionStrategy() {
return apiVersionStrategy(null, false);
return apiVersionStrategy(null, false, null);
}
private static DefaultApiVersionStrategy apiVersionStrategy(@Nullable String defaultVersion) {
return apiVersionStrategy(defaultVersion, false);
return apiVersionStrategy(defaultVersion, false, null);
}
private static DefaultApiVersionStrategy apiVersionStrategy(
@Nullable String defaultVersion, boolean detectSupportedVersions) {
@Nullable String defaultVersion, boolean detectSupportedVersions,
@Nullable Predicate<Comparable<?>> supportedVersionPredicate) {
return new DefaultApiVersionStrategy(
List.of(request -> request.getParameter("api-version")),
new SemanticApiVersionParser(), true, defaultVersion, detectSupportedVersions, null);
List.of(request -> request.getParameter("api-version")), new SemanticApiVersionParser(),
true, defaultVersion, detectSupportedVersions, supportedVersionPredicate, null);
}
private void validateVersion(@Nullable String version, DefaultApiVersionStrategy strategy) {
strategy.validateVersion(version != null ? parser.parseVersion(version) : null, request);
Comparable<?> parsedVersion = (version != null ? parser.parseVersion(version) : null);
strategy.validateVersion(parsedVersion, request);
}
}