added unit test for default userinfo service (with pairwise checks)

pull/516/head
Justin Richer 2013-09-11 11:58:03 -04:00
parent b1a6127d06
commit f6a8ac4529
2 changed files with 225 additions and 2 deletions

View File

@ -0,0 +1,222 @@
/**
*
*/
package org.mitre.openid.connect.service.impl;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mitre.oauth2.model.ClientDetailsEntity;
import org.mitre.oauth2.model.ClientDetailsEntity.SubjectType;
import org.mitre.oauth2.service.ClientDetailsEntityService;
import org.mitre.openid.connect.model.DefaultUserInfo;
import org.mitre.openid.connect.model.UserInfo;
import org.mitre.openid.connect.repository.UserInfoRepository;
import org.mitre.openid.connect.service.PairwiseIdentiferService;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.runners.MockitoJUnitRunner;
import org.mockito.stubbing.Answer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
/**
* @author jricher
*
*/
@RunWith(MockitoJUnitRunner.class)
public class TestDefaultUserInfoService {
@InjectMocks
private DefaultUserInfoService service = new DefaultUserInfoService();
@Mock
private UserInfoRepository userInfoRepository;
@Mock
private ClientDetailsEntityService clientDetailsEntityService;
@Mock
private PairwiseIdentiferService pairwiseIdentiferService;
private UserInfo userInfoAdmin;
private UserInfo userInfoRegular;
private ClientDetailsEntity publicClient1;
private ClientDetailsEntity publicClient2;
private ClientDetailsEntity pairwiseClient1;
private ClientDetailsEntity pairwiseClient2;
private ClientDetailsEntity pairwiseClient3;
private ClientDetailsEntity pairwiseClient4;
private String adminUsername = "username";
private String regularUsername = "regular";
private String adminSub = "adminSub12d3a1f34a2";
private String regularSub = "regularSub652ha23b";
private String pairwiseSub12 = "regularPairwise-12-31ijoef";
private String pairwiseSub3 = "regularPairwise-3-1ojadsio";
private String pairwiseSub4 = "regularPairwise-4-1ojadsio";
private String publicClientId1 = "publicClient-1-313124";
private String publicClientId2 = "publicClient-2-4109312";
private String pairwiseClientId1 = "pairwiseClient-1-2312";
private String pairwiseClientId2 = "pairwiseClient-2-324416";
private String pairwiseClientId3 = "pairwiseClient-3-154157";
private String pairwiseClientId4 = "pairwiseClient-4-4589723";
private String sectorIdentifier12 = "https://sector-identifier-12/url";
private String sectorIdentifier3 = "https://sector-identifier-3/url";
/**
* Initialize the service and the mocked repository.
* Initialize 2 users, one of them an admin, for use in unit tests.
*/
@Before
public void prepare() {
userInfoAdmin = new DefaultUserInfo();
userInfoAdmin.setPreferredUsername(adminUsername);
userInfoAdmin.setSub(adminSub);
userInfoRegular = new DefaultUserInfo();
userInfoRegular.setPreferredUsername(regularUsername);
userInfoRegular.setSub(regularSub);
publicClient1 = new ClientDetailsEntity();
publicClient1.setClientId(publicClientId1);
publicClient2 = new ClientDetailsEntity();
publicClient2.setClientId(publicClientId2);
publicClient2.setSubjectType(SubjectType.PUBLIC);
// pairwise set 1
pairwiseClient1 = new ClientDetailsEntity();
pairwiseClient1.setClientId(pairwiseClientId1);
pairwiseClient1.setSubjectType(SubjectType.PAIRWISE);
pairwiseClient1.setSectorIdentifierUri(sectorIdentifier12);
pairwiseClient2 = new ClientDetailsEntity();
pairwiseClient2.setClientId(pairwiseClientId2);
pairwiseClient2.setSubjectType(SubjectType.PAIRWISE);
pairwiseClient2.setSectorIdentifierUri(sectorIdentifier12);
// pairwise set 2
pairwiseClient3 = new ClientDetailsEntity();
pairwiseClient3.setClientId(pairwiseClientId3);
pairwiseClient3.setSubjectType(SubjectType.PAIRWISE);
pairwiseClient3.setSectorIdentifierUri(sectorIdentifier3);
// pairwise with null sector
pairwiseClient4 = new ClientDetailsEntity();
pairwiseClient4.setClientId(pairwiseClientId4);
pairwiseClient4.setSubjectType(SubjectType.PAIRWISE);
}
/**
* Test loading an admin user, ensuring that the UserDetails object returned
* has both the ROLE_USER and ROLE_ADMIN authorities.
*/
@Test
public void loadByUsername_admin_success() {
Mockito.when(userInfoRepository.getByUsername(adminUsername)).thenReturn(userInfoAdmin);
UserInfo user = service.getByUsername(adminUsername);
assertEquals(user.getSub(), adminSub);
}
/**
* Test loading a regular, non-admin user, ensuring that the returned UserDetails
* object has ROLE_USER but *not* ROLE_ADMIN.
*/
@Test
public void loadByUsername_regular_success() {
Mockito.when(userInfoRepository.getByUsername(regularUsername)).thenReturn(userInfoRegular);
UserInfo user = service.getByUsername(regularUsername);
assertEquals(user.getSub(), regularSub);
}
/**
* If a user is not found, the loadByUsername method should throw an exception.
*/
@Test()
public void loadByUsername_nullUser() {
Mockito.when(userInfoRepository.getByUsername(adminUsername)).thenReturn(null);
UserInfo user = service.getByUsername(adminUsername);
assertNull(user);
}
/**
* Clients with public subs should always return the same sub
*/
@Test
public void getByUsernameAndClientId_publicClients() {
Mockito.when(clientDetailsEntityService.loadClientByClientId(publicClientId1)).thenReturn(publicClient1);
Mockito.when(clientDetailsEntityService.loadClientByClientId(publicClientId2)).thenReturn(publicClient2);
Mockito.when(userInfoRepository.getByUsername(regularUsername)).thenReturn(userInfoRegular);
Mockito.verify(pairwiseIdentiferService, Mockito.never()).getIdentifier(Mockito.any(UserInfo.class), Mockito.any(ClientDetailsEntity.class));
UserInfo user1 = service.getByUsernameAndClientId(regularUsername, publicClientId1);
UserInfo user2 = service.getByUsernameAndClientId(regularUsername, publicClientId2);
assertEquals(regularSub, user1.getSub());
assertEquals(regularSub, user2.getSub());
}
/**
* Clients with pairwise subs should be grouped by the sector URI
*/
@Test
public void getByUsernameAndClientId_pairwiseClients() {
Mockito.when(clientDetailsEntityService.loadClientByClientId(pairwiseClientId1)).thenReturn(pairwiseClient1);
Mockito.when(clientDetailsEntityService.loadClientByClientId(pairwiseClientId2)).thenReturn(pairwiseClient2);
Mockito.when(clientDetailsEntityService.loadClientByClientId(pairwiseClientId3)).thenReturn(pairwiseClient3);
Mockito.when(clientDetailsEntityService.loadClientByClientId(pairwiseClientId4)).thenReturn(pairwiseClient4);
Mockito.when(userInfoRepository.getByUsername(regularUsername)).thenAnswer(new Answer<UserInfo>() {
public UserInfo answer(InvocationOnMock invocation) throws Throwable {
UserInfo userInfo = new DefaultUserInfo();
userInfo.setPreferredUsername(regularUsername);
userInfo.setSub(regularSub);
return userInfo;
}
});
Mockito.when(pairwiseIdentiferService.getIdentifier(userInfoRegular, pairwiseClient1)).thenReturn(pairwiseSub12);
Mockito.when(pairwiseIdentiferService.getIdentifier(userInfoRegular, pairwiseClient2)).thenReturn(pairwiseSub12);
Mockito.when(pairwiseIdentiferService.getIdentifier(userInfoRegular, pairwiseClient3)).thenReturn(pairwiseSub3);
Mockito.when(pairwiseIdentiferService.getIdentifier(userInfoRegular, pairwiseClient4)).thenReturn(pairwiseSub4);
UserInfo user1 = service.getByUsernameAndClientId(regularUsername, pairwiseClientId1);
UserInfo user2 = service.getByUsernameAndClientId(regularUsername, pairwiseClientId2);
UserInfo user3 = service.getByUsernameAndClientId(regularUsername, pairwiseClientId3);
UserInfo user4 = service.getByUsernameAndClientId(regularUsername, pairwiseClientId4);
assertEquals(pairwiseSub12, user1.getSub());
assertEquals(pairwiseSub12, user2.getSub());
assertEquals(pairwiseSub3, user3.getSub());
assertEquals(pairwiseSub4, user4.getSub());
}
}

View File

@ -50,11 +50,12 @@ public class TestDefaultUserInfoUserDetailsService {
private UserInfo userInfoAdmin;
private UserInfo userInfoRegular;
private String adminUsername = "username";
private String regularUsername = "regular";
private String adminSub = "adminSub12d3a1f34a2";
private String regularSub = "regularSub652ha23b";
/**
* Initialize the service and the mocked repository.
* Initialize 2 users, one of them an admin, for use in unit tests.
@ -72,6 +73,7 @@ public class TestDefaultUserInfoUserDetailsService {
userInfoRegular = new DefaultUserInfo();
userInfoRegular.setPreferredUsername(regularUsername);
userInfoRegular.setSub(regularSub);
}
/**
@ -116,5 +118,4 @@ public class TestDefaultUserInfoUserDetailsService {
service.loadUserByUsername(adminUsername);
}
}