/* * 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.report.service; import com.google.common.collect.Lists; import net.rrm.ehour.domain.*; import net.rrm.ehour.persistence.project.dao.ProjectDao; import net.rrm.ehour.persistence.report.dao.ReportAggregatedDao; import net.rrm.ehour.persistence.user.dao.UserDao; import net.rrm.ehour.persistence.user.dao.UserDepartmentDao; import net.rrm.ehour.report.criteria.ReportCriteria; import net.rrm.ehour.report.criteria.ReportCriteriaUpdateType; import net.rrm.ehour.report.criteria.UserSelectedCriteria; import net.rrm.ehour.timesheet.service.TimesheetLockService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import scala.Tuple2; import scala.collection.immutable.List$; import java.util.Arrays; import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class ReportCriteriaServiceImplTest { private ReportCriteriaServiceImpl reportCriteriaService; @Mock private ReportAggregatedDao reportAggregatedDAO; @Mock private UserDepartmentDao userDepartmentDAO; @Mock private CustomerAndProjectCriteriaFilter customerAndProjectCriteriaFilter; @Mock private UserAndDepartmentCriteriaFilter userAndDepartmentCriteriaFilter; @Mock private IndividualUserCriteriaSync individualUserCriteriaSync; @Mock private TimesheetLockService timesheetLockService; @Mock private UserDao userDao; @Mock private ProjectDao projectDao; @Before public void setup() { reportCriteriaService = new ReportCriteriaServiceImpl(reportAggregatedDAO, customerAndProjectCriteriaFilter, userAndDepartmentCriteriaFilter, individualUserCriteriaSync, timesheetLockService, userDao, projectDao); when(timesheetLockService.findAll()).thenReturn(List$.MODULE$.<TimesheetLock>empty()); } @Test public void should_sync_criteria_for_single_user() { UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); userSelectedCriteria.setSelectedReportType(UserSelectedCriteria.ReportType.INDIVIDUAL_USER); userSelectedCriteria.setUsers(Arrays.asList(new User(1))); ReportCriteria reportCriteria = new ReportCriteria(userSelectedCriteria); reportCriteriaService.syncUserReportCriteria(reportCriteria, ReportCriteriaUpdateType.UPDATE_ALL); verify(individualUserCriteriaSync).syncCriteriaForIndividualUser(reportCriteria); } @Test public void should_sync_criteria_for_global_for_all_users() { UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); userSelectedCriteria.setSelectedReportType(UserSelectedCriteria.ReportType.REPORT); userSelectedCriteria.setUsers(Arrays.asList(new User(1))); ReportCriteria reportCriteria = new ReportCriteria(userSelectedCriteria); Tuple2<List<UserDepartment>, List<User>> apply = new Tuple2<List<UserDepartment>, List<User>>(Lists.<UserDepartment>newArrayList(), Lists.<User>newArrayList()); when(userAndDepartmentCriteriaFilter.getAvailableUsers(userSelectedCriteria)).thenReturn(apply); reportCriteriaService.syncUserReportCriteria(reportCriteria, ReportCriteriaUpdateType.UPDATE_USERS_AND_DEPTS); verify(userAndDepartmentCriteriaFilter).getAvailableUsers(userSelectedCriteria); } @Test public void should_sync_criteria_for_global_for_all_customers() { UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); userSelectedCriteria.setSelectedReportType(UserSelectedCriteria.ReportType.REPORT); userSelectedCriteria.setUsers(Arrays.asList(new User(1))); Tuple2<List<Customer>, List<Project>> apply = new Tuple2<List<Customer>, List<Project>>(Lists.<Customer>newArrayList(), Lists.<Project>newArrayList()); when(customerAndProjectCriteriaFilter.getAvailableCustomers(userSelectedCriteria)).thenReturn(apply); ReportCriteria reportCriteria = new ReportCriteria(userSelectedCriteria); reportCriteriaService.syncUserReportCriteria(reportCriteria, ReportCriteriaUpdateType.UPDATE_CUSTOMERS_AND_PROJECTS); verify(customerAndProjectCriteriaFilter).getAvailableCustomers(userSelectedCriteria); } @Test public void should_return_empty_users_and_projects_when_no_filter_is_provided() { UsersAndProjects usersAndProjects = reportCriteriaService.criteriaToUsersAndProjects(new UserSelectedCriteria()); assertTrue("Users should be empty", usersAndProjects.getUsers().isEmpty()); assertTrue("Projects should be empty", usersAndProjects.getProjects().isEmpty()); } @Test public void should_return_single_user_when_its_provided() { User user = UserObjectMother.createUser(); UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); userSelectedCriteria.setUsers(Lists.newArrayList(user)); UsersAndProjects usersAndProjects = reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria); assertThat(userSelectedCriteria.getUsers(), contains(user)); assertTrue("Projects should be empty", usersAndProjects.getProjects().isEmpty()); } @Test public void should_find_users_when_a_department_is_provided() { UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); UserDepartment userDepartment = UserDepartmentObjectMother.createUserDepartment(1); userSelectedCriteria.setDepartments(Lists.newArrayList(userDepartment)); User matchingUser = UserObjectMother.createUser(); matchingUser.setUserDepartment(userDepartment); User nonMatchingUser = UserObjectMother.createUser(); UserDepartment wrongDepartment = UserDepartmentObjectMother.createUserDepartment(2); wrongDepartment.setCode("cc"); nonMatchingUser.setUserDepartment(wrongDepartment); when(userDao.findUsers(true)).thenReturn(Lists.newArrayList(matchingUser, nonMatchingUser)); UsersAndProjects usersAndProjects = reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria); assertEquals(1, usersAndProjects.getUsers().size()); assertThat(usersAndProjects.getUsers(), contains(matchingUser)); assertTrue("Projects should be empty", usersAndProjects.getProjects().isEmpty()); } @Test public void should_find_projects_when_project_is_provided() { Project project = ProjectObjectMother.createProject(1); UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); userSelectedCriteria.setProjects(Lists.newArrayList(project)); UsersAndProjects usersAndProjects = reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria); assertThat(userSelectedCriteria.getProjects(), contains(project)); assertTrue("Users should be empty", usersAndProjects.getUsers().isEmpty()); } @Test public void should_find_projects_when_customer_is_provided() { Customer customer = CustomerObjectMother.createCustomer(); UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); List<Customer> customers = Lists.newArrayList(customer); userSelectedCriteria.setCustomers(customers); Project project = ProjectObjectMother.createProject(1); when(projectDao.findProjectForCustomers(customers, true)).thenReturn(Lists.newArrayList(project)); UsersAndProjects usersAndProjects = reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria); assertThat(usersAndProjects.getProjects(), contains(project)); assertTrue("Users should be empty", usersAndProjects.getUsers().isEmpty()); } @Test public void should_find_only_billable_projects() { UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria(); Project billableProject = ProjectObjectMother.createProject(1); billableProject.setBillable(true); Project notBillableProject = ProjectObjectMother.createProject(2); notBillableProject.setBillable(false); when(projectDao.findAllActive()).thenReturn(Lists.newArrayList(billableProject, notBillableProject)); userSelectedCriteria.setOnlyBillableProjects(true); UsersAndProjects usersAndProjects = reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria); assertEquals(1, usersAndProjects.getProjects().size()); assertThat(usersAndProjects.getProjects(), contains(billableProject)); assertTrue("Users should be empty", usersAndProjects.getUsers().isEmpty()); } }