package com.qprogramming.tasq.events;
import com.qprogramming.tasq.account.Account;
import com.qprogramming.tasq.account.AccountService;
import com.qprogramming.tasq.account.Roles;
import com.qprogramming.tasq.config.ResourceService;
import com.qprogramming.tasq.mail.MailMail;
import com.qprogramming.tasq.manage.AppService;
import com.qprogramming.tasq.projects.Project;
import com.qprogramming.tasq.projects.ProjectService;
import com.qprogramming.tasq.support.ResultData;
import com.qprogramming.tasq.support.Utils;
import com.qprogramming.tasq.task.Task;
import com.qprogramming.tasq.task.TaskService;
import com.qprogramming.tasq.task.TaskType;
import com.qprogramming.tasq.task.watched.WatchedTask;
import com.qprogramming.tasq.task.watched.WatchedTaskService;
import com.qprogramming.tasq.task.worklog.LogType;
import com.qprogramming.tasq.task.worklog.WorkLog;
import com.qprogramming.tasq.test.MockSecurityContext;
import com.qprogramming.tasq.test.TestUtils;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.joda.time.Period;
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.core.io.Resource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.ui.Model;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.StringWriter;
import java.util.*;
import static com.qprogramming.tasq.test.TestUtils.*;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class EventsTest {
@Rule
public ExpectedException thrown = ExpectedException.none();
private Account testAccount;
private EventsService eventsService;
private EventsController eventsController;
@Mock
private ProjectService projSrvMock;
@Mock
private EventsRepository eventsRepoMock;
@Mock
private MailMail mailerMock;
@Mock
private TaskService taskSrvMock;
@Mock
private WatchedTaskService watchedTaskSrvMock;
@Mock
private MessageSource msgMock;
@Mock
private AccountService accountServiceMock;
@Mock
private MockSecurityContext securityMock;
@Mock
private Authentication authMock;
@Mock
private RedirectAttributes raMock;
@Mock
private HttpServletResponse responseMock;
@Mock
private HttpServletRequest requestMock;
@Mock
private Model modelMock;
@Mock
private VelocityEngine velMock;
@Mock
private ResourceService resourceMock;
@Mock
private AppService appSrvMock;
@Before
public void setUp() {
testAccount = TestUtils.createAccount();
testAccount.setId(1L);
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);
eventsService = new EventsService(eventsRepoMock, watchedTaskSrvMock, mailerMock, msgMock, velMock,
resourceMock, appSrvMock);
eventsController = new EventsController(eventsService, msgMock);
}
@Test
public void getEvetnsPagedTest() {
Event event = new Event();
event.setAccount(testAccount);
event.setDate(new Date());
event.setLogtype(LogType.COMMENT);
List<Event> list = new LinkedList<Event>();
list.add(event);
Page<Event> page = new PageImpl<Event>(list);
Pageable pageSpecification = new PageRequest(0, 5);
when(eventsRepoMock.findByAccountId(testAccount.getId(), pageSpecification)).thenReturn(page);
Page<DisplayEvent> result = eventsController.eventsPaged(null, pageSpecification);
Assert.assertTrue(result.hasContent());
}
@Test
public void readEvetnTest() {
Event event = new Event();
event.setId(1L);
event.setUnread(true);
when(eventsRepoMock.findById(1L)).thenReturn(event);
ResultData result = eventsController.readEvent(1L);
Assert.assertTrue(result.code.equals(ResultData.Code.OK));
Assert.assertFalse(event.isUnread());
verify(eventsRepoMock, times(1)).save(any(Event.class));
}
@Test
public void readAllEvetnTest() {
Event event = new Event();
event.setId(1L);
event.setUnread(true);
Event event1 = new Event();
event1.setId(2L);
event1.setUnread(true);
List<Event> list = new LinkedList<Event>();
list.add(event);
list.add(event1);
when(eventsRepoMock.findByAccountIdOrderByDateDesc(testAccount.getId())).thenReturn(list);
ResultData result = eventsController.readAllEvents();
Assert.assertTrue(result.code.equals(ResultData.Code.OK));
Assert.assertFalse(event.isUnread());
verify(eventsRepoMock, times(2)).save(any(Event.class));
}
@Test
public void deleteEvetnTest() {
Event event = new Event();
event.setId(1L);
event.setUnread(true);
when(eventsRepoMock.findById(1L)).thenReturn(event);
ResultData result = eventsController.deleteEvent(1L);
Assert.assertTrue(result.code.equals(ResultData.Code.OK));
verify(eventsRepoMock, times(1)).delete(any(Event.class));
}
@Test
public void deleteAllEvetnTest() {
Event event = new Event();
event.setId(1L);
event.setUnread(true);
Event event1 = new Event();
event1.setId(2L);
event1.setUnread(true);
List<Event> list = new LinkedList<Event>();
list.add(event);
list.add(event1);
when(eventsRepoMock.findByAccountIdOrderByDateDesc(testAccount.getId())).thenReturn(list);
ResultData result = eventsController.deleteAllEvents();
Assert.assertTrue(result.code.equals(ResultData.Code.OK));
verify(eventsRepoMock, times(1)).delete(list);
}
@Test
public void eventsTest() {
Event event = new Event();
event.setId(1L);
event.setUnread(true);
event.setAccount(testAccount);
event.setDate(new Date());
event.setLogtype(LogType.COMMENT);
event.setTask(TASK_NAME);
Event event1 = new Event();
event1.setId(2L);
event1.setUnread(true);
event1.setAccount(testAccount);
event1.setDate(new Date());
event1.setLogtype(LogType.COMMENT);
event1.setTask(TASK_NAME);
Assert.assertNotEquals(event.hashCode(), event1.hashCode());
Assert.assertNotEquals(event, event1);
}
@Test
public void getUnreadTest() {
Event event = new Event();
event.setId(1L);
event.setUnread(true);
event.setAccount(testAccount);
event.setDate(new Date());
event.setLogtype(LogType.COMMENT);
event.setTask(TASK_NAME);
List<Event> list = new LinkedList<Event>();
list.add(event);
when(eventsRepoMock.findByAccountIdAndUnreadTrue(testAccount.getId())).thenReturn(list);
List<Event> result = eventsService.getUnread();
Assert.assertFalse(result.isEmpty());
}
@Test
public void addWatchEventTest() {
Project project = new Project(PROJECT_NAME, testAccount);
testAccount.setWatchnotification(true);
Set<Account> watchers = new HashSet<Account>();
Account newAccount = new Account(EMAIL, "", USERNAME, Roles.ROLE_POWERUSER);
newAccount.setWatchnotification(true);
watchers.add(testAccount);
watchers.add(newAccount);
WatchedTask watched = new WatchedTask();
watched.setId(TEST_1);
watched.setWatchers(watchers);
watched.setType(TaskType.ISSUE);
Task task = TestUtils.createTask(TASK_NAME, 1, TestUtils.createProject());
WorkLog worklog = new WorkLog();
worklog.setAccount(testAccount);
worklog.setActivity(new Period());
worklog.setType(LogType.LOG);
worklog.setTask(task);
when(watchedTaskSrvMock.getByTask(TEST_1)).thenReturn(watched);
Utils.setHttpRequest(requestMock);
eventsService.addWatchEvent(worklog, "", new Date());
eventsService.addProjectEvent(newAccount, LogType.ASSIGN_TO_PROJ, project);
verify(eventsRepoMock, times(2)).save(any(Event.class));
}
@Test
public void addSystemEventTest() {
Account owner = TestUtils.createAccount("Jon", "Doe");
owner.setSystemnotification(true);
Utils.setHttpRequest(requestMock);
when(resourceMock.getBasicResourceMap()).thenReturn(new HashMap<>());
eventsService.addSystemEvent(owner, LogType.DELETED, "message", "moreDetails");
verify(eventsRepoMock, times(1)).save(any(Event.class));
verify(velMock, times(1)).mergeTemplate(anyString(), anyString(), any(VelocityContext.class), any(StringWriter.class));
verify(mailerMock, times(1)).sendMail(anyInt(), anyString(), anyString(), anyString(), anyMapOf(String.class, Resource.class));
}
// @Test
// public void addTimedWorkLogTest() {
// task1.setRemaining(new Period(2, 0, 0, 0));
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null, new Date());
// when(taskSrvMock.findById(TEST_1)).thenReturn(task1);
// when(wlRepoMock.save(any(WorkLog.class))).thenReturn(worklog);
// wlSrv.addTimedWorkLog(task1, "", new Date(), null, new Period(1, 0, 0,
// 0), LogType.LOG);
// Assert.assertEquals(1, task1.getRawRemaining().getHours());
// verify(taskSrvMock, times(2)).save(any(Task.class));
// verify(eventSrvMock, times(2)).addWatchEvent(any(WorkLog.class),
// anyString(), any(Date.class));
// }
//
// @Test
// public void addTimedWorkLogWithRemainingTest() {
// task1.setRemaining(new Period(3, 0, 0, 0));
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null, new Date());
// when(taskSrvMock.findById(TEST_1)).thenReturn(task1);
// when(wlRepoMock.save(any(WorkLog.class))).thenReturn(worklog);
// wlSrv.addTimedWorkLog(task1, "", new Date(), new Period(1, 0, 0, 0),
// new Period(1, 0, 0, 0), LogType.LOG);
// Assert.assertEquals(1, task1.getRawRemaining().getHours());
// verify(taskSrvMock, times(2)).save(any(Task.class));
// verify(eventSrvMock, times(2)).addWatchEvent(any(WorkLog.class),
// anyString(), any(Date.class));
// }
//
// @Test
// public void addDatedWorkLogTest() {
// task1.setRemaining(new Period(3, 0, 0, 0));
// WorkLog worklog = createWorkLog(task1, LogType.ESTIMATE, null,
// new Date());
// when(taskSrvMock.findById(TEST_1)).thenReturn(task1);
// when(wlRepoMock.save(any(WorkLog.class))).thenReturn(worklog);
// wlSrv.addDatedWorkLog(task1, null,
// new DateTime().minusDays(1).toDate(), LogType.ESTIMATE);
// verify(taskSrvMock, times(1)).save(any(Task.class));
// verify(eventSrvMock, times(1)).addWatchEvent(any(WorkLog.class),
// anyString(), any(Date.class));
// }
//
// @Test
// public void addActivityLogTest() {
// task1.setRemaining(new Period(3, 0, 0, 0));
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null, new Date());
// when(taskSrvMock.findById(TEST_1)).thenReturn(task1);
// when(wlRepoMock.save(any(WorkLog.class))).thenReturn(worklog);
// wlSrv.addActivityLog(task1, null, LogType.LOG);
// verify(taskSrvMock, times(1)).save(any(Task.class));
// verify(eventSrvMock, times(1)).addWatchEvent(any(WorkLog.class),
// anyString(), any(Date.class));
// }
//
// @Test
// public void addActivityPeriodLogTest() {
// task1.setRemaining(new Period(3, 0, 0, 0));
// WorkLog worklog = createWorkLog(task1, LogType.ESTIMATE, null,
// new Date());
// when(taskSrvMock.findById(TEST_1)).thenReturn(task1);
// when(wlRepoMock.save(any(WorkLog.class))).thenReturn(worklog);
// wlSrv.addActivityPeriodLog(task1, "1h", new Period(3, 0, 0, 0),
// LogType.ESTIMATE);
// verify(taskSrvMock, times(1)).save(any(Task.class));
// verify(eventSrvMock, times(1)).addWatchEvent(any(WorkLog.class),
// anyString(), any(Date.class));
// }
//
// @Test
// public void addNormalTimedWorkLogTest() {
// task1.setRemaining(new Period(3, 0, 0, 0));
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null, new Date());
// when(taskSrvMock.findById(TEST_1)).thenReturn(task1);
// when(wlRepoMock.save(any(WorkLog.class))).thenReturn(worklog);
// wlSrv.addNormalWorkLog(task1, "", new Period(1, 0, 0, 0), LogType.LOG);
// wlSrv.addNormalWorkLog(task1, "", new Period(1, 0, 0, 0),
// LogType.ESTIMATE);
// Assert.assertEquals(1, task1.getRawRemaining().getHours());
// verify(taskSrvMock, times(3)).save(any(Task.class));
// verify(eventSrvMock, times(3)).addWatchEvent(any(WorkLog.class),
// anyString(), any(Date.class));
// }
//
// @Test
// public void addWorkLogNoTaskTest() {
// wlSrv.addWorkLogNoTask("", createProject(), LogType.SPRINT_START);
// verify(wlRepoMock, times(1)).save(any(WorkLog.class));
// }
//
// @Test
// public void getProjectEventsTest() {
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null,
// new DateTime().minusDays(3).toDate());
// WorkLog worklog1 = createWorkLog(task1, LogType.LOG, null,
// new DateTime().minusDays(2).toDate());
// WorkLog worklog2 = createWorkLog(task1, LogType.LOG, null,
// new DateTime().minusDays(1).toDate());
// WorkLog worklog3 = createWorkLog(task1, LogType.LOG, null,
// new DateTime().minusDays(1).toDate());
// List<WorkLog> list = new ArrayList<WorkLog>();
// list.add(worklog);
// list.add(worklog1);
// list.add(worklog2);
// list.add(worklog3);
// when(wlRepoMock.findByProjectId(1L)).thenReturn(list);
// List<DisplayWorkLog> result = wlSrv.getProjectEvents(createProject());
// Assert.assertEquals(4, result.size());
// }
//
// @Test
// public void getSprintEventsTest() {
// Sprint sprint = new Sprint();
// sprint.setId(1L);
// sprint.setSprint_no(1L);
// sprint.setStart_date(new DateTime().minusDays(2).toDate());
// sprint.setEnd_date(new DateTime().plusDays(2).toDate());
// sprint.setProject(createProject());
// task1.setInSprint(true);
// task1.addSprint(sprint);
// task2.setInSprint(false);
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null,
// new DateTime().minusDays(2).toDate());
// WorkLog worklog1 = createWorkLog(task1, LogType.DELETED, null,
// new DateTime().minusDays(2).toDate());
// WorkLog worklog2 = createWorkLog(task1, LogType.TASKSPRINTADD, null,
// new DateTime().minusDays(1).toDate());
// WorkLog worklog3 = createWorkLog(task1, LogType.TASKSPRINTREMOVE, null,
// new DateTime().toDate());
// WorkLog worklog4 = createWorkLog(task2, LogType.CLOSED, null,
// new DateTime().toDate());
// WorkLog worklog5 = createWorkLog(task1, LogType.EDITED, null,
// new DateTime().toDate());
// WorkLog worklog6 = createWorkLog(task1, LogType.ESTIMATE, null,
// new DateTime().toDate());
// WorkLog worklog7 = createWorkLog(task1, LogType.REOPEN, null,
// new DateTime().toDate());
// WorkLog worklog8 = createWorkLog(task1, LogType.CLOSED, null,
// new DateTime().toDate());
//
// List<WorkLog> list = new ArrayList<WorkLog>();
// list.add(worklog);
// list.add(worklog1);
// list.add(worklog2);
// list.add(worklog3);
// list.add(worklog4);
// list.add(worklog5);
// list.add(worklog6);
// list.add(worklog7);
// list.add(worklog8);
// when(
// wlRepoMock
// .findByProjectIdAndTimeBetweenAndWorklogtaskNotNullOrderByTimeAsc(
// anyLong(), any(Date.class), any(Date.class)))
// .thenReturn(list);
// List<WorkLog> result = wlSrv.getAllSprintEvents(sprint);
// Assert.assertEquals(7, result.size());
// }
//
// @Test
// public void finProjectCreateCLoseEventsTest() {
// Project project = createProject();
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null,
// new DateTime().minusDays(2).toDate());
// WorkLog worklog1 = createWorkLog(task1, LogType.DELETED, null,
// new DateTime().minusDays(2).toDate());
// WorkLog worklog2 = createWorkLog(task1, LogType.TASKSPRINTADD, null,
// new DateTime().minusDays(1).toDate());
// WorkLog worklog3 = createWorkLog(task1, LogType.TASKSPRINTREMOVE, null,
// new DateTime().toDate());
// WorkLog worklog4 = createWorkLog(task2, LogType.CLOSED, null,
// new DateTime().toDate());
// WorkLog worklog5 = createWorkLog(task1, LogType.EDITED, null,
// new DateTime().toDate());
// WorkLog worklog6 = createWorkLog(task1, LogType.ESTIMATE, null,
// new DateTime().toDate());
// WorkLog worklog7 = createWorkLog(task1, LogType.REOPEN, null,
// new DateTime().toDate());
// WorkLog worklog8 = createWorkLog(task1, LogType.CLOSED, null,
// new DateTime().toDate());
// List<WorkLog> list = new ArrayList<WorkLog>();
// list.add(worklog);
// list.add(worklog1);
// list.add(worklog2);
// list.add(worklog3);
// list.add(worklog4);
// list.add(worklog5);
// list.add(worklog6);
// list.add(worklog7);
// list.add(worklog8);
// when(wlRepoMock.findByProjectIdOrderByTimeAsc(anyLong())).thenReturn(
// list);
// List<WorkLog> result = wlSrv.findProjectCreateCloseEvents(project);
// Assert.assertEquals(3, result.size());
// }
//
// @Test
// public void testWorklogs() {
// WorkLog worklog = createWorkLog(task1, LogType.LOG, null,
// new DateTime().minusDays(2).toDate());
// WorkLog worklog1 = createWorkLog(task1, LogType.DELETED, null,
// new DateTime().minusDays(2).toDate());
// worklog.setTask(task1);
// worklog.setAccount(testAccount);
// Assert.assertNotEquals(worklog, worklog1);
//
// }
}