2121
2222import org .jspecify .annotations .Nullable ;
2323import org .junit .jupiter .api .Test ;
24+ import reactor .test .StepVerifier ;
2425
2526import org .springframework .web .accept .InvalidApiVersionException ;
2627import org .springframework .web .accept .MissingApiVersionException ;
3536/**
3637 * Unit tests for {@link org.springframework.web.accept.DefaultApiVersionStrategy}.
3738 * @author Rossen Stoyanchev
39+ * @author Jonathan Kaplan
3840 */
3941public class DefaultApiVersionStrategiesTests {
4042
@@ -48,6 +50,117 @@ void defaultVersionIsParsed() {
4850 assertThat (strategy .getDefaultVersion ()).isEqualTo (parser .parseVersion (version ));
4951 }
5052
53+ @ Test
54+ void missingRequiredVersionReactively () {
55+
56+ testValidateReactively (null , apiVersionStrategy ())
57+ .expectErrorSatisfies (throwable ->
58+ assertThat (throwable ).isInstanceOf (MissingApiVersionException .class )
59+ .hasMessage (("400 BAD_REQUEST \" API version is " +
60+ "required.\" " )
61+ ))
62+ .verify ();
63+ }
64+
65+ @ Test
66+ void validateSupportedVersionReactively () {
67+ String version = "1.2" ;
68+ DefaultApiVersionStrategy strategy = apiVersionStrategy ();
69+ strategy .addSupportedVersion (version );
70+ testValidateReactively (version , strategy )
71+ .expectNextMatches (next -> next .toString ().equals ("1.2.0" ))
72+ .verifyComplete ();
73+ }
74+
75+ @ Test
76+ void validateSupportedVersionForDefaultVersionReactively () {
77+ String defaultVersion = "1.2" ;
78+ DefaultApiVersionStrategy strategy = apiVersionStrategy (defaultVersion , false , null );
79+
80+ testValidateReactively (defaultVersion , strategy )
81+ .expectNextMatches (next -> next .toString ().equals ("1.2.0" ))
82+ .verifyComplete ();
83+ }
84+
85+ @ Test
86+ void validateUnsupportedVersionReactively () {
87+ testValidateReactively ("1.2" , apiVersionStrategy ())
88+ .expectErrorSatisfies (throwable ->
89+ assertThat (throwable ).isInstanceOf (InvalidApiVersionException .class )
90+ .hasMessage (("400 BAD_REQUEST \" Invalid API " +
91+ "version: '1.2.0'.\" " )
92+ ))
93+ .verify ();
94+
95+ }
96+
97+ @ Test
98+ void validateDetectedVersionReactively () {
99+ String version = "1.2" ;
100+ DefaultApiVersionStrategy strategy = apiVersionStrategy (null , true , null );
101+ strategy .addMappedVersion (version );
102+ testValidateReactively (version , strategy )
103+ .expectNextMatches (next -> next .toString ().equals ("1.2.0" ))
104+ .verifyComplete ();
105+ }
106+
107+ @ Test
108+ void validateWhenDetectedVersionOffReactively () {
109+ String version = "1.2" ;
110+ DefaultApiVersionStrategy strategy = apiVersionStrategy ();
111+ strategy .addMappedVersion (version );
112+ testValidateReactively (version , strategy )
113+ .expectError (InvalidApiVersionException .class )
114+ .verify ();
115+ }
116+
117+ @ Test
118+ void validateSupportedWithPredicateReactively () {
119+ SemanticApiVersionParser .Version parsedVersion = parser .parseVersion ("1.2" );
120+ testValidateReactively ("1.2" , apiVersionStrategy (null , false , version -> version .equals (parsedVersion )))
121+ .expectNextMatches (next -> next .toString ().equals ("1.2.0" ))
122+ .verifyComplete ();
123+ }
124+
125+ @ Test
126+ void validateUnsupportedWithPredicateReactively () {
127+ DefaultApiVersionStrategy strategy = apiVersionStrategy (null , false , version -> version .equals ("1.2" ));
128+ testValidateReactively ("1.2" , strategy )
129+ .verifyError (InvalidApiVersionException .class );
130+ }
131+
132+ @ Test
133+ void versionRequiredAndDefaultVersionSetReactively () {
134+ assertThatIllegalArgumentException ()
135+ .isThrownBy (() ->
136+ new org .springframework .web .accept .DefaultApiVersionStrategy (
137+ List .of (request -> request .getParameter ("api-version" )), new SemanticApiVersionParser (),
138+ true , "1.2" , true , version -> true , null ))
139+ .withMessage ("versionRequired cannot be set to true if a defaultVersion is also configured" );
140+ }
141+
142+ private static DefaultApiVersionStrategy apiVersionStrategy () {
143+ return apiVersionStrategy (null , false , null );
144+ }
145+
146+ private static DefaultApiVersionStrategy apiVersionStrategy (
147+ @ Nullable String defaultVersion , boolean detectSupportedVersions ,
148+ @ Nullable Predicate <Comparable <?>> supportedVersionPredicate ) {
149+
150+ return new DefaultApiVersionStrategy (
151+ List .of (exchange -> exchange .getRequest ().getQueryParams ().getFirst ("api-version" )),
152+ parser , null , defaultVersion , detectSupportedVersions , supportedVersionPredicate , null );
153+ }
154+
155+ private StepVerifier .FirstStep <Comparable <?>> testValidateReactively (@ Nullable String version , DefaultApiVersionStrategy strategy ) {
156+ MockServerHttpRequest .BaseBuilder <?> requestBuilder = MockServerHttpRequest .get ("/" );
157+ if (version != null ) {
158+ requestBuilder .queryParam ("api-version" , version );
159+ }
160+ return StepVerifier .create (strategy .resolveParseAndValidateVersion (MockServerWebExchange .builder (requestBuilder )
161+ .build ()));
162+ }
163+
51164 @ Test
52165 void missingRequiredVersion () {
53166 assertThatThrownBy (() -> testValidate (null , apiVersionStrategy ()))
@@ -109,31 +222,18 @@ void validateUnsupportedWithPredicate() {
109222 void versionRequiredAndDefaultVersionSet () {
110223 assertThatIllegalArgumentException ()
111224 .isThrownBy (() ->
112- new org .springframework .web .accept .DefaultApiVersionStrategy (
113- List .of (request -> request .getParameter ("api-version" )), new SemanticApiVersionParser (),
114- true , "1.2" , true , version -> true , null ))
225+ new org .springframework .web .accept .DefaultApiVersionStrategy (
226+ List .of (request -> request .getParameter ("api-version" )), new SemanticApiVersionParser (),
227+ true , "1.2" , true , version -> true , null ))
115228 .withMessage ("versionRequired cannot be set to true if a defaultVersion is also configured" );
116229 }
117230
118- private static DefaultApiVersionStrategy apiVersionStrategy () {
119- return apiVersionStrategy (null , false , null );
120- }
121-
122- private static DefaultApiVersionStrategy apiVersionStrategy (
123- @ Nullable String defaultVersion , boolean detectSupportedVersions ,
124- @ Nullable Predicate <Comparable <?>> supportedVersionPredicate ) {
125-
126- return new DefaultApiVersionStrategy (
127- List .of (exchange -> exchange .getRequest ().getQueryParams ().getFirst ("api-version" )),
128- parser , null , defaultVersion , detectSupportedVersions , supportedVersionPredicate , null );
129- }
130-
131231 private void testValidate (@ Nullable String version , DefaultApiVersionStrategy strategy ) {
132232 MockServerHttpRequest .BaseBuilder <?> requestBuilder = MockServerHttpRequest .get ("/" );
133233 if (version != null ) {
134234 requestBuilder .queryParam ("api-version" , version );
135235 }
136- strategy .resolveParseAndValidateVersion (MockServerWebExchange .builder (requestBuilder ).build ());
236+ strategy .resolveParseAndValidateVersion (MockServerWebExchange .builder (requestBuilder ).build ()). block () ;
137237 }
138238
139239}
0 commit comments