/*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package net.rrm.ehour.user.service;
import net.rrm.ehour.domain.*;
import net.rrm.ehour.exception.ObjectNotFoundException;
import net.rrm.ehour.exception.ObjectNotUniqueException;
import net.rrm.ehour.persistence.user.dao.UserDao;
import net.rrm.ehour.persistence.user.dao.UserDepartmentDao;
import net.rrm.ehour.persistence.user.dao.UserRoleDao;
import net.rrm.ehour.project.service.ProjectAssignmentManagementService;
import org.junit.Before;
import org.junit.Test;
import org.springframework.security.authentication.encoding.ShaPasswordEncoder;
import java.util.*;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.*;
public class UserServiceImplTest {
private UserServiceImpl userService;
private UserDao userDAO;
private UserDepartmentDao userDepartmentDAO;
private ProjectAssignmentManagementService assignmentService;
@Before
public void setUp() {
userService = new UserServiceImpl();
userDAO = mock(UserDao.class);
userDepartmentDAO = mock(UserDepartmentDao.class);
UserRoleDao userRoleDAO = mock(UserRoleDao.class);
assignmentService = mock(ProjectAssignmentManagementService.class);
userService.setUserDAO(userDAO);
userService.setUserDepartmentDAO(userDepartmentDAO);
userService.setUserRoleDAO(userRoleDAO);
userService.setProjectAssignmentManagementService(assignmentService);
userService.setPasswordEncoder(new ShaPasswordEncoder(1));
}
@Test
public void shouldGetActiveUsers() {
when(userDAO.findActiveUsers()).thenReturn(new ArrayList<User>());
userService.getActiveUsers();
verify(userDAO).findActiveUsers();
}
@Test
public void testGetUser() throws ObjectNotFoundException {
User user;
ProjectAssignment assignmentA, assignmentB;
Project projectA, projectB;
Set<ProjectAssignment> assignments = new HashSet<>();
Calendar calA, calB;
user = new User("thies", "pwd");
projectA = new Project();
projectA.setActive(true);
assignmentA = new ProjectAssignment();
assignmentA.setAssignmentId(1);
assignmentA.setAssignmentType(new ProjectAssignmentType(0));
calA = new GregorianCalendar();
calA.add(Calendar.MONTH, -5);
assignmentA.setDateStart(calA.getTime());
calA.add(Calendar.MONTH, 1);
assignmentA.setDateEnd(calA.getTime());
assignmentA.setProject(projectA);
assignments.add(assignmentA);
projectB = new Project();
projectB.setActive(true);
assignmentB = new ProjectAssignment();
assignmentB.setAssignmentId(2);
assignmentB.setAssignmentType(new ProjectAssignmentType(0));
calB = new GregorianCalendar();
calB.add(Calendar.MONTH, -2);
assignmentB.setDateStart(calB.getTime());
calB = new GregorianCalendar();
calB.add(Calendar.MONTH, 1);
assignmentB.setDateEnd(calB.getTime());
assignmentB.setProject(projectB);
assignments.add(assignmentB);
user.setProjectAssignments(assignments);
when(userDAO.findById(1))
.thenReturn(user);
user = userService.getUser(1);
verify(userDAO).findById(1);
assertEquals("thies", user.getUsername());
assertEquals(1, user.getProjectAssignments().size());
assertEquals(1, user.getInactiveProjectAssignments().size());
}
@Test
public void testGetUserDepartment() throws ObjectNotFoundException {
UserDepartment ud;
when(userDepartmentDAO.findById(1))
.thenReturn(new UserDepartment(1, "bla", "ble"));
ud = userService.getUserDepartment(1);
verify(userDepartmentDAO).findById(1);
assertEquals("bla", ud.getName());
}
@Test
public void testGetUserRoles() {
List<UserRole> userRoles = userService.getUserRoles();
assertEquals(UserRole.ROLES.size(), userRoles.size());
}
@Test
public void testAddAndcheckProjectManagementRoles() {
User user = new User(1);
user.setPassword("aa");
user.setSalt(2);
user.setUsername("user");
when(userDAO.findById(1))
.thenReturn(user);
when(userDAO.persist(user))
.thenReturn(user);
userDAO.deletePmWithoutProject();
userService.validateProjectManagementRoles(1);
assertEquals("aa", user.getPassword());
}
@Test
public void shouldUpdatePassword() throws ObjectNotUniqueException {
User user = new User(1);
user.setPassword("aa");
user.setUsername("user");
when(userDAO.findByUsername("user")).thenReturn(user);
when(userDAO.persist(any(User.class))).thenReturn(user);
userService.changePassword("user", "pwd");
assertFalse(user.getPassword().equals("pwd"));
}
@Test
public void shouldCreateNewUser() throws ObjectNotUniqueException {
User user = UserObjectMother.createUser();
when(userDAO.findByUsername(user.getUsername())).thenReturn(null);
when(userDAO.persist(user)).thenReturn(user);
when(assignmentService.assignUserToDefaultProjects(user)).thenReturn(user);
userService.persistNewUser(user, "password");
verify(assignmentService).assignUserToDefaultProjects(user);
assertNotSame("password", user.getPassword());
}
@Test
public void shouldChangeUsername() throws ObjectNotUniqueException {
User user = UserObjectMother.createUser();
User persistedUser = new User();
when(userDAO.findByUsername(user.getUsername())).thenReturn(null);
when(userDAO.findById(user.getUserId())).thenReturn(persistedUser);
when(userDAO.persist(persistedUser)).thenReturn(persistedUser);
userService.persistEditedUser(user);
verify(userDAO).persist(persistedUser);
}
}