|  | @@ -24,6 +24,7 @@ import java.util.HashMap;
 | 
	
		
			
				|  |  |  import java.util.Iterator;
 | 
	
		
			
				|  |  |  import java.util.Map;
 | 
	
		
			
				|  |  |  import java.util.function.Function;
 | 
	
		
			
				|  |  | +import java.util.function.Predicate;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import okhttp3.mockwebserver.MockResponse;
 | 
	
		
			
				|  |  |  import okhttp3.mockwebserver.MockWebServer;
 | 
	
	
		
			
				|  | @@ -107,6 +108,15 @@ public class OidcReactiveOAuth2UserServiceTests {
 | 
	
		
			
				|  |  |  		assertThatIllegalArgumentException().isThrownBy(() -> this.userService.setClaimTypeConverterFactory(null));
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void setRetrieveUserInfoWhenNullThenThrowIllegalArgumentException() {
 | 
	
		
			
				|  |  | +		// @formatter:off
 | 
	
		
			
				|  |  | +		assertThatIllegalArgumentException()
 | 
	
		
			
				|  |  | +				.isThrownBy(() -> this.userService.setRetrieveUserInfo(null))
 | 
	
		
			
				|  |  | +				.withMessage("retrieveUserInfo cannot be null");
 | 
	
		
			
				|  |  | +		// @formatter:on
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  |  	public void loadUserWhenUserInfoUriNullThenUserInfoNotRetrieved() {
 | 
	
		
			
				|  |  |  		this.registration.userInfoUri(null);
 | 
	
	
		
			
				|  | @@ -183,6 +193,48 @@ public class OidcReactiveOAuth2UserServiceTests {
 | 
	
		
			
				|  |  |  		verify(customClaimTypeConverterFactory).apply(same(userRequest.getClientRegistration()));
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void loadUserWhenTokenScopesIsEmptyThenUserInfoNotRetrieved() {
 | 
	
		
			
				|  |  | +		// @formatter:off
 | 
	
		
			
				|  |  | +		OAuth2AccessToken accessToken = new OAuth2AccessToken(
 | 
	
		
			
				|  |  | +				this.accessToken.getTokenType(),
 | 
	
		
			
				|  |  | +				this.accessToken.getTokenValue(),
 | 
	
		
			
				|  |  | +				this.accessToken.getIssuedAt(),
 | 
	
		
			
				|  |  | +				this.accessToken.getExpiresAt(),
 | 
	
		
			
				|  |  | +				Collections.emptySet());
 | 
	
		
			
				|  |  | +		// @formatter:on
 | 
	
		
			
				|  |  | +		OidcUserRequest userRequest = new OidcUserRequest(this.registration.build(), accessToken, this.idToken);
 | 
	
		
			
				|  |  | +		OidcUser oidcUser = this.userService.loadUser(userRequest).block();
 | 
	
		
			
				|  |  | +		assertThat(oidcUser).isNotNull();
 | 
	
		
			
				|  |  | +		assertThat(oidcUser.getUserInfo()).isNull();
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void loadUserWhenCustomRetrieveUserInfoSetThenUsed() {
 | 
	
		
			
				|  |  | +		Map<String, Object> attributes = new HashMap<>();
 | 
	
		
			
				|  |  | +		attributes.put(StandardClaimNames.SUB, "subject");
 | 
	
		
			
				|  |  | +		attributes.put("user", "steve");
 | 
	
		
			
				|  |  | +		OAuth2User oauth2User = new DefaultOAuth2User(AuthorityUtils.createAuthorityList("ROLE_USER"), attributes,
 | 
	
		
			
				|  |  | +				"user");
 | 
	
		
			
				|  |  | +		given(this.oauth2UserService.loadUser(any())).willReturn(Mono.just(oauth2User));
 | 
	
		
			
				|  |  | +		Predicate<OidcUserRequest> customRetrieveUserInfo = mock(Predicate.class);
 | 
	
		
			
				|  |  | +		this.userService.setRetrieveUserInfo(customRetrieveUserInfo);
 | 
	
		
			
				|  |  | +		given(customRetrieveUserInfo.test(any(OidcUserRequest.class))).willReturn(true);
 | 
	
		
			
				|  |  | +		// @formatter:off
 | 
	
		
			
				|  |  | +		OAuth2AccessToken accessToken = new OAuth2AccessToken(
 | 
	
		
			
				|  |  | +				this.accessToken.getTokenType(),
 | 
	
		
			
				|  |  | +				this.accessToken.getTokenValue(),
 | 
	
		
			
				|  |  | +				this.accessToken.getIssuedAt(),
 | 
	
		
			
				|  |  | +				this.accessToken.getExpiresAt(),
 | 
	
		
			
				|  |  | +				Collections.emptySet());
 | 
	
		
			
				|  |  | +		// @formatter:on
 | 
	
		
			
				|  |  | +		OidcUserRequest userRequest = new OidcUserRequest(this.registration.build(), accessToken, this.idToken);
 | 
	
		
			
				|  |  | +		OidcUser oidcUser = this.userService.loadUser(userRequest).block();
 | 
	
		
			
				|  |  | +		assertThat(oidcUser).isNotNull();
 | 
	
		
			
				|  |  | +		assertThat(oidcUser.getUserInfo()).isNotNull();
 | 
	
		
			
				|  |  | +		verify(customRetrieveUserInfo).test(userRequest);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  |  	public void loadUserWhenTokenContainsScopesThenIndividualScopeAuthorities() {
 | 
	
		
			
				|  |  |  		OidcReactiveOAuth2UserService userService = new OidcReactiveOAuth2UserService();
 |