Skip to content

Commit fcb11a4

Browse files
committed
Fix test failures
Adjust tests with Principal to express nullability or to provide it. In addition, Mono should not be treated as a required parameter. Closes gh-790
1 parent a960132 commit fcb11a4

File tree

3 files changed

+20
-6
lines changed

3 files changed

+20
-6
lines changed

spring-graphql/src/main/java/org/springframework/graphql/data/method/annotation/support/PrincipalMethodArgumentResolver.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,16 @@ static Object resolveAuthentication(MethodParameter parameter) {
6464
Mono<Authentication> authMono =
6565
ReactiveSecurityContextHolder.getContext().mapNotNull(SecurityContext::getAuthentication);
6666

67-
if (!parameter.isOptional()) {
67+
if (isRequired(parameter)) {
6868
authMono = authMono.switchIfEmpty(
6969
Mono.error(new AuthenticationCredentialsNotFoundException("No Authentication")));
7070
}
7171

7272
return authMono;
7373
}
7474

75+
private static boolean isRequired(MethodParameter parameter) {
76+
return (!parameter.isOptional() && !Mono.class.isAssignableFrom(parameter.getParameterType()));
77+
}
78+
7579
}

spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/AuthenticationPrincipalArgumentResolverTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.core.annotation.SynthesizingMethodParameter;
3434
import org.springframework.graphql.data.method.annotation.Argument;
3535
import org.springframework.graphql.data.method.annotation.QueryMapping;
36+
import org.springframework.lang.Nullable;
3637
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
3738
import org.springframework.security.core.Authentication;
3839
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -322,7 +323,7 @@ public UserDetails userDetails(@AuthenticationPrincipal UserDetails userDetails)
322323
}
323324

324325
@QueryMapping
325-
public UserDetails currentUser(@CurrentUser UserDetails userDetails) {
326+
public UserDetails currentUser(@CurrentUser @Nullable UserDetails userDetails) {
326327
return userDetails;
327328
}
328329

spring-graphql/src/test/java/org/springframework/graphql/data/method/annotation/support/DataFetcherHandlerMethodTests.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@
3636
import org.springframework.graphql.data.method.annotation.Argument;
3737
import org.springframework.graphql.data.method.annotation.QueryMapping;
3838
import org.springframework.lang.Nullable;
39+
import org.springframework.security.authentication.TestingAuthenticationToken;
3940
import org.springframework.security.core.annotation.AuthenticationPrincipal;
41+
import org.springframework.security.core.context.SecurityContextHolder;
42+
import org.springframework.security.core.context.SecurityContextImpl;
4043
import org.springframework.security.core.userdetails.User;
4144
import org.springframework.util.ClassUtils;
4245

@@ -93,16 +96,22 @@ void completableFutureReturnValue() {
9396

9497
HandlerMethodArgumentResolverComposite resolvers = new HandlerMethodArgumentResolverComposite();
9598
resolvers.addResolver(new AuthenticationPrincipalArgumentResolver((beanName, context) -> null));
96-
resolvers.addResolver(new ArgumentMethodArgumentResolver(new GraphQlArgumentBinder()));
9799

98100
DataFetcherHandlerMethod handlerMethod = new DataFetcherHandlerMethod(
99101
handlerMethodFor(new TestController(), "handleAndReturnFuture"), resolvers,
100102
null, null, false);
101103

102-
Object result = handlerMethod.invoke(DataFetchingEnvironmentImpl.newDataFetchingEnvironment().build());
104+
SecurityContextHolder.setContext(new SecurityContextImpl(new TestingAuthenticationToken("usr", "pwd")));
105+
try {
106+
Object result = handlerMethod.invoke(
107+
DataFetchingEnvironmentImpl.newDataFetchingEnvironment().build());
103108

104-
assertThat(result).isInstanceOf(Mono.class);
105-
assertThat(((Mono<String>) result).block()).isEqualTo("B");
109+
assertThat(result).isInstanceOf(Mono.class);
110+
assertThat(((Mono<String>) result).block()).isEqualTo("B");
111+
}
112+
finally {
113+
SecurityContextHolder.clearContext();
114+
}
106115
}
107116

108117
private static HandlerMethod handlerMethodFor(Object controller, String methodName) {

0 commit comments

Comments
 (0)