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
This commit is contained in:
rstoyanchev
2023-09-14 20:04:01 +01:00
parent a960132179
commit fcb11a4ee7
3 changed files with 20 additions and 6 deletions

View File

@@ -64,7 +64,7 @@ public class PrincipalMethodArgumentResolver implements HandlerMethodArgumentRes
Mono<Authentication> authMono =
ReactiveSecurityContextHolder.getContext().mapNotNull(SecurityContext::getAuthentication);
if (!parameter.isOptional()) {
if (isRequired(parameter)) {
authMono = authMono.switchIfEmpty(
Mono.error(new AuthenticationCredentialsNotFoundException("No Authentication")));
}
@@ -72,4 +72,8 @@ public class PrincipalMethodArgumentResolver implements HandlerMethodArgumentRes
return authMono;
}
private static boolean isRequired(MethodParameter parameter) {
return (!parameter.isOptional() && !Mono.class.isAssignableFrom(parameter.getParameterType()));
}
}

View File

@@ -33,6 +33,7 @@ import org.springframework.core.ResolvableType;
import org.springframework.core.annotation.SynthesizingMethodParameter;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.lang.Nullable;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -322,7 +323,7 @@ class AuthenticationPrincipalArgumentResolverTests {
}
@QueryMapping
public UserDetails currentUser(@CurrentUser UserDetails userDetails) {
public UserDetails currentUser(@CurrentUser @Nullable UserDetails userDetails) {
return userDetails;
}

View File

@@ -36,7 +36,10 @@ import org.springframework.graphql.data.method.HandlerMethodArgumentResolverComp
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.lang.Nullable;
import org.springframework.security.authentication.TestingAuthenticationToken;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.context.SecurityContextImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.util.ClassUtils;
@@ -93,16 +96,22 @@ public class DataFetcherHandlerMethodTests {
HandlerMethodArgumentResolverComposite resolvers = new HandlerMethodArgumentResolverComposite();
resolvers.addResolver(new AuthenticationPrincipalArgumentResolver((beanName, context) -> null));
resolvers.addResolver(new ArgumentMethodArgumentResolver(new GraphQlArgumentBinder()));
DataFetcherHandlerMethod handlerMethod = new DataFetcherHandlerMethod(
handlerMethodFor(new TestController(), "handleAndReturnFuture"), resolvers,
null, null, false);
Object result = handlerMethod.invoke(DataFetchingEnvironmentImpl.newDataFetchingEnvironment().build());
SecurityContextHolder.setContext(new SecurityContextImpl(new TestingAuthenticationToken("usr", "pwd")));
try {
Object result = handlerMethod.invoke(
DataFetchingEnvironmentImpl.newDataFetchingEnvironment().build());
assertThat(result).isInstanceOf(Mono.class);
assertThat(((Mono<String>) result).block()).isEqualTo("B");
assertThat(result).isInstanceOf(Mono.class);
assertThat(((Mono<String>) result).block()).isEqualTo("B");
}
finally {
SecurityContextHolder.clearContext();
}
}
private static HandlerMethod handlerMethodFor(Object controller, String methodName) {