|  | @@ -16,107 +16,113 @@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  package org.springframework.security.oauth2.core.oidc.user;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -import java.time.Instant;
 | 
	
		
			
				|  |  | -import java.util.Collections;
 | 
	
		
			
				|  |  | -import java.util.HashMap;
 | 
	
		
			
				|  |  | -import java.util.Map;
 | 
	
		
			
				|  |  | -import java.util.Set;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -import org.junit.Rule;
 | 
	
		
			
				|  |  |  import org.junit.Test;
 | 
	
		
			
				|  |  | -import org.junit.rules.ExpectedException;
 | 
	
		
			
				|  |  |  import org.springframework.security.core.GrantedAuthority;
 | 
	
		
			
				|  |  |  import org.springframework.security.core.authority.SimpleGrantedAuthority;
 | 
	
		
			
				|  |  | -import org.springframework.security.oauth2.core.oidc.OidcIdToken;
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.oidc.IdTokenClaimNames;
 | 
	
		
			
				|  |  | +import org.springframework.security.oauth2.core.oidc.OidcIdToken;
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.oidc.OidcUserInfo;
 | 
	
		
			
				|  |  |  import org.springframework.security.oauth2.core.oidc.StandardClaimNames;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import java.time.Instant;
 | 
	
		
			
				|  |  | +import java.util.Collections;
 | 
	
		
			
				|  |  | +import java.util.HashMap;
 | 
	
		
			
				|  |  | +import java.util.Map;
 | 
	
		
			
				|  |  | +import java.util.Set;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  import static org.assertj.core.api.Assertions.assertThat;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Tests for {@link DefaultOidcUser}.
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * @author Vedran Pavic
 | 
	
		
			
				|  |  | + * @author Joe Grandja
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  public class DefaultOidcUserTests {
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	private static final SimpleGrantedAuthority TEST_AUTHORITY = new SimpleGrantedAuthority("ROLE_USER");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	private static final Set<GrantedAuthority> TEST_AUTHORITIES = Collections.singleton(TEST_AUTHORITY);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	private static final String TEST_SUBJECT = "test";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	private static final String TEST_EMAIL = "test@example.com";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	private static final Map<String, Object> TEST_ID_TOKEN_CLAIMS = new HashMap<>();
 | 
	
		
			
				|  |  | +	private static final SimpleGrantedAuthority AUTHORITY = new SimpleGrantedAuthority("ROLE_USER");
 | 
	
		
			
				|  |  | +	private static final Set<GrantedAuthority> AUTHORITIES = Collections.singleton(AUTHORITY);
 | 
	
		
			
				|  |  | +	private static final String SUBJECT = "test-subject";
 | 
	
		
			
				|  |  | +	private static final String EMAIL = "test-subject@example.com";
 | 
	
		
			
				|  |  | +	private static final String NAME = "test-name";
 | 
	
		
			
				|  |  | +	private static final Map<String, Object> ID_TOKEN_CLAIMS = new HashMap<>();
 | 
	
		
			
				|  |  | +	private static final Map<String, Object> USER_INFO_CLAIMS = new HashMap<>();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	static {
 | 
	
		
			
				|  |  | -		TEST_ID_TOKEN_CLAIMS.put(IdTokenClaimNames.ISS, "https://example.com");
 | 
	
		
			
				|  |  | -		TEST_ID_TOKEN_CLAIMS.put(IdTokenClaimNames.SUB, TEST_SUBJECT);
 | 
	
		
			
				|  |  | +		ID_TOKEN_CLAIMS.put(IdTokenClaimNames.ISS, "https://example.com");
 | 
	
		
			
				|  |  | +		ID_TOKEN_CLAIMS.put(IdTokenClaimNames.SUB, SUBJECT);
 | 
	
		
			
				|  |  | +		USER_INFO_CLAIMS.put(StandardClaimNames.NAME, NAME);
 | 
	
		
			
				|  |  | +		USER_INFO_CLAIMS.put(StandardClaimNames.EMAIL, EMAIL);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	private static final OidcIdToken TEST_ID_TOKEN = new OidcIdToken("value", Instant.EPOCH, Instant.MAX, TEST_ID_TOKEN_CLAIMS);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	private static final OidcUserInfo TEST_USER_INFO = new OidcUserInfo(Collections.singletonMap(StandardClaimNames.EMAIL, TEST_EMAIL));
 | 
	
		
			
				|  |  | +	private static final OidcIdToken ID_TOKEN = new OidcIdToken("id-token-value", Instant.EPOCH, Instant.MAX, ID_TOKEN_CLAIMS);
 | 
	
		
			
				|  |  | +	private static final OidcUserInfo USER_INFO = new OidcUserInfo(USER_INFO_CLAIMS);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Rule
 | 
	
		
			
				|  |  | -	public ExpectedException thrown = ExpectedException.none();
 | 
	
		
			
				|  |  | +	@Test(expected = IllegalArgumentException.class)
 | 
	
		
			
				|  |  | +	public void constructorWhenAuthoritiesIsNullThenThrowIllegalArgumentException() {
 | 
	
		
			
				|  |  | +		new DefaultOidcUser(null, ID_TOKEN);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	@Test
 | 
	
		
			
				|  |  | -	public void constructorWhenAuthoritiesAndIdTokenThenIsCreated() {
 | 
	
		
			
				|  |  | -		DefaultOidcUser user = new DefaultOidcUser(TEST_AUTHORITIES, TEST_ID_TOKEN);
 | 
	
		
			
				|  |  | +	@Test(expected = IllegalArgumentException.class)
 | 
	
		
			
				|  |  | +	public void constructorWhenIdTokenIsNullThenThrowIllegalArgumentException() {
 | 
	
		
			
				|  |  | +		new DefaultOidcUser(AUTHORITIES, null);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		assertThat(user.getName()).isEqualTo(TEST_SUBJECT);
 | 
	
		
			
				|  |  | -		assertThat(user.getAuthorities()).hasSize(1);
 | 
	
		
			
				|  |  | -		assertThat(user.getAuthorities().iterator().next()).isEqualTo(TEST_AUTHORITY);
 | 
	
		
			
				|  |  | -		assertThat(user.getAttributes()).containsOnlyKeys(IdTokenClaimNames.ISS, IdTokenClaimNames.SUB);
 | 
	
		
			
				|  |  | +	@Test(expected = IllegalArgumentException.class)
 | 
	
		
			
				|  |  | +	public void constructorWhenNameAttributeKeyInvalidThenThrowIllegalArgumentException() {
 | 
	
		
			
				|  |  | +		new DefaultOidcUser(AUTHORITIES, ID_TOKEN, "invalid");
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  | -	public void constructorWhenAuthoritiesAndIdTokenAndNameAttributeKeyThenIsCreated() {
 | 
	
		
			
				|  |  | -		DefaultOidcUser user = new DefaultOidcUser(TEST_AUTHORITIES, TEST_ID_TOKEN, IdTokenClaimNames.SUB);
 | 
	
		
			
				|  |  | +	public void constructorWhenAuthoritiesIdTokenProvidedThenCreated() {
 | 
	
		
			
				|  |  | +		DefaultOidcUser user = new DefaultOidcUser(AUTHORITIES, ID_TOKEN);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		assertThat(user.getName()).isEqualTo(TEST_SUBJECT);
 | 
	
		
			
				|  |  | +		assertThat(user.getClaims()).containsOnlyKeys(IdTokenClaimNames.ISS, IdTokenClaimNames.SUB);
 | 
	
		
			
				|  |  | +		assertThat(user.getIdToken()).isEqualTo(ID_TOKEN);
 | 
	
		
			
				|  |  | +		assertThat(user.getName()).isEqualTo(SUBJECT);
 | 
	
		
			
				|  |  |  		assertThat(user.getAuthorities()).hasSize(1);
 | 
	
		
			
				|  |  | -		assertThat(user.getAuthorities().iterator().next()).isEqualTo(TEST_AUTHORITY);
 | 
	
		
			
				|  |  | +		assertThat(user.getAuthorities().iterator().next()).isEqualTo(AUTHORITY);
 | 
	
		
			
				|  |  |  		assertThat(user.getAttributes()).containsOnlyKeys(IdTokenClaimNames.ISS, IdTokenClaimNames.SUB);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  | -	public void constructorWhenAuthoritiesAndIdTokenAndUserInfoThenIsCreated() {
 | 
	
		
			
				|  |  | -		DefaultOidcUser user = new DefaultOidcUser(TEST_AUTHORITIES, TEST_ID_TOKEN, TEST_USER_INFO);
 | 
	
		
			
				|  |  | +	public void constructorWhenAuthoritiesIdTokenNameAttributeKeyProvidedThenCreated() {
 | 
	
		
			
				|  |  | +		DefaultOidcUser user = new DefaultOidcUser(AUTHORITIES, ID_TOKEN, IdTokenClaimNames.SUB);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		assertThat(user.getName()).isEqualTo(TEST_SUBJECT);
 | 
	
		
			
				|  |  | +		assertThat(user.getClaims()).containsOnlyKeys(IdTokenClaimNames.ISS, IdTokenClaimNames.SUB);
 | 
	
		
			
				|  |  | +		assertThat(user.getIdToken()).isEqualTo(ID_TOKEN);
 | 
	
		
			
				|  |  | +		assertThat(user.getName()).isEqualTo(SUBJECT);
 | 
	
		
			
				|  |  |  		assertThat(user.getAuthorities()).hasSize(1);
 | 
	
		
			
				|  |  | -		assertThat(user.getAuthorities().iterator().next()).isEqualTo(TEST_AUTHORITY);
 | 
	
		
			
				|  |  | -		assertThat(user.getAttributes()).containsOnlyKeys(IdTokenClaimNames.ISS, IdTokenClaimNames.SUB, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  | +		assertThat(user.getAuthorities().iterator().next()).isEqualTo(AUTHORITY);
 | 
	
		
			
				|  |  | +		assertThat(user.getAttributes()).containsOnlyKeys(IdTokenClaimNames.ISS, IdTokenClaimNames.SUB);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  | -	public void constructorWhenAuthoritiesAndIdTokenAndUserInfoAndNameAttributeKeyThenIsCreated() {
 | 
	
		
			
				|  |  | -		DefaultOidcUser user = new DefaultOidcUser(TEST_AUTHORITIES, TEST_ID_TOKEN, TEST_USER_INFO, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		assertThat(user.getName()).isEqualTo(TEST_EMAIL);
 | 
	
		
			
				|  |  | +	public void constructorWhenAuthoritiesIdTokenUserInfoProvidedThenCreated() {
 | 
	
		
			
				|  |  | +		DefaultOidcUser user = new DefaultOidcUser(AUTHORITIES, ID_TOKEN, USER_INFO);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		assertThat(user.getClaims()).containsOnlyKeys(
 | 
	
		
			
				|  |  | +			IdTokenClaimNames.ISS, IdTokenClaimNames.SUB, StandardClaimNames.NAME, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  | +		assertThat(user.getIdToken()).isEqualTo(ID_TOKEN);
 | 
	
		
			
				|  |  | +		assertThat(user.getUserInfo()).isEqualTo(USER_INFO);
 | 
	
		
			
				|  |  | +		assertThat(user.getName()).isEqualTo(SUBJECT);
 | 
	
		
			
				|  |  |  		assertThat(user.getAuthorities()).hasSize(1);
 | 
	
		
			
				|  |  | -		assertThat(user.getAuthorities().iterator().next()).isEqualTo(TEST_AUTHORITY);
 | 
	
		
			
				|  |  | -		assertThat(user.getAttributes()).containsOnlyKeys(IdTokenClaimNames.ISS, IdTokenClaimNames.SUB, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	@Test
 | 
	
		
			
				|  |  | -	public void constructorWhenIdTokenIsNullThenThrowsException() {
 | 
	
		
			
				|  |  | -		this.thrown.expect(IllegalArgumentException.class);
 | 
	
		
			
				|  |  | -		this.thrown.expectMessage("idToken cannot be null");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		new DefaultOidcUser(TEST_AUTHORITIES, null);
 | 
	
		
			
				|  |  | +		assertThat(user.getAuthorities().iterator().next()).isEqualTo(AUTHORITY);
 | 
	
		
			
				|  |  | +		assertThat(user.getAttributes()).containsOnlyKeys(
 | 
	
		
			
				|  |  | +			IdTokenClaimNames.ISS, IdTokenClaimNames.SUB, StandardClaimNames.NAME, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  | -	public void constructorWhenNameAttributeKeyClaimIsNotPresentThenThrowsException() {
 | 
	
		
			
				|  |  | -		this.thrown.expect(IllegalArgumentException.class);
 | 
	
		
			
				|  |  | -		this.thrown.expectMessage("Missing attribute '" + StandardClaimNames.NAME + "' in attributes");
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -		new DefaultOidcUser(TEST_AUTHORITIES, TEST_ID_TOKEN, TEST_USER_INFO, StandardClaimNames.NAME);
 | 
	
		
			
				|  |  | +	public void constructorWhenAllParametersProvidedAndValidThenCreated() {
 | 
	
		
			
				|  |  | +		DefaultOidcUser user = new DefaultOidcUser(AUTHORITIES, ID_TOKEN, USER_INFO, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		assertThat(user.getClaims()).containsOnlyKeys(
 | 
	
		
			
				|  |  | +			IdTokenClaimNames.ISS, IdTokenClaimNames.SUB, StandardClaimNames.NAME, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  | +		assertThat(user.getIdToken()).isEqualTo(ID_TOKEN);
 | 
	
		
			
				|  |  | +		assertThat(user.getUserInfo()).isEqualTo(USER_INFO);
 | 
	
		
			
				|  |  | +		assertThat(user.getName()).isEqualTo(EMAIL);
 | 
	
		
			
				|  |  | +		assertThat(user.getAuthorities()).hasSize(1);
 | 
	
		
			
				|  |  | +		assertThat(user.getAuthorities().iterator().next()).isEqualTo(AUTHORITY);
 | 
	
		
			
				|  |  | +		assertThat(user.getAttributes()).containsOnlyKeys(
 | 
	
		
			
				|  |  | +			IdTokenClaimNames.ISS, IdTokenClaimNames.SUB, StandardClaimNames.NAME, StandardClaimNames.EMAIL);
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  }
 |