11/*
2- * Copyright 2002-2022 the original author or authors.
2+ * Copyright 2002-2024 the original author or authors.
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
3030
3131import org .springframework .core .DefaultParameterNameDiscoverer ;
3232import org .springframework .core .MethodParameter ;
33- import org .springframework .core .ResolvableType ;
3433import org .springframework .core .annotation .SynthesizingMethodParameter ;
3534import org .springframework .graphql .data .method .annotation .Argument ;
3635import org .springframework .graphql .data .method .annotation .QueryMapping ;
5453 * Tests for {@link AuthenticationPrincipalArgumentResolver}.
5554 *
5655 * @author Rob Winch
56+ * @author Rossen Stoyanchev
5757 */
5858class AuthenticationPrincipalArgumentResolverTests {
5959
60- private static final Class <String > STRING_CLASS = String .class ;
61-
62- private static final Class <UserDetails > USER_DETAILS_CLASS = UserDetails .class ;
63-
64- private static final Class <?> MONO_USER_DETAILS_CLASS =
65- ResolvableType .forClassWithGenerics (Mono .class , UserDetails .class ).getRawClass ();
66-
67- private static final Class <?> MONO_STRING_CLASS =
68- ResolvableType .forClassWithGenerics (Mono .class , String .class ).getRawClass ();
69-
70- private static final Class <?> PUBLISHER_USER_DETAILS_CLASS =
71- ResolvableType .forClassWithGenerics (Publisher .class , UserDetails .class ).getRawClass ();
72-
73- private static final Class <?> TESTPUBLISHER_USER_DETAILS_CLASS =
74- ResolvableType .forClassWithGenerics (TestPublisher .class , UserDetails .class ).getRawClass ();
75-
76-
7760 private final AuthenticationPrincipalArgumentResolver resolver =
7861 new AuthenticationPrincipalArgumentResolver ((beanName , context ) -> new PrincipalConverter ());
7962
@@ -83,48 +66,49 @@ void cleanup() {
8366 SecurityContextHolder .clearContext ();
8467 }
8568
69+
8670 @ Test
8771 void supportsParameterWhenNoAnnotation () {
88- MethodParameter parameter = firstParameter (UserController .class , "noParameter" , USER_DETAILS_CLASS );
72+ MethodParameter parameter = firstParameter (UserController .class , "noParameter" , UserDetails . class );
8973 assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
9074 }
9175
9276 @ Test
9377 void supportsParameterWhenWrongAnnotation () {
94- MethodParameter parameter = firstParameter (UserController .class , "argument" , USER_DETAILS_CLASS );
78+ MethodParameter parameter = firstParameter (UserController .class , "argument" , UserDetails . class );
9579 assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
9680 }
9781
9882 @ Test
9983 void supportsParameterWhenCurrentUser () {
100- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
84+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
10185 assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
10286 }
10387
10488 @ Test
10589 void supportsParameterWhenAuthenticationPrincipal () {
106- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , USER_DETAILS_CLASS );
90+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , UserDetails . class );
10791 assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
10892 }
10993
11094 @ Test
11195 void resolveArgumentWhenAuthenticationPrincipal () throws Exception {
112- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , USER_DETAILS_CLASS );
113- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
96+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , UserDetails . class );
97+ Mono <UserDetails > details = resolveArgument (parameter );
11498 assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
11599 }
116100
117101 @ Test
118102 void resolveArgumentWhenCurrentUser () throws Exception {
119- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
120- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
103+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
104+ Mono <UserDetails > details = resolveArgument (parameter );
121105 assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
122106 }
123107
124108 @ Test
125109 void resolveArgumentWhenNoSecurityContext () throws Exception {
126- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
127- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
110+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
111+ Mono <UserDetails > details = resolveArgument (parameter );
128112 assertThat (details .block ()).isNull ();
129113 }
130114
@@ -133,82 +117,82 @@ void resolveArgumentWhenSecurityContextHolder() throws Exception {
133117 SecurityContext context = SecurityContextHolder .createEmptyContext ();
134118 context .setAuthentication (usernamePasswordAuthentication ());
135119 SecurityContextHolder .setContext (context );
136- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , USER_DETAILS_CLASS );
137- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
120+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , UserDetails . class );
121+ Mono <UserDetails > details = resolveArgument (parameter );
138122 assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
139123 }
140124
141125 @ Test
142126 void resolveArgumentWhenAuthenticationPrincipalUsername () throws Exception {
143- MethodParameter parameter = firstParameter (UserController .class , "username" , STRING_CLASS );
144- Mono <String > details = ( Mono < String >) this . resolver . resolveArgument (parameter , null );
127+ MethodParameter parameter = firstParameter (UserController .class , "username" , String . class );
128+ Mono <String > details = resolveArgument (parameter );
145129 assertThat (details .contextWrite (authenticationContext ()).block ()).isEqualTo ("user" );
146130 }
147131
148132 @ Test
149133 void resolveArgumentWhenBeanName () throws Exception {
150- MethodParameter parameter = firstParameter (UserController .class , "beanName" , USER_DETAILS_CLASS );
151- Mono <UserDetails > details = ( Mono < UserDetails >) this . resolver . resolveArgument (parameter , null );
134+ MethodParameter parameter = firstParameter (UserController .class , "beanName" , UserDetails . class );
135+ Mono <UserDetails > details = resolveArgument (parameter );
152136 assertThat (details .contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
153137 }
154138
155139 @ Test
156140 void resolveArgumentWhenErrorOnInvalidType () throws Exception {
157141 MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , String .class );
158- Mono <Object > details = ( Mono < Object >) this . resolver . resolveArgument (parameter , null );
142+ Mono <Object > details = resolveArgument (parameter );
159143 assertThatExceptionOfType (ClassCastException .class )
160144 .isThrownBy (() -> details .contextWrite (authenticationContext ()).block ());
161145 }
162146
163147 @ Test
164148 void resolveArgumentWhenInvalidType () throws Exception {
165- MethodParameter parameter = firstParameter (UserController .class , "invalidType" , STRING_CLASS );
166- Mono <Mono <Object >> details = ( Mono < Mono < Object >>) this . resolver . resolveArgument (parameter , null );
149+ MethodParameter parameter = firstParameter (UserController .class , "invalidType" , String . class );
150+ Mono <Mono <Object >> details = resolveArgument (parameter );
167151 assertThat (details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ()).isNull ();
168152 }
169153
170154 @ Test
171155 void supportsParameterWhenMonoNoAnnotation () {
172- MethodParameter parameter = firstParameter (UserController .class , "noParameter" , MONO_USER_DETAILS_CLASS );
156+ MethodParameter parameter = firstParameter (UserController .class , "noParameter" , Mono . class );
173157 assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
174158 }
175159
176160 @ Test
177161 void supportsParameterWhenMonoWrongAnnotation () {
178- MethodParameter parameter = firstParameter (UserController .class , "argument" , MONO_USER_DETAILS_CLASS );
162+ MethodParameter parameter = firstParameter (UserController .class , "argument" , Mono . class );
179163 assertThat (this .resolver .supportsParameter (parameter )).isFalse ();
180164 }
181165
182166 @ Test
183167 void supportsParameterWhenMonoCurrentUser () {
184- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
168+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
185169 assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
186170 }
187171
188172 @ Test
189173 void supportsParameterWhenMonoAuthenticationPrincipal () {
190- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , MONO_USER_DETAILS_CLASS );
174+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , Mono . class );
191175 assertThat (this .resolver .supportsParameter (parameter )).isTrue ();
192176 }
193177
194178 @ Test
195179 void resolveArgumentWhenMonoAuthenticationPrincipal () throws Exception {
196- MethodParameter parameter = firstParameter (UserController .class , "userDetails" , MONO_USER_DETAILS_CLASS );
197- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
180+ MethodParameter parameter = firstParameter (UserController .class , "userDetails" , Mono . class );
181+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
198182 assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
199183 }
200184
201185 @ Test
202186 void resolveArgumentWhenMonoCurrentUser () throws Exception {
203- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
204- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
187+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
188+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
205189 assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
206190 }
207191
208192 @ Test
209193 void resolveArgumentWhenMonoNoSecurityContext () throws Exception {
210- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
211- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
194+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
195+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
212196 assertThat (details .block ().block ()).isNull ();
213197 }
214198
@@ -217,58 +201,58 @@ void resolveArgumentWhenMonoSecurityContextHolder() throws Exception {
217201 SecurityContext context = SecurityContextHolder .createEmptyContext ();
218202 context .setAuthentication (usernamePasswordAuthentication ());
219203 SecurityContextHolder .setContext (context );
220- MethodParameter parameter = firstParameter (UserController .class , "currentUser" , MONO_USER_DETAILS_CLASS );
221- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
204+ MethodParameter parameter = firstParameter (UserController .class , "currentUser" , Mono . class );
205+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
222206 assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
223207 }
224208
225209 @ Test
226210 void resolveArgumentWhenMonoAuthenticationPrincipalUsername () throws Exception {
227- MethodParameter parameter = firstParameter (UserController .class , "username" , MONO_STRING_CLASS );
228- Mono <Mono <String >> details = ( Mono < Mono < String >>) this . resolver . resolveArgument (parameter , null );
211+ MethodParameter parameter = firstParameter (UserController .class , "username" , Mono . class );
212+ Mono <Mono <String >> details = resolveArgument (parameter );
229213 assertThat (details .block ().contextWrite (authenticationContext ()).block ()).isEqualTo ("user" );
230214 }
231215
232216 @ Test
233217 void resolveArgumentWhenMonoBeanName () throws Exception {
234- MethodParameter parameter = firstParameter (UserController .class , "beanName" , MONO_USER_DETAILS_CLASS );
235- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
218+ MethodParameter parameter = firstParameter (UserController .class , "beanName" , Mono . class );
219+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
236220 assertThat (details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
237221 }
238222
239223 @ Test
240224 void resolveArgumentWhenMonoErrorOnInvalidType () throws Exception {
241- MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , MONO_STRING_CLASS );
242- Mono <Mono <Object >> details = ( Mono < Mono < Object >>) this . resolver . resolveArgument (parameter , null );
225+ MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , Mono . class );
226+ Mono <Mono <Object >> details = resolveArgument (parameter );
243227 assertThatExceptionOfType (ClassCastException .class )
244228 .isThrownBy (() -> details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ());
245229 }
246230
247231 @ Test
248232 void resolveArgumentWhenMonoInvalidType () throws Exception {
249- MethodParameter parameter = firstParameter (UserController .class , "invalidType" , MONO_STRING_CLASS );
250- Mono <Mono <Object >> details = ( Mono < Mono < Object >>) this . resolver . resolveArgument (parameter , null );
233+ MethodParameter parameter = firstParameter (UserController .class , "invalidType" , Mono . class );
234+ Mono <Mono <Object >> details = resolveArgument (parameter );
251235 assertThat (details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ()).isNull ();
252236 }
253237
254238 @ Test
255239 void resolveArgumentWhenPublisher () throws Exception {
256- MethodParameter parameter = firstParameter (UserController .class , "publisher" , PUBLISHER_USER_DETAILS_CLASS );
257- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
240+ MethodParameter parameter = firstParameter (UserController .class , "publisher" , Publisher . class );
241+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
258242 assertThat (details .block ().contextWrite (authenticationContext ()).block ().getUsername ()).isEqualTo ("user" );
259243 }
260244
261245 @ Test
262246 void resolveArgumentWhenTestPublisherThenEmptyMono () throws Exception {
263- MethodParameter parameter = firstParameter (UserController .class , "publisher" , TESTPUBLISHER_USER_DETAILS_CLASS );
264- Mono <TestPublisher <UserDetails >> details = ( Mono < TestPublisher < UserDetails >>) this . resolver . resolveArgument (parameter , null );
247+ MethodParameter parameter = firstParameter (UserController .class , "publisher" , TestPublisher . class );
248+ Mono <TestPublisher <UserDetails >> details = resolveArgument (parameter );
265249 assertThat (details .contextWrite (authenticationContext ()).block ()).isNull ();
266250 }
267251
268252 @ Test
269253 void resolveArgumentWhenTestPublisherAndErrorOnInvalidType () throws Exception {
270- MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , TESTPUBLISHER_USER_DETAILS_CLASS );
271- Mono <Mono <UserDetails >> details = ( Mono < Mono < UserDetails >>) this . resolver . resolveArgument (parameter , null );
254+ MethodParameter parameter = firstParameter (UserController .class , "errorOnInvalidType" , TestPublisher . class );
255+ Mono <Mono <UserDetails >> details = resolveArgument (parameter );
272256 assertThatExceptionOfType (ClassCastException .class )
273257 .isThrownBy (() -> details .flatMap (u -> u ).contextWrite (authenticationContext ()).block ());
274258 }
@@ -284,6 +268,11 @@ private MethodParameter methodParam(Method method, int index) {
284268 return parameter ;
285269 }
286270
271+ @ SuppressWarnings ({"unchecked" , "DataFlowIssue" })
272+ private <T > T resolveArgument (MethodParameter parameter ) throws Exception {
273+ return (T ) this .resolver .resolveArgument (parameter , null );
274+ }
275+
287276 private static Function <Context , Context > authenticationContext () {
288277 return (context ) -> ReactiveSecurityContextHolder .withAuthentication (usernamePasswordAuthentication ());
289278 }
@@ -297,6 +286,7 @@ private static UserDetails userDetails() {
297286 return new User ("user" , "password" , AuthorityUtils .createAuthorityList ("ROLE_USER" ));
298287 }
299288
289+
300290 static class PrincipalConverter {
301291 public UserDetails convert (UserDetails userDetails ) {
302292 return userDetails ;
0 commit comments