package fr.openwide.core.test.jpa.security;
import static org.junit.Assert.assertEquals;
import java.util.Collection;
import java.util.Iterator;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import fr.openwide.core.jpa.exception.SecurityServiceException;
import fr.openwide.core.jpa.exception.ServiceException;
import fr.openwide.core.jpa.security.business.authority.util.CoreAuthorityConstants;
import fr.openwide.core.test.AbstractJpaSecurityTestCase;
import fr.openwide.core.test.jpa.security.business.person.model.MockUser;
import fr.openwide.core.test.jpa.security.business.person.model.MockUserGroup;
public class TestCoreJpaUserDetailsService extends AbstractJpaSecurityTestCase {
@Autowired
private UserDetailsService coreJpaUserDetailsService;
@SuppressWarnings("unchecked")
@Test
public void testLoadUserByUsername() throws ServiceException, SecurityServiceException {
MockUserGroup adminGroup = createMockPersonGroup("adminGroup");
adminGroup.addAuthority(authorityService.getByName(CoreAuthorityConstants.ROLE_ADMIN));
MockUserGroup group1 = createMockPersonGroup("group1");
group1.addAuthority(authorityService.getByName(ROLE_GROUP_1));
MockUserGroup group2 = createMockPersonGroup("group2");
group2.addAuthority(authorityService.getByName(ROLE_GROUP_2));
mockUserGroupService.update(adminGroup);
mockUserGroupService.update(group1);
mockUserGroupService.update(group2);
MockUser personAdmin = createMockPerson("admin", "admin", "admin");
MockUser personGroup1 = createMockPerson("userGroup1", "userGroup1", "userGroup1");
MockUser personGroup2 = createMockPerson("userGroup2", "userGroup2", "userGroup2");
mockUserGroupService.addUser(adminGroup, personAdmin);
mockUserGroupService.addUser(group1, personGroup1);
mockUserGroupService.addUser(group2, personGroup2);
Collection<GrantedAuthority> grantedAuthorities;
Iterator<GrantedAuthority> iterator;
UserDetails userDetails;
// Admin person
userDetails = coreJpaUserDetailsService.loadUserByUsername(personAdmin.getUserName());
grantedAuthorities = (Collection<GrantedAuthority>) userDetails.getAuthorities();
assertEquals(6, grantedAuthorities.size());
iterator = grantedAuthorities.iterator();
assertEquals(CoreAuthorityConstants.ROLE_ADMIN, iterator.next().getAuthority());
assertEquals(CoreAuthorityConstants.ROLE_ANONYMOUS, iterator.next().getAuthority());
assertEquals(CoreAuthorityConstants.ROLE_AUTHENTICATED, iterator.next().getAuthority());
assertEquals(ROLE_GROUP_1, iterator.next().getAuthority());
assertEquals(ROLE_GROUP_2, iterator.next().getAuthority());
assertEquals(ROLE_GROUP_3, iterator.next().getAuthority());
// Group1 person
userDetails = coreJpaUserDetailsService.loadUserByUsername(personGroup1.getUserName());
grantedAuthorities = (Collection<GrantedAuthority>) userDetails.getAuthorities();
assertEquals(4, grantedAuthorities.size());
iterator = grantedAuthorities.iterator();
assertEquals(CoreAuthorityConstants.ROLE_ANONYMOUS, iterator.next().getAuthority());
assertEquals(CoreAuthorityConstants.ROLE_AUTHENTICATED, iterator.next().getAuthority());
assertEquals(ROLE_GROUP_1, iterator.next().getAuthority());
assertEquals(ROLE_GROUP_3, iterator.next().getAuthority());
// Group2 person
userDetails = coreJpaUserDetailsService.loadUserByUsername(personGroup2.getUserName());
grantedAuthorities = (Collection<GrantedAuthority>) userDetails.getAuthorities();
assertEquals(3, grantedAuthorities.size());
iterator = grantedAuthorities.iterator();
assertEquals(CoreAuthorityConstants.ROLE_ANONYMOUS, iterator.next().getAuthority());
assertEquals(CoreAuthorityConstants.ROLE_AUTHENTICATED, iterator.next().getAuthority());
assertEquals(ROLE_GROUP_2, iterator.next().getAuthority());
// Test reimplemented QueryDSL methods
MockUser personInactive = createMockPerson("inactive", "inactive", "inactive");
personInactive.setActive(false);
mockUserService.update(personInactive);
assertEquals(group1, mockUserGroupService.getByName("group1"));
assertEquals(new Long(4), mockUserService.count());
assertEquals(new Long(3), mockUserService.countActive());
}
}