/**
* Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved.
* EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
* http://www.ewcms.com
*/
package com.ewcms.security.manage.service;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import junit.framework.TestCase;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import com.ewcms.security.core.session.EwcmsSessionRegistry;
import com.ewcms.security.core.session.EwcmsSessionRegistryImpl;
import com.ewcms.security.manage.dao.AuthorityDAOable;
import com.ewcms.security.manage.dao.GroupDAOable;
import com.ewcms.security.manage.dao.UserDAOable;
import com.ewcms.security.manage.model.Authority;
import com.ewcms.security.manage.model.Group;
import com.ewcms.security.manage.model.UserInfo;
/**
* Test {@link UsernameService}
*
* @author wangwei
*/
public class UserServiceTest extends TestCase{
private static final Calendar calendar = Calendar.getInstance();
@Test
public void testTimeIsNullNoExcpired(){
UserService service = new UserService();
assertTrue(service.noExpired(null, null));
}
@Test
public void testStartTimeLessCurrentTimeNoExpired(){
UserService service = new UserService();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, -2);
Date start = calendar.getTime();
assertTrue(service.noExpired(start, null));
}
@Test
public void testStartTimeThanCurrentTimeExpried(){
UserService service = new UserService();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, 2);
Date start = calendar.getTime();
assertFalse(service.noExpired(start, null));
}
@Test
public void testEndTimeLessCurrentTimeExpried(){
UserService service = new UserService();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, -2);
Date end = calendar.getTime();
assertFalse(service.noExpired(null, end));
}
@Test
public void testEndTimeLessCurrentTimeNoExpried(){
UserService service = new UserService();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, 2);
Date end = calendar.getTime();
assertTrue(service.noExpired(null, end));
}
@Test
public void testComplexTimeNoExpried(){
UserService service = new UserService();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, -2);
Date start = calendar.getTime();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, 2);
Date end = calendar.getTime();
assertTrue(service.noExpired(start, end));
}
@Test
public void testComplexTimeExpried(){
UserService service = new UserService();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, -2);
Date start = calendar.getTime();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.DATE, -1);
Date end = calendar.getTime();
assertFalse(service.noExpired(start, end));
}
@Test
public void testUsernameAlreadyExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenAnswer(new Answer<com.ewcms.security.manage.model.User>(){
@Override
public com.ewcms.security.manage.model.User answer(InvocationOnMock invocation) throws Throwable {
String username = (String)invocation.getArguments()[0];
com.ewcms.security.manage.model.User user = new com.ewcms.security.manage.model.User();
user.setUsername(username);
return user;
}
});
service.setUserDao(dao);
assertTrue(service.hasUsername("Pertty"));
}
@Test
public void testUsernameNoExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(null);
service.setUserDao(dao);
assertFalse(service.hasUsername("Pertty"));
}
@Test
public void testUsernameNoExistLoadUserByUsername(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(null);
service.setUserDao(dao);
try{
service.loadUserByUsername("Pertty");
fail();
}catch(UsernameNotFoundException e){
}
}
@Test
public void testGroupAuthorities(){
UserService service = new UserService();
Group group = new Group();
group.setName("GROUP_ADMIN");
Set<Authority> auths = new HashSet<Authority>();
auths.add(new Authority("ROLE_ADMIN",null));
auths.add(new Authority("ROLE_USER",null));
group.setAuthorities(auths);
Set<GrantedAuthority> grantedAuthorities = service.groupAuthorities(group);
assertEquals(grantedAuthorities.size(),3);
assertTrue(grantedAuthorities.contains(new GrantedAuthorityImpl("GROUP_ADMIN")));
}
@Test
public void testLoadUserByUsername(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenAnswer(new Answer<com.ewcms.security.manage.model.User>(){
@Override
public com.ewcms.security.manage.model.User answer(InvocationOnMock invocation) throws Throwable {
String username = (String)invocation.getArguments()[0];
com.ewcms.security.manage.model.User user = new com.ewcms.security.manage.model.User();
user.setUsername(username);
user.setEnabled(true);
user.setAccountEnd(null);
user.setAccountStart(null);
user.setPassword("123456");
Set<Authority> auths = new HashSet<Authority>();
auths.add(new Authority("ROLE_USER"));
auths.add(new Authority("ROLE_ADMIN"));
user.setAuthorities(auths);
Group group = new Group("GROUP_ADNIM");
Set<Group> groups =new HashSet<Group>();
groups.add(group);
user.setGroups(groups);
return user;
}
});
service.setUserDao(dao);
UserDetails details = service.loadUserByUsername("Pertty");
assertNotNull(details);
assertEquals("Pertty",details.getUsername());
assertEquals("123456",details.getPassword());
assertTrue(details.isEnabled());
assertTrue(details.isAccountNonExpired());
assertTrue(details.isAccountNonLocked());
assertTrue(details.isCredentialsNonExpired());
assertTrue(details.getAuthorities().size() == 3);
}
@Test
public void testPasswordNotEncoder(){
UserService service = new UserService();
User user = new User("Pertty","123456",true,true,true,true,new ArrayList<GrantedAuthority>());
String password = service.passwordEncoder(user, "123456");
assertEquals("123456",password);
}
@Test
public void testPasswordMd5(){
UserService service = new UserService();
service.setPasswordEncoder(new Md5PasswordEncoder());
User user = new User("Pertty","123456",true,true,true,true,new ArrayList<GrantedAuthority>());
String password = service.passwordEncoder(user, "123456");
assertFalse("123456".equals(password));
}
@Test
public void testUsernameExistAddUserFail(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(new com.ewcms.security.manage.model.User("Pertty"));
service.setUserDao(dao);
try{
service.addUser("Pertty","123456", true, null, null, null, null);
fail();
}catch(UserServiceException e){
}
}
@Test
public void testAddUser(){
UserService service = new UserService();
UserDAOable userDao = mock(UserDAOable.class);
when(userDao.get("Pertty")).thenReturn(null);
service.setUserDao(userDao);
service.addUser("Pertty","123456", true, null, null, new UserInfo(), null);
ArgumentCaptor<com.ewcms.security.manage.model.User> argument = ArgumentCaptor.forClass(com.ewcms.security.manage.model.User.class);
verify(userDao).persist(argument.capture());
assertEquals(argument.getValue().getUsername(),"Pertty");
assertTrue(argument.getValue().isEnabled());
assertEquals(argument.getValue().getPassword(),"123456");
assertNull(argument.getValue().getAccountEnd());
assertNull(argument.getValue().getAccountStart());
assertEquals(argument.getValue().getUserInfo().getUsername(),"Pertty");
assertEquals(argument.getValue().getUserInfo().getName(),"Pertty");
}
@Test
public void testAddUserPasswordDefaultEmpty(){
UserService service = new UserService();
UserDAOable userDao = mock(UserDAOable.class);
when(userDao.get("Pertty")).thenReturn(null);
service.setUserDao(userDao);
service.addUser("Pertty",null, true, null, null, new UserInfo(), null);
ArgumentCaptor<com.ewcms.security.manage.model.User> argument = ArgumentCaptor.forClass(com.ewcms.security.manage.model.User.class);
verify(userDao).persist(argument.capture());
assertEquals(argument.getValue().getPassword(),"666666");
}
@Test
public void testUsernameNoExistUpdateUserFail(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(null);
service.setUserDao(dao);
try{
service.updateUser("Pertty", true, null, null, null, null);
fail();
}catch(UserServiceException e){
}
}
@Test
public void testUpdateUser(){
UserService service = new UserService();
UserDAOable userDao = mock(UserDAOable.class);
when(userDao.get(any(String.class))).thenAnswer(new Answer<com.ewcms.security.manage.model.User>(){
@Override
public com.ewcms.security.manage.model.User answer(InvocationOnMock invocation) throws Throwable {
com.ewcms.security.manage.model.User user = new com.ewcms.security.manage.model.User();
user.setUsername((String)invocation.getArguments()[0]);
user.setEnabled(true);
user.setPassword("123456");
UserInfo userInfo = new UserInfo();
userInfo.setUsername((String)invocation.getArguments()[0]);
userInfo.setName((String)invocation.getArguments()[0]);
user.setUserInfo(userInfo);
return user;
}
});
service.setUserDao(userDao);
UserInfo info = new UserInfo();
info.setName("Pertty User");
info.setBirthday(new Date());
info.setEmail("pertty@xxxx.com");
info.setIdentification("1234567890");
info.setMphone("8798444");
info.setPhone("348533");
Calendar calendar = Calendar.getInstance();
Date start = calendar.getTime();
calendar.add(Calendar.DAY_OF_MONTH, 1);
Date end = calendar.getTime();
service.updateUser("Pertty",false, start, end, info, null);
ArgumentCaptor<com.ewcms.security.manage.model.User> argument = ArgumentCaptor.forClass(com.ewcms.security.manage.model.User.class);
verify(userDao).persist(argument.capture());
assertEquals(argument.getValue().getUsername(),"Pertty");
assertFalse(argument.getValue().isEnabled());
assertEquals(argument.getValue().getPassword(),"123456");
assertNotNull(argument.getValue().getAccountEnd());
assertNotNull(argument.getValue().getAccountStart());
assertEquals(argument.getValue().getUserInfo().getUsername(),"Pertty");
assertEquals(argument.getValue().getUserInfo().getName(),"Pertty User");
assertNotNull(argument.getValue().getUserInfo().getBirthday());
assertEquals(argument.getValue().getUserInfo().getEmail(),"pertty@xxxx.com");
assertEquals(argument.getValue().getUserInfo().getIdentification(),"1234567890");
assertEquals(argument.getValue().getUserInfo().getMphone(),"8798444");
assertEquals(argument.getValue().getUserInfo().getPhone(),"348533");
}
@Test
public void testRemoveAuthoritiesInUserButUserNoExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(null);
service.setUserDao(dao);
try{
service.removeAuthoritiesInUser("Pertty", new HashSet<String>());
fail();
}catch(UserServiceException e){
}
}
@Test
public void testRemoveAuthoritiesInGroup()throws UserServiceException{
UserService service = new UserService();
com.ewcms.security.manage.model.User user = new com.ewcms.security.manage.model.User();
user.setUsername("pertty");
Set<Authority> authorities= new HashSet<Authority>();
authorities.add(new Authority("ROLE_ADMIN"));
authorities.add(new Authority("ROLE_USER"));
user.setAuthorities(authorities);
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(user);
service.setUserDao(dao);
EwcmsSessionRegistry sessionRegistry = new EwcmsSessionRegistryImpl();
sessionRegistry.registerNewSession("adminid", "admin");
sessionRegistry.registerNewSession("userid", "user");
sessionRegistry.registerNewSession("perttyid", "pertty");
service.setSessionRegistry(sessionRegistry);
Set<String> removeAuthNames = new HashSet<String>();
removeAuthNames.add("ROLE_USER");
service.removeAuthoritiesInUser("pertty", removeAuthNames);
assertTrue(user.getAuthorities().size() == 1);
assertEquals(user.getAuthorities().iterator().next().getName(),"ROLE_ADMIN");
assertFalse(sessionRegistry.getAllSessions("admin", true).isEmpty());
assertFalse(sessionRegistry.getAllSessions("user", true).isEmpty());
assertTrue(sessionRegistry.getAllSessions("pertty", true).isEmpty());
}
@Test
public void testAddAuthoritiesToUsersButGroupNoExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(null);
service.setUserDao(dao);
try{
Set<String> authnames = new HashSet<String>();
authnames.add("ROLE_USER");
service.addAuthoritiesToUser("pertty", authnames);
fail();
}catch(UserServiceException e){
}
}
@Test
public void testAddAuthoritiesToGroupButAuthorityNoExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(new com.ewcms.security.manage.model.User());
service.setUserDao(dao);
AuthorityDAOable authDao = mock(AuthorityDAOable.class);
when(authDao.get(any(String.class))).thenReturn(null);
service.setAuthorityDao(authDao);
try{
Set<String> authnames = new HashSet<String>();
authnames.add("ROLE_USER");
service.addAuthoritiesToUser("pertty", authnames);
fail();
}catch(UserServiceException e){
}
}
@Test
public void testAddAuthoritiesToUser(){
UserService service = new UserService();
com.ewcms.security.manage.model.User user = new com.ewcms.security.manage.model.User();
user.setUsername("pertty");
Set<Authority> authorities= new HashSet<Authority>();
authorities.add(new Authority("ROLE_ADMIN"));
user.setAuthorities(authorities);
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(user);
service.setUserDao(dao);
AuthorityDAOable authDao = mock(AuthorityDAOable.class);
when(authDao.get("ROLE_ADMIN")).thenReturn(new Authority("ROLE_ADMIN"));
when(authDao.get("ROLE_USER")).thenReturn(new Authority("ROLE_USER"));
service.setAuthorityDao(authDao);
EwcmsSessionRegistry sessionRegistry = new EwcmsSessionRegistryImpl();
sessionRegistry.registerNewSession("adminid", "admin");
sessionRegistry.registerNewSession("userid", "user");
sessionRegistry.registerNewSession("perttyid", "pertty");
service.setSessionRegistry(sessionRegistry);
Set<String> authnames = new HashSet<String>();
authnames.add("ROLE_ADMIN");
authnames.add("ROLE_USER");
Set<Authority> newAuthorities = service.addAuthoritiesToUser("pertty",authnames);
assertTrue(user.getAuthorities().size() == 2);
assertTrue(newAuthorities.size() == 1);
assertEquals(newAuthorities.iterator().next().getName(),"ROLE_USER");
assertFalse(sessionRegistry.getAllSessions("admin", true).isEmpty());
assertFalse(sessionRegistry.getAllSessions("user", true).isEmpty());
assertTrue(sessionRegistry.getAllSessions("pertty", true).isEmpty());
}
@Test
public void testRemoveGroupsInUserButUserNoExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(null);
service.setUserDao(dao);
try{
service.removeGroupsInUser("pertty", new HashSet<String>());
fail();
}catch(UserServiceException e){
}
}
@Test
public void testRemoveGroupsInUser()throws UserServiceException{
UserService service = new UserService();
com.ewcms.security.manage.model.User user = new com.ewcms.security.manage.model.User();
user.setUsername("pertty");
Set<Group> groups = new HashSet<Group>();
groups.add(new Group("GROUP_ADMIN"));
groups.add(new Group("GROUP_USER"));
groups.add(new Group("GROUP_TEST"));
user.setGroups(groups);
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(user);
service.setUserDao(dao);
EwcmsSessionRegistry sessionRegistry = new EwcmsSessionRegistryImpl();
sessionRegistry.registerNewSession("adminid", "admin");
sessionRegistry.registerNewSession("userid", "user");
sessionRegistry.registerNewSession("perttyid", "pertty");
service.setSessionRegistry(sessionRegistry);
Set<String> removeGroupNames = new HashSet<String>();
removeGroupNames.add("GROUP_TEST");
removeGroupNames.add("GROUP_USER");
service.removeGroupsInUser("pertty", removeGroupNames);
assertTrue(user.getGroups().size() == 1);
assertEquals(user.getGroups().iterator().next().getName(),"GROUP_ADMIN");
assertFalse(sessionRegistry.getAllSessions("admin", true).isEmpty());
assertFalse(sessionRegistry.getAllSessions("user", true).isEmpty());
assertTrue(sessionRegistry.getAllSessions("pertty", true).isEmpty());
}
@Test
public void testAddUsersToGroupButUserNoExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(null);
service.setUserDao(dao);
try{
Set<String> names = new HashSet<String>();
names.add("GROUP_ADMIN");
service.addGroupsToUser("pertty", names);
fail();
}catch(UserServiceException e){
}
}
@Test
public void testAddGroupsToUserButUserNoExist(){
UserService service = new UserService();
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(new com.ewcms.security.manage.model.User());
service.setUserDao(dao);
GroupDAOable groupDao = mock(GroupDAOable.class);
when(groupDao.get(any(String.class))).thenReturn(null);
service.setGroupDao(groupDao);
try{
Set<String> names = new HashSet<String>();
names.add("GROUP_ADMIN");
service.addGroupsToUser("pertty", names);
fail();
}catch(UserServiceException e){
}
}
@Test
public void testAddGroupsToUser(){
UserService service = new UserService();
com.ewcms.security.manage.model.User user = new com.ewcms.security.manage.model.User();
user.setUsername("pertty");
Set<Group> groups = new HashSet<Group>();
groups.add(new Group("GROUP_ADMIN"));
user.setGroups(groups);
UserDAOable dao = mock(UserDAOable.class);
when(dao.get(any(String.class))).thenReturn(user);
service.setUserDao(dao);
GroupDAOable gropDao = mock(GroupDAOable.class);
when(gropDao.get("GROUP_USER")).thenReturn(new Group("GROUP_USER"));
when(gropDao.get("GROUP_TEST")).thenReturn(new Group("GROUP_TEST"));
service.setGroupDao(gropDao);
EwcmsSessionRegistry sessionRegistry = new EwcmsSessionRegistryImpl();
sessionRegistry.registerNewSession("adminid", "admin");
sessionRegistry.registerNewSession("userid", "user");
sessionRegistry.registerNewSession("perttyid", "pertty");
service.setSessionRegistry(sessionRegistry);
Set<String> names = new HashSet<String>();
names.add("GROUP_USER");
names.add("GROUP_TEST");
Set<Group> newUsers = service.addGroupsToUser("pertty",names);
assertTrue(user.getGroups().size() == 3);
assertTrue(newUsers.size() == 2);
assertFalse(sessionRegistry.getAllSessions("admin", true).isEmpty());
assertFalse(sessionRegistry.getAllSessions("user", true).isEmpty());
assertTrue(sessionRegistry.getAllSessions("pertty", true).isEmpty());
}
}