package com.qprogramming.tasq.projects;
import com.qprogramming.tasq.account.*;
import com.qprogramming.tasq.projects.NewProjectForm;
import com.qprogramming.tasq.projects.Project;
import com.qprogramming.tasq.projects.ProjectRepository;
import com.qprogramming.tasq.projects.ProjectService;
import com.qprogramming.tasq.projects.holiday.Holiday;
import com.qprogramming.tasq.test.MockSecurityContext;
import com.qprogramming.tasq.test.TestUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import static com.qprogramming.tasq.test.TestUtils.PROJECT_ID;
import static com.qprogramming.tasq.test.TestUtils.PROJECT_NAME;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ProjectServiceTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
private ProjectService projSrv;
@Mock
private AccountRepository accRepoMomck;
@Mock
private UserService usrSrvMock;
@Mock
private MockSecurityContext securityMock;
@Mock
private ProjectRepository projRepoMock;
@Mock
private AccountService accSrvMock;
@Mock
private Authentication authMock;
private Account testAccount;
private Project testProject;
@Before
public void setUp() {
testAccount = TestUtils.createAccount();
when(securityMock.getAuthentication()).thenReturn(authMock);
when(authMock.getPrincipal()).thenReturn(testAccount);
SecurityContextHolder.setContext(securityMock);
projSrv = new ProjectService(projRepoMock, accSrvMock, usrSrvMock);
testProject = TestUtils.createProject();
}
@Test
public void findByNameTest() {
when(projRepoMock.findByNameIgnoreCase(PROJECT_NAME)).thenReturn(testProject);
Assert.assertNotNull(projSrv.findByName(PROJECT_NAME));
}
@Test
public void findByIdTest() {
when(projRepoMock.findById(1L)).thenReturn(testProject);
when(projRepoMock.findByProjectId(PROJECT_ID)).thenReturn(testProject);
Assert.assertNotNull(projSrv.findById(1L));
Assert.assertNotNull(projSrv.findByProjectId(PROJECT_ID));
}
@Test
public void saveTest() {
projSrv.save(testProject);
verify(projRepoMock, times(1)).save(testProject);
}
@Test
public void findAllTest() {
List<Project> list = new LinkedList<Project>();
list.add(testProject);
when(projRepoMock.findAll()).thenReturn(list);
Assert.assertNotNull(projSrv.findAll());
}
@Test
public void findAllByUserTest() {
List<Project> list = new LinkedList<Project>();
list.add(testProject);
when(projRepoMock.findByParticipants_Id(1L)).thenReturn(list);
Assert.assertNotNull(projSrv.findAllByUser());
Assert.assertNotNull(projSrv.findAllByUser(1L));
}
@Test
public void findUserActiveProjectTest() {
testAccount.setActiveProject(PROJECT_ID);
when(projRepoMock.findByProjectId(PROJECT_ID)).thenReturn(testProject);
Assert.assertNotNull(projSrv.findUserActiveProject());
}
@Test
public void activateTest() {
when(projRepoMock.findByProjectId(PROJECT_ID)).thenReturn(testProject);
when(projRepoMock.save(testProject)).thenReturn(testProject);
Assert.assertNotNull(projSrv.activateForCurrentUser(PROJECT_ID));
verify(accSrvMock, times(1)).update(testAccount);
}
@Test
public void canEditEmptyTest() {
when(projRepoMock.findById(1L)).thenReturn(null);
Assert.assertFalse(projSrv.canEdit(1L));
}
@Test
public void canEditTest() {
when(projRepoMock.findById(1L)).thenReturn(testProject);
Assert.assertTrue(projSrv.canEdit(1L));
testAccount.setRole(Roles.ROLE_POWERUSER);
Assert.assertTrue(projSrv.canEdit(1L));
}
@Test
public void getFreeDaysTest() {
Holiday holiday = new Holiday(new DateTime(2016, 7, 1, 11, 00).toDate());
testProject.setWorkingWeekends(false);
Set<Holiday> holidays = testProject.getHolidays();
holidays.add(holiday);
testProject.setHolidays(holidays);
List<LocalDate> freeDays = projSrv.getFreeDays(testProject, new DateTime(2016, 6, 11, 11, 00), new DateTime(2016, 7, 10, 11, 00));
Assert.assertEquals(11, freeDays.size());
}
@Test
public void getParticipantTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
testAccount.setName("John");
testAccount.setSurname("Doe");
Account secondTestAccount = new Account("second@test.com", "", "second", Roles.ROLE_USER);
secondTestAccount.setName("Second");
secondTestAccount.setSurname("Doe");
project.setId(1L);
project.addParticipant(testAccount);
project.addParticipant(secondTestAccount);
when(projRepoMock.findByProjectId(PROJECT_ID)).thenReturn(project);
List<Account> result = projSrv.getProjectAccounts(PROJECT_ID, null);
Assert.assertEquals(2, result.size());
result = projSrv.getProjectAccounts(PROJECT_ID, "Do");
Assert.assertEquals(2, result.size());
result = projSrv.getProjectAccounts(PROJECT_ID, "Jo");
Assert.assertEquals(1, result.size());
result = projSrv.getProjectAccounts(PROJECT_ID, "Xx");
Assert.assertEquals(0, result.size());
}
private NewProjectForm createForm(String name, String projid) {
NewProjectForm form = new NewProjectForm();
form.setProject_id(projid);
form.setName(name);
form.setDescription("Description");
form.setAgile("SCRUM");
form.setId(1L);
return form;
}
}