I am writing unit test to each independent gateway filter which is extended from AbstractGatewayFilterFactory.
One such filter is GraphAPIClaims filter, in this filter I am extracting the principal from ServerWebExchange instance, getting Oauth2AuthenticationToken out of it, and using this to get Oauth2AuthorizedClient and mutating the request to add or modify request headers.
I have figured out ways to mock the steps to get upto Oauth2AuthenticationToken, but getting Oauth2AuthorizedClient by mocking is where I am stuck at, below is the code that performs the operation which is called in the reactive pipeline of my filter.
private Mono<OAuth2AuthorizedClient> authorizedClient(ServerWebExchange exchange, OAuth2AuthenticationToken oauth2Authentication) {
String clientRegistrationId = oauth2Authentication.getAuthorizedClientRegistrationId();
OAuth2AuthorizeRequest request = OAuth2AuthorizeRequest.withClientRegistrationId(clientRegistrationId).principal(oauth2Authentication).build();
ReactiveOAuth2AuthorizedClientManager clientManager = (ReactiveOAuth2AuthorizedClientManager) this.clientManagerProvider.getIfAvailable();
return clientManager == null ?
Mono.error(new IllegalStateException(catalog.getMessage("filter.graph.oauth2.client.manager.missing",
null, LocaleContextHolder.getLocale()))) :
clientManager.authorize(request);
}
Here the issue is with mocking ReactiveOAuth2AuthorizedClientManager instance, I get null pointer exception.
My unit test is as follows:
@Test
@Order(2)
@Description("Test with no oauth2 authentication token")
public void testWithNoOauth2AuthorizedClient() {
GraphApiClaimsGatewayFilterFactory.Config config = new GraphApiClaimsGatewayFilterFactory.Config();
config.setForwards(getMappings());
GraphApiClaimsGatewayFilterFactory graphApiClaimsGatewayFilterFactory = new graphApiClaimsGatewayFilterFactory(clientManagerProvider);
GatewayFilter filter = graphApiClaimsGatewayFilterFactory.apply(config);
MockServerHttpRequest request = MockServerHttpRequest.get("http://localhost")
.header("DummyHeader","DummyValue")
.build();
int requestHeadersSizeBeforeFilter = request.getHeaders().size();
OAuth2AuthorizeRequest oAuth2AuthorizeRequest = OAuth2AuthorizeRequest.withClientRegistrationId(getWebExchangePrincipal()
.getAuthorizedClientRegistrationId())
.principal( "dummyPrincipal")
.build();
OAuth2AuthorizedClient oAuth2AuthorizedClient = mock(OAuth2AuthorizedClient.class);
ReactiveOAuth2AuthorizedClientManager reactiveOAuth2AuthorizedClientManager = mock(ReactiveOAuth2AuthorizedClientManager.class);
ServerWebExchange exchange = MockServerWebExchange.from(request).mutate().principal(Mono.just(getWebExchangePrincipal())).build();
when(chain.filter(exchange)).thenReturn(Mono.empty());
when(clientManagerProvider.getIfAvailable()).thenReturn(reactiveOAuth2AuthorizedClientManager);
when(reactiveOAuth2AuthorizedClientManager.authorize(oAuth2AuthorizeRequest)).thenReturn(Mono.just(oAuth2AuthorizedClient));
filter.filter(exchange,chain).subscribe();
Set<String> filteredHeaders = exchange.getRequest().getHeaders().keySet();
int requestHeadersSizeAfterFilter = filteredHeaders.size();
assert requestHeadersSizeBeforeFilter == requestHeadersSizeAfterFilter;
}