package com.qprogramming.tasq.projects;
import com.qprogramming.tasq.account.Account;
import com.qprogramming.tasq.account.AccountService;
import com.qprogramming.tasq.account.LastVisitedService;
import com.qprogramming.tasq.account.Roles;
import com.qprogramming.tasq.agile.AgileService;
import com.qprogramming.tasq.agile.Sprint;
import com.qprogramming.tasq.error.TasqAuthException;
import com.qprogramming.tasq.events.EventsService;
import com.qprogramming.tasq.projects.holiday.HolidayService;
import com.qprogramming.tasq.support.ResultData;
import com.qprogramming.tasq.support.web.Message;
import com.qprogramming.tasq.task.*;
import com.qprogramming.tasq.task.worklog.DisplayWorkLog;
import com.qprogramming.tasq.task.worklog.LogType;
import com.qprogramming.tasq.task.worklog.WorkLog;
import com.qprogramming.tasq.task.worklog.WorkLogService;
import com.qprogramming.tasq.test.MockSecurityContext;
import com.qprogramming.tasq.test.TestUtils;
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.context.MessageSource;
import org.springframework.data.domain.*;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.ui.Model;
import org.springframework.validation.BeanPropertyBindingResult;
import org.springframework.validation.Errors;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import static com.qprogramming.tasq.test.TestUtils.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class ProjectControllerTest {
private static final String NEW_DESCRIPTION = "newDescription";
private static final String TASQ_AUTH_MSG = "TasqAuthException was not thrown";
private static final String PASSWORD = "password";
private static final String EMAIL = "user@test.com";
private static final String NEW_EMAIL = "newuser@test.com";
private static final String NEW_NAME = "newName";
private static final String NEWUSERNAME = "newUser";
@Rule
public ExpectedException thrown = ExpectedException.none();
private Account testAccount;
private ProjectController projectCtr;
@Mock
private ProjectService projSrv;
@Mock
private TaskService taskSrvMock;
@Mock
private AgileService sprintSrvMock;
@Mock
private WorkLogService wrkLogSrv;
@Mock
private EventsService eventsSrvMock;
@Mock
private MessageSource msg;
@Mock
private AccountService accountServiceMock;
@Mock
private MockSecurityContext securityMock;
@Mock
private Authentication authMock;
@Mock
private MessageSource msgMock;
@Mock
private HolidayService holidayServiceMock;
@Mock
private LastVisitedService visitedSrvMock;
@Mock
private RedirectAttributes raMock;
@Mock
private HttpServletResponse responseMock;
@Mock
private HttpServletRequest requestMock;
@Mock
private Model modelMock;
@Before
public void setUp() {
testAccount = TestUtils.createAccount();
testAccount.setLanguage("en");
when(msgMock.getMessage(anyString(), any(Object[].class), any(Locale.class))).thenReturn("MESSAGE");
when(securityMock.getAuthentication()).thenReturn(authMock);
when(authMock.getPrincipal()).thenReturn(testAccount);
SecurityContextHolder.setContext(securityMock);
projectCtr = spy(new ProjectController(projSrv, accountServiceMock, taskSrvMock, sprintSrvMock, wrkLogSrv, msg,
eventsSrvMock, holidayServiceMock, visitedSrvMock));
doNothing().when(projectCtr).rollBack();
}
@Test
public void showDetailsTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
List<Task> taskList = new LinkedList<Task>();
List<Task> openTaskList = new LinkedList<Task>();
Task task = new Task();
task.setId("TEST-1");
task.setState(TaskState.TO_DO);
Task task2 = new Task();
task2.setState(TaskState.ONGOING);
task2.setId("TEST-2");
Task task3 = new Task();
task3.setState(TaskState.CLOSED);
task3.setId("TEST-3");
taskList.add(task);
taskList.add(task2);
taskList.add(task3);
openTaskList.add(task);
openTaskList.add(task2);
project.setTasks(taskList);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
when(taskSrvMock.findByProjectAndOpen(project)).thenReturn(openTaskList);
projectCtr.showDetails(PROJECT_ID, null, modelMock, raMock);
verify(modelMock, times(1)).addAttribute("TO_DO", 1);
verify(modelMock, times(1)).addAttribute("ONGOING", 1);
verify(modelMock, times(1)).addAttribute("CLOSED", 1);
verify(modelMock, times(1)).addAttribute("BLOCKED", 0);
verify(modelMock, times(1)).addAttribute("tasks", openTaskList);
verify(modelMock, times(1)).addAttribute("project", project);
}
@Test
public void showDetailsNoProjectsTest() {
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
projectCtr.showDetails(PROJECT_ID, null, modelMock, raMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.WARNING, new Object[]{}));
}
@Test
public void showDetailsBadAuthTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
testAccount.setRole(Roles.ROLE_POWERUSER);
project.removeParticipant(testAccount);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
boolean catched = false;
try {
projectCtr.showDetails(PROJECT_ID, null, modelMock, raMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
}
@Test
public void getProjectEventsAndChartTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
Task task = TestUtils.createTask(PROJECT_NAME, 1, project);
project.addParticipant(testAccount);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
List<WorkLog> list = new LinkedList<WorkLog>();
WorkLog wl = new WorkLog();
wl.setAccount(testAccount);
wl.setType(LogType.CREATE);
wl.setMessage("msg");
wl.setTime(new Date());
wl.setTimeLogged(new Date());
wl.setTask(task);
WorkLog w2 = new WorkLog();
w2.setAccount(testAccount);
w2.setType(LogType.CLOSED);
w2.setMessage("msg");
w2.setTime(new Date());
w2.setTimeLogged(new Date());
w2.setTask(task);
WorkLog w3 = new WorkLog();
w3.setAccount(testAccount);
w3.setType(LogType.REOPEN);
w3.setMessage("msg");
w3.setTime(new Date());
w3.setTimeLogged(new Date());
w3.setTask(task);
WorkLog w4 = new WorkLog();
w4.setAccount(testAccount);
w4.setType(LogType.CLOSED);
w4.setMessage("msg");
w4.setTime(new Date());
w4.setTimeLogged(new Date());
w4.setTask(task);
list.add(wl);
list.add(wl);
list.add(wl);
list.add(wl);
list.add(wl);
list.add(w2);
list.add(w3);
list.add(w4);
Page<WorkLog> page = new PageImpl<WorkLog>(list);
when(wrkLogSrv.findByProjectId(anyLong(), any(Pageable.class))).thenReturn(page);
when(wrkLogSrv.findProjectCreateCloseEvents(project, false)).thenReturn(list);
Pageable p = new PageRequest(0, 5, new Sort(Sort.Direction.ASC, "time"));
ResponseEntity<Page<DisplayWorkLog>> result = projectCtr.getProjectEvents(PROJECT_ID, p);
ResponseEntity<ProjectChart> chart = projectCtr.getProjectChart(PROJECT_ID, false, responseMock);
String today = new LocalDate().toString();
Assert.assertEquals(Integer.valueOf(1), chart.getBody().getClosed().get(today));
Assert.assertEquals(Integer.valueOf(5), chart.getBody().getCreated().get(today));
Assert.assertEquals(8L, result.getBody().getTotalElements());
}
@Test
public void getProjectEventsUnahtorizedTest() {
boolean catched = false;
testAccount.setRole(Roles.ROLE_POWERUSER);
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setParticipants(new HashSet<Account>());
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
try {
projectCtr.getProjectEvents(PROJECT_ID, null);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
}
@Test
public void getProjectEventsNoProjectTest() {
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
Assert.assertNull(projectCtr.getProjectEvents(PROJECT_ID, null));
}
@Test
public void listProjectsTest() {
List<Project> list = createList(5);
testAccount.setActiveProject(PROJECT_ID + 3);
testAccount.setRole(Roles.ROLE_POWERUSER);
when(projSrv.findAllByUser()).thenReturn(list);
when(projSrv.findAll()).thenReturn(list);
when(msg.getMessage(anyString(), any(Object[].class), anyString(), any(Locale.class))).thenReturn("MSG");
projectCtr.listProjects(modelMock);
testAccount.setRole(Roles.ROLE_ADMIN);
projectCtr.listProjects(modelMock);
verify(modelMock, times(2)).addAttribute("projects", list);
Assert.assertEquals(new Long(4), list.get(0).getId());
}
@Test
public void createProjectSuccessTest() {
NewProjectForm form = createForm(PROJECT_NAME, PROJECT_ID);
List<Project> list = createList(1);
Project project = form.createProject();
Assert.assertEquals(form.getProject_id(), new NewProjectForm(project).getProject_id());
when(projSrv.findByName(anyString())).thenReturn(null);
when(projSrv.findAllByUser()).thenReturn(list);
when(msg.getMessage(anyString(), any(Object[].class), anyString(), any(Locale.class))).thenReturn("MSG");
when(projSrv.save(any(Project.class))).thenReturn(project);
Errors errors = new BeanPropertyBindingResult(form, "form");
projectCtr.createProject(form, errors, raMock, requestMock);
}
@Test
public void createProjectBadAuthTest() {
boolean catched = false;
NewProjectForm form = createForm(PROJECT_NAME, PROJECT_ID);
Errors errors = new BeanPropertyBindingResult(form, "form");
testAccount.setRole(Roles.ROLE_VIEWER);
try {
projectCtr.createProject(form, errors, raMock, requestMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
catched = false;
try {
projectCtr.manageProject(PROJECT_ID, modelMock, raMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
}
@Test
public void createProjectIDLongErrorsTest() {
NewProjectForm form = createForm(PROJECT_NAME, "TESTTEST");
Errors errors = new BeanPropertyBindingResult(form, "form");
projectCtr.createProject(form, errors, raMock, requestMock);
Assert.assertTrue(errors.hasErrors());
}
@Test
public void createProjectIDDigitsErrorsTest() {
NewProjectForm form = createForm(PROJECT_NAME, "TEST2");
Errors errors = new BeanPropertyBindingResult(form, "form");
projectCtr.createProject(form, errors, raMock, requestMock);
Assert.assertTrue(errors.hasErrors());
}
@Test
public void createProjectErrorsTest() {
NewProjectForm form = createForm(PROJECT_NAME, PROJECT_ID);
Errors errors = new BeanPropertyBindingResult(form, "form");
errors.rejectValue("name", "Error name");
projectCtr.createProject(form, errors, raMock, requestMock);
Assert.assertTrue(errors.hasErrors());
}
@Test
public void createProjectNameExistsTest() {
NewProjectForm form = createForm(PROJECT_NAME, PROJECT_ID);
Project project = form.createProject();
when(projSrv.findByName(PROJECT_NAME)).thenReturn(project);
Errors errors = new BeanPropertyBindingResult(form, "form");
projectCtr.createProject(form, errors, raMock, requestMock);
Assert.assertTrue(errors.hasFieldErrors("name"));
}
@Test
public void createProjectIDExistsTest() {
NewProjectForm form = createForm(PROJECT_NAME, PROJECT_ID);
Project project = form.createProject();
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
Errors errors = new BeanPropertyBindingResult(form, "form");
projectCtr.createProject(form, errors, raMock, requestMock);
Assert.assertTrue(errors.hasFieldErrors("project_id"));
}
@Test
public void projectManageNoProjectTest() {
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
projectCtr.manageProject(PROJECT_ID, modelMock, raMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void projectManageTest() {
NewProjectForm form = createForm(PROJECT_NAME, PROJECT_ID);
Project project = form.createProject();
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
projectCtr.manageProject(PROJECT_ID, modelMock, raMock);
verify(modelMock, times(1)).addAttribute("project", project);
}
@Test
public void updatePropertiesAuthErrorTest() {
boolean catched = false;
testAccount.setRole(Roles.ROLE_VIEWER);
try {
projectCtr.updateProperties(PROJECT_ID, TaskPriority.BLOCKER, TaskType.BUG, 1L, raMock, requestMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
}
@Test
public void updatePropertiesNoProjectTest() {
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
projectCtr.updateProperties(PROJECT_ID, TaskPriority.BLOCKER, TaskType.BUG, 1L, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void updatePropertiesTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
when(sprintSrvMock.findByProjectIdAndActiveTrue(1L)).thenReturn(null);
when(accountServiceMock.findById(1L)).thenReturn(testAccount);
projectCtr.updateProperties(PROJECT_ID, TaskPriority.BLOCKER, TaskType.BUG, 1L, raMock, requestMock);
verify(projSrv, times(1)).save(project);
}
@Test
public void activateProjectFailTest() {
when(projSrv.activateForCurrentUser(PROJECT_ID)).thenReturn(null);
projectCtr.activate(PROJECT_ID, requestMock, raMock);
verify(raMock, never()).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.SUCCESS, new Object[]{}));
}
@Test
public void activateProjectSuccesTest() {
NewProjectForm form = createForm(PROJECT_NAME, PROJECT_ID);
Project project = form.createProject();
when(projSrv.activateForCurrentUser(PROJECT_ID)).thenReturn(project);
projectCtr.activate(PROJECT_ID, requestMock, raMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.SUCCESS, new Object[]{}));
}
@Test
public void addParticipantTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
testAccount.setName("John");
testAccount.setSurname("Doe");
project.setId(1L);
project.addParticipant(testAccount);
when(accountServiceMock.findByEmail(NEW_EMAIL))
.thenReturn(new Account(NEW_EMAIL, PASSWORD, NEWUSERNAME, Roles.ROLE_POWERUSER));
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
projectCtr.addParticipant(PROJECT_ID, NEW_EMAIL, raMock, requestMock);
verify(accountServiceMock, times(1)).findByEmail(anyString());
verify(accountServiceMock, times(1)).update(any(Account.class));
verify(projSrv, times(1)).save(project);
}
@Test
public void addParticipantAuthErrorTest() {
boolean catched = false;
testAccount.setRole(Roles.ROLE_VIEWER);
try {
projectCtr.addParticipant(PROJECT_ID, "", raMock, requestMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
}
@Test
public void addParticipantNoProjectTest() {
when(accountServiceMock.findByEmail(NEW_EMAIL))
.thenReturn(new Account(NEW_EMAIL, PASSWORD, USERNAME, Roles.ROLE_POWERUSER));
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
projectCtr.addParticipant(PROJECT_ID, NEW_EMAIL, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void removeParticipantNoProjectTest() {
when(accountServiceMock.findById(1L))
.thenReturn(new Account(NEW_EMAIL, PASSWORD, NEWUSERNAME, Roles.ROLE_POWERUSER));
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
projectCtr.removeParticipant(PROJECT_ID, 1L, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void removeParticipantAuthErrorTest() {
boolean catched = false;
testAccount.setRole(Roles.ROLE_VIEWER);
try {
projectCtr.removeParticipant(PROJECT_ID, 1L, raMock, requestMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
}
@Test
public void removeParticipantLastAdminTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
project.addAdministrator(testAccount);
when(accountServiceMock.findById(1L)).thenReturn(testAccount);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
projectCtr.removeParticipant(PROJECT_ID, 1L, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void removeParticipantTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
Account newUser = new Account(NEW_EMAIL, PASSWORD, NEWUSERNAME, Roles.ROLE_ADMIN);
project.addAdministrator(newUser);
project.addParticipant(newUser);
project.addParticipant(testAccount);
when(accountServiceMock.findById(1L)).thenReturn(testAccount);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
projectCtr.removeParticipant(PROJECT_ID, 1L, raMock, requestMock);
verify(projSrv, times(1)).save(project);
}
@Test
public void grantAndRemoveAdminAuthErrorTest() {
boolean catched = false;
testAccount.setRole(Roles.ROLE_VIEWER);
try {
projectCtr.grantAdmin(PROJECT_ID, 1L, raMock, requestMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
catched = false;
try {
projectCtr.removeAdmin(PROJECT_ID, 1L, raMock, requestMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
}
@Test
public void grantAndRemoveAdminNoProjectTest() {
when(accountServiceMock.findById(1L))
.thenReturn(new Account(NEW_EMAIL, PASSWORD, NEWUSERNAME, Roles.ROLE_POWERUSER));
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
projectCtr.grantAdmin(PROJECT_ID, 1L, raMock, requestMock);
projectCtr.removeAdmin(PROJECT_ID, 1L, raMock, requestMock);
verify(raMock, times(2)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void grantAndRemoveAdminTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
project.addParticipant(testAccount);
when(accountServiceMock.findById(1L))
.thenReturn(new Account(NEW_EMAIL, PASSWORD, NEWUSERNAME, Roles.ROLE_POWERUSER));
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
projectCtr.grantAdmin(PROJECT_ID, 1L, raMock, requestMock);
projectCtr.removeAdmin(PROJECT_ID, 1L, raMock, requestMock);
verify(projSrv, times(2)).save(project);
}
@Test
public void grantAndRemoveLastAdminTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
project.addParticipant(testAccount);
when(accountServiceMock.findById(1L)).thenReturn(testAccount);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
projectCtr.removeAdmin(PROJECT_ID, 1L, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void getDefaultAssigneeTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
project.setDefaultAssigneeID(1L);
when(accountServiceMock.findById(1L)).thenReturn(testAccount);
when(projSrv.findByProjectId(TestUtils.PROJECT_ID)).thenReturn(project);
Assert.assertNotNull(projectCtr.getDefaults(TestUtils.PROJECT_ID, responseMock));
project.setDefaultAssigneeID(null);
Assert.assertNull(projectCtr.getDefaults(TestUtils.PROJECT_ID, responseMock).getBody().getDefaultAssignee());
}
@Test
public void changeDescriptionNoProjectsTest() {
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(null);
projectCtr.editDescriptions(PROJECT_ID, NEW_NAME, NEW_DESCRIPTION, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.WARNING, new Object[]{}));
}
@Test
public void changeDescriptionBadAuthTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
project.addParticipant(testAccount);
testAccount.setRole(Roles.ROLE_VIEWER);
when(accountServiceMock.findById(1L)).thenReturn(testAccount);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
boolean catched = false;
try {
projectCtr.editDescriptions(PROJECT_ID, NEW_NAME, NEW_DESCRIPTION, raMock, requestMock);
} catch (TasqAuthException e) {
catched = true;
}
Assert.assertTrue(TASQ_AUTH_MSG, catched);
testAccount.setRole(Roles.ROLE_POWERUSER);
projectCtr.editDescriptions(PROJECT_ID, NEW_NAME, NEW_DESCRIPTION, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void changeDescriptionTest() {
Project project = createForm(PROJECT_NAME, PROJECT_ID).createProject();
project.setId(1L);
project.addParticipant(testAccount);
when(accountServiceMock.findById(1L)).thenReturn(testAccount);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
when(projSrv.canEdit(1L)).thenReturn(true);
projectCtr.editDescriptions(PROJECT_ID, NEW_NAME, NEW_DESCRIPTION, raMock, requestMock);
Project newProject = project;
newProject.setDescription(NEW_DESCRIPTION);
verify(projSrv, times(1)).findByProjectId(PROJECT_ID);
verify(projSrv, times(1)).save(newProject);
}
@Test(expected = TasqAuthException.class)
public void deleteProjectNotAdminTest() {
testAccount.setRole(Roles.ROLE_USER);
Project project = TestUtils.createProject();
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
projectCtr.deleteProject(TestUtils.PROJECT_ID,PROJECT_ID,PROJECT_NAME, raMock, requestMock);
}
@Test
public void deleteProjectFailedToRemoveTaskTest() {
testAccount.setRole(Roles.ROLE_ADMIN);
Project project = TestUtils.createProject();
Task task = TestUtils.createTask(TASK_NAME, 1, project);
task.setOwner(testAccount);
List<Task> tasksList = new LinkedList<>();
tasksList.add(task);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
when(taskSrvMock.findAllByProject(project)).thenReturn(tasksList);
when(taskSrvMock.deleteTask(task, true)).thenReturn(new ResultData(ResultData.Code.ERROR, "MESSAGE"));
projectCtr.deleteProject(TestUtils.PROJECT_ID, PROJECT_ID,PROJECT_NAME, raMock, requestMock);
verify(projectCtr, times(1)).rollBack();
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
@Test
public void deleteProjectTest() {
testAccount.setRole(Roles.ROLE_ADMIN);
Project project = TestUtils.createProject();
List<Account> accountList = TestUtils.createAccountList();
Task task1 = TestUtils.createTask(TASK_NAME, 1, project);
Task task2 = TestUtils.createTask(TASK_NAME, 2, project);
Task task3 = TestUtils.createTask(TASK_NAME, 3, project);
Task task4 = TestUtils.createTask(TASK_NAME, 4, project);
Task task5 = TestUtils.createTask(TASK_NAME, 5, project);
task1.setOwner(testAccount);
task1.setAssignee(accountList.get(0));
task2.setOwner(accountList.get(0));
task2.setAssignee(accountList.get(3));
task3.setOwner(testAccount);
task4.setOwner(testAccount);
task4.setAssignee(accountList.get(3));
task5.setOwner(testAccount);
accountList.get(2).startTimerOnTask(task4);
accountList.get(1).startTimerOnTask(task3);
List<Account> working = new LinkedList<>();
working.add(accountList.get(2));
working.add(accountList.get(1));
List<Task> tasksList = new LinkedList<>();
tasksList.add(task1);
tasksList.add(task2);
tasksList.add(task3);
tasksList.add(task4);
tasksList.add(task5);
when(projSrv.findByProjectId(PROJECT_ID)).thenReturn(project);
when(taskSrvMock.findAllByProject(project)).thenReturn(tasksList);
when(taskSrvMock.deleteTask(any(Task.class), anyBoolean())).thenReturn(new ResultData(ResultData.Code.OK, null));
when(accountServiceMock.findAllWithActiveTask(task4.getId())).thenReturn(working);
projectCtr.deleteProject(TestUtils.PROJECT_ID,PROJECT_ID,PROJECT_NAME, raMock, requestMock);
verify(eventsSrvMock, times(3)).addSystemEvent(any(Account.class), any(LogType.class), anyString(), anyString());
verify(projSrv, times(1)).delete(project);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.SUCCESS, new Object[]{}));
}
@Test
public void deleteProjectNotExistsTest() {
projectCtr.deleteProject(TestUtils.PROJECT_ID,PROJECT_ID,PROJECT_NAME, raMock, requestMock);
verify(raMock, times(1)).addFlashAttribute(anyString(),
new Message(anyString(), Message.Type.DANGER, new Object[]{}));
}
private List<Project> createList(int count) {
List<Project> list = new LinkedList<Project>();
for (int i = 0; i < count; i++) {
Project project = createForm(PROJECT_NAME + i, PROJECT_ID + i).createProject();
project.setId(new Long(i + 1));
list.add(project);
}
return list;
}
private NewProjectForm createForm(String name, String projid) {
NewProjectForm form = projectCtr.startProjectcreate();
form.setProject_id(projid);
form.setName(name);
form.setDescription("Description");
form.setAgile("SCRUM");
form.setId(1L);
return form;
}
}