package net.rrm.ehour.project.service; import com.google.common.collect.Lists; import net.rrm.ehour.domain.*; import net.rrm.ehour.exception.ProjectAlreadyAssignedException; import net.rrm.ehour.persistence.project.dao.ProjectAssignmentDao; import net.rrm.ehour.persistence.project.dao.ProjectDao; import net.rrm.ehour.persistence.timesheet.dao.TimesheetDao; import net.rrm.ehour.persistence.user.dao.UserDao; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.Arrays; import java.util.Date; import java.util.List; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsIterableContainingInOrder.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; import static org.mockito.Mockito.*; @RunWith(MockitoJUnitRunner.class) public class ProjectAssignmentManagementServiceImplTest { private ProjectAssignmentManagementServiceImpl service; @Mock private ProjectAssignmentDao projectAssignmentDao; @Mock private ProjectDao projectDao; @Mock private UserDao userDao; @Mock private TimesheetDao timesheetDao; @Before public void setUp() { service = new ProjectAssignmentManagementServiceImpl(userDao, projectDao, projectAssignmentDao, timesheetDao); } @Test public void should_assign_user_to_project() throws ProjectAlreadyAssignedException { ProjectAssignment projectAssignment = ProjectAssignmentObjectMother.createProjectAssignment(1); service.persistNewProjectAssignment(projectAssignment); verify(projectAssignmentDao).persist(projectAssignment); } @Test public void should_assign_user_to_default_projects() { Project project = ProjectObjectMother.createProject(1); when(projectDao.findDefaultProjects()).thenReturn(Arrays.asList(project)); User user = UserObjectMother.createUser(); service.assignUserToDefaultProjects(user); verify(projectAssignmentDao).persist(any(ProjectAssignment.class)); } @Test public void should_assign_users_to_project_using_template_assignment() { ProjectAssignment templateAssignment = ProjectAssignmentObjectMother.createProjectAssignment(1); templateAssignment.setAllottedHours(5f); User userA = UserObjectMother.createUser(); userA.setLastName("A"); User userB = UserObjectMother.createUser(); userB.setLastName("B"); userB.setUserId(2); List<User> users = Arrays.asList(userA, userB); service.assignUsersToProjects(users, templateAssignment); ArgumentCaptor<ProjectAssignment> captor = ArgumentCaptor.forClass(ProjectAssignment.class); verify(projectAssignmentDao, times(2)).persist(captor.capture()); List<ProjectAssignment> assignments = captor.getAllValues(); ProjectAssignment assignment = assignments.get(0); assertEquals(userA, assignment.getUser()); assertEquals(5f, assignment.getAllottedHours(), 0); } @Test public void should_not_update_assignment_when_there_is_data_before_the_start() { ProjectAssignment assignment = ProjectAssignmentObjectMother.createProjectAssignment(1); Date dateStart = new Date(); assignment.setDateStart(dateStart); when(timesheetDao.getTimesheetEntriesBefore(assignment, dateStart)).thenReturn(Lists.newArrayList(TimesheetEntryObjectMother.createTimesheetEntry(1, new Date(), 5f))); try { service.persistUpdatedProjectAssignment(assignment); fail(); } catch (ProjectAssignmentValidationException e) { List<ProjectAssignmentValidationException.Issue> issues = e.getIssues(); assertThat(issues, contains(ProjectAssignmentValidationException.Issue.EXISTING_DATA_BEFORE_START)); } } @Test public void should_not_update_assignment_when_there_is_data_after_the_end() { ProjectAssignment assignment = ProjectAssignmentObjectMother.createProjectAssignment(1); Date date = new Date(); assignment.setDateEnd(date); when(timesheetDao.getTimesheetEntriesAfter(assignment, date)).thenReturn(Lists.newArrayList(TimesheetEntryObjectMother.createTimesheetEntry(1, new Date(), 5f))); try { service.persistUpdatedProjectAssignment(assignment); fail(); } catch (ProjectAssignmentValidationException e) { List<ProjectAssignmentValidationException.Issue> issues = e.getIssues(); assertThat(issues, contains(ProjectAssignmentValidationException.Issue.EXISTING_DATA_AFTER_END)); } } }