/*******************************************************************************
* ===========================================================
* Ankush : Big Data Cluster Management Solution
* ===========================================================
*
* (C) Copyright 2014, by Impetus Technologies
*
* This is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License (LGPL v3) as
* published by the Free Software Foundation;
*
* This software is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this software; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
******************************************************************************/
package com.impetus.ankush.admin.service.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.fail;
import java.util.Collections;
import javax.persistence.EntityNotFoundException;
import javax.persistence.PersistenceException;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.security.authentication.encoding.PasswordEncoder;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.test.context.ContextConfiguration;
import com.impetus.ankush.common.dao.UserDao;
import com.impetus.ankush.common.domain.Role;
import com.impetus.ankush.common.domain.User;
import com.impetus.ankush.common.exception.UserExistsException;
import com.impetus.ankush.common.service.UserManager;
import com.impetus.ankush.common.service.impl.UserManagerImpl;
@ContextConfiguration(locations = {
"classpath:/applicationContext-resources.xml",
"classpath:/applicationContext-dao.xml",
"classpath*:/applicationContext.xml",
"classpath:**/applicationContext*.xml" })
public class UserManagerImplTest {
private UserManager userManager;
private UserDao userDao;
private User user;
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
this.userDao = EasyMock.createMock(UserDao.class);
this.userManager = new UserManagerImpl();
this.userManager.setUserDao(userDao);
user = new User("testUser");
user.setPassword("junkPassword");
user.setFirstName("Test");
user.setLastName("User");
user.setEmail("user@test.com");
}
/**
* Test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#getUser(java.lang.String)}
* .
*/
@Test
public void testGetUser() {
user.setId(1L);
EasyMock.expect(userDao.get(user.getId())).andReturn(user);
EasyMock.replay(userDao);
assertSame("Incorrect user object returned", user,
userManager.getUser(user.getId().toString()));
}
/**
* Test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#getUsers()}.
*/
@Test
public void testGetUsers() {
EasyMock.expect(userDao.getAllDistinct()).andReturn(
Collections.singletonList(user));
EasyMock.replay(userDao);
assertEquals("Incorrect no of users returned", 1, userManager
.getUsers().size());
}
/**
* Test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#saveUser(com.impetus.ankush.common.domain.model.User)}
* .
* @throws UserExistsException
*/
@Test
public void testSaveUser() throws UserExistsException {
String originalUsername = user.getUsername();
((UserManagerImpl)userManager).setPasswordEncoder(null);
EasyMock.expect(userDao.saveUser(user)).andReturn(user);
EasyMock.replay(userDao);
User savedUser = userManager.saveUser(user);
assertEquals("username not lowercased", originalUsername.toLowerCase(), savedUser.getUsername());
}
/**
* Duplicate username test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#saveUser(com.impetus.ankush.common.domain.model.User)}
* .
* @throws UserExistsException
*/
@Test(expected=UserExistsException.class)
public void testSaveUserDuplicateUsername() throws UserExistsException {
((UserManagerImpl)userManager).setPasswordEncoder(null);
EasyMock.expect(userDao.saveUser(user)).andThrow(new DataIntegrityViolationException(("duplicate username")));
EasyMock.replay(userDao);
userManager.saveUser(user);
fail("should throw an exception");
}
/**
* Duplicate username test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#saveUser(com.impetus.ankush.common.domain.model.User)}
* .
* @throws UserExistsException
*/
@Test(expected=UserExistsException.class)
public void testSaveUserJPAException() throws UserExistsException {
((UserManagerImpl)userManager).setPasswordEncoder(null);
EasyMock.expect(userDao.saveUser(user)).andThrow(new JpaSystemException(new PersistenceException()));
EasyMock.replay(userDao);
userManager.saveUser(user);
fail("should throw an exception");
}
/**
* Password encryption test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#saveUser(com.impetus.ankush.common.domain.model.User)}
* .
* @throws UserExistsException
*/
@Test
public void testSaveUserPasswordEncryptionChanged() throws UserExistsException {
user.setVersion(1);
user.setUsername(user.getUsername().toLowerCase());
String encryptedPassword = "ENCRYPTED"+user.getPassword();
PasswordEncoder passwordEncoder = EasyMock.createMock(PasswordEncoder.class);
((UserManagerImpl)userManager).setPasswordEncoder(passwordEncoder);
EasyMock.expect(passwordEncoder.encodePassword(user.getPassword(), null)).andReturn(encryptedPassword);
EasyMock.expect(userDao.getUserPassword(user.getUsername())).andReturn(user.getPassword()+"Old");
EasyMock.expect(userDao.saveUser(user)).andReturn(user);
EasyMock.replay(userDao, passwordEncoder);
userManager.saveUser(user);
assertEquals("password not encrypted", encryptedPassword, user.getPassword());
}
/**
* Password encryption test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#saveUser(com.impetus.ankush.common.domain.model.User)}
* .
* @throws UserExistsException
*/
@Test
public void testSaveUserPasswordEncryptionNew() throws UserExistsException {
user.setVersion(1);
user.setUsername(user.getUsername().toLowerCase());
String encryptedPassword = "ENCRYPTED"+user.getPassword();
PasswordEncoder passwordEncoder = EasyMock.createMock(PasswordEncoder.class);
((UserManagerImpl)userManager).setPasswordEncoder(passwordEncoder);
EasyMock.expect(passwordEncoder.encodePassword(user.getPassword(), null)).andReturn(encryptedPassword);
EasyMock.expect(userDao.getUserPassword(user.getUsername())).andReturn(null);
EasyMock.expect(userDao.saveUser(user)).andReturn(user);
EasyMock.replay(userDao, passwordEncoder);
userManager.saveUser(user);
assertEquals("password not encrypted", encryptedPassword, user.getPassword());
}
/**
* Password encryption test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#saveUser(com.impetus.ankush.common.domain.model.User)}
* .
* @throws UserExistsException
*/
@Test
public void testSaveUserPasswordEncryptionUnchanged() throws UserExistsException {
user.setVersion(1);
user.setUsername(user.getUsername().toLowerCase());
String encryptedPassword = "ENCRYPTED"+user.getPassword();
user.setPassword(encryptedPassword);
PasswordEncoder passwordEncoder = EasyMock.createStrictMock(PasswordEncoder.class);
((UserManagerImpl)userManager).setPasswordEncoder(passwordEncoder);
EasyMock.expect(userDao.getUserPassword(user.getUsername())).andReturn(encryptedPassword);
EasyMock.expect(userDao.saveUser(user)).andReturn(user);
EasyMock.replay(userDao, passwordEncoder);
userManager.saveUser(user);
assertEquals("password not encrypted", encryptedPassword, user.getPassword());
}
/**
* Test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#removeUser(java.lang.String)}
* .
*/
@Test(expected = EntityNotFoundException.class)
public void testRemoveUser() {
user.setId(1L);
userDao.remove(user.getId());
EasyMock.expectLastCall();
EasyMock.expect(userDao.get(user.getId())).andThrow(
new EntityNotFoundException());
EasyMock.replay(userDao);
userManager.removeUser(user.getId().toString());
userManager.getUser(user.getId().toString());
}
/**
* Test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#getUserByUsername(java.lang.String)}
* .
*/
@Test
public void testGetUserByUsername() {
user.setId(1L);
EasyMock.expect(userDao.loadUserByUsername(user.getUsername()))
.andReturn(user);
EasyMock.replay(userDao);
assertSame("incorrect user returned", user,
userManager.getUserByUsername(user.getUsername()));
}
/**
* Negative test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#getUserByUsername(java.lang.String)}
* .
*/
@Test(expected = UsernameNotFoundException.class)
public void testGetUserByUsernameNegative() {
user.setId(1L);
EasyMock.expect(userDao.loadUserByUsername(user.getUsername()))
.andThrow(
new UsernameNotFoundException(user.getUsername()
+ " not found"));
EasyMock.replay(userDao);
userManager.getUserByUsername(user.getUsername());
}
/**
* test method for
* {@link com.impetus.ankush.service.impl.UserManagerImpl#getUsersByRole(java.lang.String)}
* .
*/
@Test
public void testGetUsersByRole() {
Role role = new Role("testRole");
user.setId(1L);
user.getRoles().add(role);
EasyMock.expect(userDao.getUsersByRole(role)).andReturn(Collections.singletonList(user));
EasyMock.replay(userDao);
assertSame("incorrect user returned", user, userManager.getUsersByRole(role).get(0));
}
}