/*
* 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.data.DateRange;
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.project.service.ProjectAssignmentService;
import net.rrm.ehour.report.criteria.ReportCriteria;
import net.rrm.ehour.report.criteria.UserSelectedCriteria;
import net.rrm.ehour.report.reports.ProjectManagerReport;
import net.rrm.ehour.report.reports.ReportData;
import net.rrm.ehour.report.reports.element.AssignmentAggregateReportElement;
import net.rrm.ehour.report.reports.element.AssignmentAggregateReportElementMother;
import net.rrm.ehour.timesheet.service.TimesheetLockService;
import org.joda.time.Interval;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import scala.collection.convert.WrapAsScala$;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import static org.junit.Assert.assertEquals;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.when;
@SuppressWarnings("unchecked")
@RunWith(MockitoJUnitRunner.class)
public class AggregateReportServiceImplTest {
private AggregateReportServiceImpl aggregateReportService;
@Mock
private ReportCriteriaService reportCriteriaService;
@Mock
private ProjectDao projectDao;
@Mock
private ReportAggregatedDao reportAggregatedDao;
@Mock
private ProjectAssignmentService assignmentService;
@Mock
private TimesheetLockService timesheetLockService;
@Before
public void setUp() {
aggregateReportService = new AggregateReportServiceImpl(assignmentService, reportCriteriaService, projectDao, timesheetLockService, reportAggregatedDao);
when(timesheetLockService.findLockedDatesInRange(any(Date.class), any(Date.class)))
.thenReturn(WrapAsScala$.MODULE$.asScalaBuffer(Lists.<Interval>newArrayList()));
}
@Test
public void should_create_report_for_single_user() {
DateRange dateRange = new DateRange();
UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria();
userSelectedCriteria.setReportRange(dateRange);
List<User> users = filterOnSingleUser(userSelectedCriteria);
userSelectedCriteria.setUsers(users);
ReportCriteria criteria = new ReportCriteria(userSelectedCriteria);
List<AssignmentAggregateReportElement> pags = createAssignmentAggregateReportElements();
when(reportAggregatedDao.getCumulatedHoursPerAssignmentForUsers(eq(users), any(DateRange.class))).thenReturn(pags);
ReportData data = aggregateReportService.getAggregateReportData(criteria);
assertEquals(3, data.getReportElements().size());
}
private List<User> filterOnSingleUser(UserSelectedCriteria userSelectedCriteria) {
List<User> users = Lists.newArrayList(UserObjectMother.createUser());
List<Project> projects = Lists.newArrayList();
UsersAndProjects usersAndProjects = new UsersAndProjects(users, projects);
when(reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria)).thenReturn(usersAndProjects);
return users;
}
@Test
public void should_create_global_report() {
DateRange dateRange = new DateRange();
UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria();
userSelectedCriteria.setReportRange(dateRange);
ReportCriteria reportCriteria = new ReportCriteria(userSelectedCriteria);
List<AssignmentAggregateReportElement> pags = createAssignmentAggregateReportElements();
when(reportAggregatedDao.getCumulatedHoursPerAssignment(any(DateRange.class))).thenReturn(pags);
when(reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria)).thenReturn(new UsersAndProjects());
ReportData data = aggregateReportService.getAggregateReportData(reportCriteria);
assertEquals(3, data.getReportElements().size());
}
@Test
public void should_create_report_for_specific_project() {
DateRange dateRange = new DateRange();
UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria();
userSelectedCriteria.setReportRange(dateRange);
ReportCriteria reportCriteria = new ReportCriteria(userSelectedCriteria);
List<Project> projects = filterOnSingleProject(userSelectedCriteria);
List<AssignmentAggregateReportElement> pags = createAssignmentAggregateReportElements();
when(reportAggregatedDao.getCumulatedHoursPerAssignmentForProjects(eq(projects), any(DateRange.class))).thenReturn(pags);
ReportData data = aggregateReportService.getAggregateReportData(reportCriteria);
assertEquals(3, data.getReportElements().size());
}
private List<Project> filterOnSingleProject(UserSelectedCriteria userSelectedCriteria) {
List<User> users = Lists.newArrayList();
List<Project> projects = Lists.newArrayList(ProjectObjectMother.createProject(1));
UsersAndProjects usersAndProjects = new UsersAndProjects(users, projects);
when(reportCriteriaService.criteriaToUsersAndProjects(userSelectedCriteria)).thenReturn(usersAndProjects);
return projects;
}
private List<AssignmentAggregateReportElement> createAssignmentAggregateReportElements() {
List<AssignmentAggregateReportElement> pags = new ArrayList<>();
pags.add(AssignmentAggregateReportElementMother.createProjectAssignmentAggregate(1, 1, 1));
pags.add(AssignmentAggregateReportElementMother.createProjectAssignmentAggregate(2, 2, 2));
pags.add(AssignmentAggregateReportElementMother.createProjectAssignmentAggregate(3, 3, 3));
return pags;
}
@Test
public void should_create_pm_detailed_report() {
Project project = new Project(1);
project.setProjectCode("PRJ");
DateRange dr = new DateRange(new Date(), new Date());
when(reportAggregatedDao.getMinMaxDateTimesheetEntry(project)).thenReturn(dr);
List<AssignmentAggregateReportElement> elms = new ArrayList<>();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
elms.add(AssignmentAggregateReportElementMother.createProjectAssignmentAggregate(j, i, i));
}
}
when(reportAggregatedDao.getCumulatedHoursPerAssignmentForProjects(any(List.class), any(DateRange.class)))
.thenReturn(elms);
List<ProjectAssignment> assignments = new ArrayList<>();
assignments.add(ProjectAssignmentObjectMother.createProjectAssignment(2));
when(assignmentService.getProjectAssignments(project, dr)).thenReturn(assignments);
ProjectManagerReport report = aggregateReportService.getProjectManagerDetailedReport(project);
assertEquals(new Integer(1), report.getProject().getPK());
assertEquals(16, report.getAggregates().size());
}
@Test
public void should_create_pm_report() {
UserSelectedCriteria userSelectedCriteria = new UserSelectedCriteria();
User projectManager = new User(2);
userSelectedCriteria.setReportTypeToPM(projectManager);
Project pmProject = ProjectObjectMother.createProject(1);
when(projectDao.findActiveProjectsWhereUserIsPM(projectManager)).thenReturn(Lists.newArrayList(pmProject));
ProjectAssignment assignment = ProjectAssignmentObjectMother.createProjectAssignment(1);
assignment.getProject().setProjectId(1);
DateRange dateRange = new DateRange();
userSelectedCriteria.setReportRange(dateRange);
userSelectedCriteria.setOnlyActiveUsers(true);
ReportCriteria reportCriteria = new ReportCriteria(userSelectedCriteria);
List<AssignmentAggregateReportElement> elements = Lists.newArrayList();
AssignmentAggregateReportElement aggregate = AssignmentAggregateReportElementMother.createProjectAssignmentAggregate(1, 1, 1);
aggregate.getProjectAssignment().setProject(pmProject);
elements.add(aggregate);
elements.add(AssignmentAggregateReportElementMother.createProjectAssignmentAggregate(2, 2, 2));
elements.add(AssignmentAggregateReportElementMother.createProjectAssignmentAggregate(3, 3, 3));
List<User> userList = filterOnSingleUser(userSelectedCriteria);
when(reportAggregatedDao.getCumulatedHoursPerAssignmentForUsers(eq(userList), any(DateRange.class))).thenReturn(elements);
ReportData reportData = aggregateReportService.getAggregateReportData(reportCriteria);
assertEquals(1, reportData.getReportElements().size());
}
}