@ -21,6 +21,8 @@ import java.util.function.Predicate;
@@ -21,6 +21,8 @@ import java.util.function.Predicate;
import org.jspecify.annotations.Nullable ;
import org.junit.jupiter.api.Test ;
import reactor.core.publisher.Mono ;
import reactor.test.StepVerifier ;
import org.springframework.web.accept.InvalidApiVersionException ;
import org.springframework.web.accept.MissingApiVersionException ;
@ -30,11 +32,11 @@ import org.springframework.web.testfixture.server.MockServerWebExchange;
@@ -30,11 +32,11 @@ import org.springframework.web.testfixture.server.MockServerWebExchange;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException ;
import static org.assertj.core.api.Assertions.assertThatThrownBy ;
/ * *
* Unit tests for { @link org . springframework . web . accept . DefaultApiVersionStrategy } .
* @author Rossen Stoyanchev
* @author Jonathan Kaplan
* /
public class DefaultApiVersionStrategiesTests {
@ -50,9 +52,11 @@ public class DefaultApiVersionStrategiesTests {
@@ -50,9 +52,11 @@ public class DefaultApiVersionStrategiesTests {
@Test
void missingRequiredVersion ( ) {
assertThatThrownBy ( ( ) - > testValidate ( null , apiVersionStrategy ( ) ) )
. isInstanceOf ( MissingApiVersionException . class )
. hasMessage ( "400 BAD_REQUEST \"API version is required.\"" ) ;
StepVerifier . create ( testValidate ( null , apiVersionStrategy ( ) ) )
. expectErrorSatisfies ( ex - > assertThat ( ex )
. isInstanceOf ( MissingApiVersionException . class )
. hasMessage ( ( "400 BAD_REQUEST \"API version is required.\"" ) ) )
. verify ( ) ;
}
@Test
@ -60,21 +64,25 @@ public class DefaultApiVersionStrategiesTests {
@@ -60,21 +64,25 @@ public class DefaultApiVersionStrategiesTests {
String version = "1.2" ;
DefaultApiVersionStrategy strategy = apiVersionStrategy ( ) ;
strategy . addSupportedVersion ( version ) ;
testValidate ( version , strategy ) ;
Mono < String > result = testValidate ( version , strategy ) ;
StepVerifier . create ( result ) . expectNext ( "1.2.0" ) . verifyComplete ( ) ;
}
@Test
void validateSupportedVersionForDefaultVersion ( ) {
String defaultVersion = "1.2" ;
DefaultApiVersionStrategy strategy = apiVersionStrategy ( defaultVersion , false , null ) ;
testValidate ( defaultVersion , strategy ) ;
Mono < String > result = testValidate ( defaultVersion , strategy ) ;
StepVerifier . create ( result ) . expectNext ( "1.2.0" ) . verifyComplete ( ) ;
}
@Test
void validateUnsupportedVersion ( ) {
assertThatThrownBy ( ( ) - > testValidate ( "1.2" , apiVersionStrategy ( ) ) )
. isInstanceOf ( InvalidApiVersionException . class )
. hasMessage ( "400 BAD_REQUEST \"Invalid API version: '1.2.0'.\"" ) ;
StepVerifier . create ( testValidate ( "1.2" , apiVersionStrategy ( ) ) )
. expectErrorSatisfies ( ex - > assertThat ( ex )
. isInstanceOf ( InvalidApiVersionException . class )
. hasMessage ( ( "400 BAD_REQUEST \"Invalid API version: '1.2.0'.\"" ) ) )
. verify ( ) ;
}
@Test
@ -82,7 +90,8 @@ public class DefaultApiVersionStrategiesTests {
@@ -82,7 +90,8 @@ public class DefaultApiVersionStrategiesTests {
String version = "1.2" ;
DefaultApiVersionStrategy strategy = apiVersionStrategy ( null , true , null ) ;
strategy . addMappedVersion ( version ) ;
testValidate ( version , strategy ) ;
Mono < String > result = testValidate ( version , strategy ) ;
StepVerifier . create ( result ) . expectNext ( "1.2.0" ) . verifyComplete ( ) ;
}
@Test
@ -90,28 +99,32 @@ public class DefaultApiVersionStrategiesTests {
@@ -90,28 +99,32 @@ public class DefaultApiVersionStrategiesTests {
String version = "1.2" ;
DefaultApiVersionStrategy strategy = apiVersionStrategy ( ) ;
strategy . addMappedVersion ( version ) ;
assertThatThrownBy ( ( ) - > testValidate ( version , strategy ) ) . isInstanceOf ( InvalidApiVersionException . class ) ;
Mono < String > result = testValidate ( version , strategy ) ;
StepVerifier . create ( result ) . expectError ( InvalidApiVersionException . class ) . verify ( ) ;
}
@Test
void validateSupportedWithPredicate ( ) {
SemanticApiVersionParser . Version parsedVersion = parser . parseVersion ( "1.2" ) ;
testValidate ( "1.2" , apiVersionStrategy ( null , false , version - > version . equals ( parsedVersion ) ) ) ;
ApiVersionStrategy strategy = apiVersionStrategy ( null , false , version - > version . equals ( parsedVersion ) ) ;
Mono < String > result = testValidate ( "1.2" , strategy ) ;
StepVerifier . create ( result ) . expectNext ( "1.2.0" ) . verifyComplete ( ) ;
}
@Test
void validateUnsupportedWithPredicate ( ) {
DefaultApiVersionStrategy strategy = apiVersionStrategy ( null , false , version - > version . equals ( "1.2" ) ) ;
assertThatThrownBy ( ( ) - > testValidate ( "1.2" , strategy ) ) . isInstanceOf ( InvalidApiVersionException . class ) ;
ApiVersionStrategy strategy = apiVersionStrategy ( null , false , version - > version . equals ( "1.2" ) ) ;
Mono < ? > result = testValidate ( "1.2" , strategy ) ;
StepVerifier . create ( result ) . verifyError ( InvalidApiVersionException . class ) ;
}
@Test
void versionRequiredAndDefaultVersionSet ( ) {
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - >
new org . springframework . web . accept . DefaultApiVersionStrategy (
List . of ( request - > request . getParameter ( "api-version" ) ) , new SemanticApiVersionParser ( ) ,
true , "1.2" , true , version - > true , null ) )
. isThrownBy ( ( ) - > {
ApiVersionResolver resolver = new QueryApiVersionResolver ( "api-version" ) ;
new DefaultApiVersionStrategy ( List . of ( resolver ) , parser , true , "1.2" , true , v - > true , null ) ;
} )
. withMessage ( "versionRequired cannot be set to true if a defaultVersion is also configured" ) ;
}
@ -124,16 +137,17 @@ public class DefaultApiVersionStrategiesTests {
@@ -124,16 +137,17 @@ public class DefaultApiVersionStrategiesTests {
@Nullable Predicate < Comparable < ? > > supportedVersionPredicate ) {
return new DefaultApiVersionStrategy (
List . of ( exchange - > exchange . getRequest ( ) . getQueryParams ( ) . getFirst ( "api-version" ) ) ,
List . of ( new QueryApiVersionResolver ( "api-version" ) ) ,
parser , null , defaultVersion , detectSupportedVersions , supportedVersionPredicate , null ) ;
}
private void testValidate ( @Nullable String version , Default ApiVersionStrategy strategy ) {
MockServerHttpRequest . BaseBuilder < ? > requestB uilder = MockServerHttpRequest . get ( "/" ) ;
private Mono < String > testValidate ( @Nullable String version , ApiVersionStrategy strategy ) {
MockServerHttpRequest . BaseBuilder < ? > b uilder = MockServerHttpRequest . get ( "/" ) ;
if ( version ! = null ) {
requestB uilder. queryParam ( "api-version" , version ) ;
b uilder. queryParam ( "api-version" , version ) ;
}
strategy . resolveParseAndValidateVersion ( MockServerWebExchange . builder ( requestBuilder ) . build ( ) ) ;
MockServerWebExchange exchange = MockServerWebExchange . builder ( builder ) . build ( ) ;
return strategy . resolveParseAndValidateApiVersion ( exchange ) . map ( Object : : toString ) ;
}
}