package com.constellio.app.modules.tasks.services;
import static com.constellio.app.modules.tasks.model.wrappers.TaskStatusType.CLOSED;
import static com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus.CLOSED_CODE;
import static com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus.STANDBY_CODE;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import static com.constellio.sdk.tests.TestUtils.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.app.modules.tasks.model.wrappers.structures.TaskFollower;
import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus;
import com.constellio.app.modules.tasks.ui.entities.TaskFollowerVO;
import com.constellio.app.modules.tasks.ui.entities.TaskReminderVO;
import com.constellio.app.modules.tasks.ui.entities.TaskVO;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.Group;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.security.global.GlobalGroup;
import com.constellio.model.entities.security.global.GlobalGroupStatus;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.LogicalSearchQuery;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.setups.Users;
public class TaskPresenterServicesAcceptanceTest extends ConstellioTest {
TaskPresenterServices taskPresenterServices;
Users users = new Users();
RecordServices recordServices;
SearchServices searchServices;
private LocalDate now = LocalDate.now();
private Task zeTask;
private TasksSchemasRecordsServices tasksSchemas;
private User aliceHasWriteAccessOnZeTask;
private User bobHasReadAccessOnTask;
private User chuckNorrisHasDeleteAccessOnTask;
private User charlesWithNoAccessOnTask;
@Mock
private TaskVO taskVOMock;
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection().withTasksModule().withAllTest(users));
users.setUp(getModelLayerFactory().newUserServices());
givenTimeIs(now);
recordServices = getModelLayerFactory().newRecordServices();
tasksSchemas = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
searchServices = getModelLayerFactory().newSearchServices();
TasksSearchServices taskSearchServices = new TasksSearchServices(tasksSchemas);
taskPresenterServices = new TaskPresenterServices(tasksSchemas, recordServices, taskSearchServices,
getModelLayerFactory().newLoggingServices());
bobHasReadAccessOnTask = users.bobIn(zeCollection);
aliceHasWriteAccessOnZeTask = users.aliceIn(zeCollection);
chuckNorrisHasDeleteAccessOnTask = users.chuckNorrisIn(zeCollection);
charlesWithNoAccessOnTask = users.charlesIn(zeCollection);
zeTask = tasksSchemas.newTask();
recordServices.add(zeTask.setTitle("zeTitle")
.setTaskFollowers(asList(new TaskFollower().setFollowerId(bobHasReadAccessOnTask.getId())))
.setAssignee(aliceHasWriteAccessOnZeTask.getId()).setAssigner(chuckNorrisHasDeleteAccessOnTask.getId())
.setAssignationDate(LocalDate.now())
.setCreatedBy(chuckNorrisHasDeleteAccessOnTask.getId()));
//LogicalSearchCondition allTasks = from(tasksSchemas.userTask.schemaType()).returnAll();
//assertThat(searchServices.e
assertThat(bobHasReadAccessOnTask.hasReadAccess().on(zeTask)).isTrue();
assertThat(aliceHasWriteAccessOnZeTask.hasWriteAccess().on(zeTask)).isTrue();
assertThat(chuckNorrisHasDeleteAccessOnTask.hasDeleteAccess().on(zeTask)).isTrue();
assertThat(charlesWithNoAccessOnTask.hasReadAccess().on(zeTask)).isFalse();
}
@Test
public void whenCloseTaskThenTaskClosed()
throws Exception {
assertThat(zeTask.getStatus()).isEqualTo(tasksSchemas.getTaskStatusWithCode(STANDBY_CODE).getId());
taskPresenterServices.closeTask(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask);
assertThat(tasksSchemas.getTaskStatus(zeTask.getStatus()).getStatusType()).isEqualTo(CLOSED);
}
@Test
public void whenDeleteTaskThenTaskDeletedLogically()
throws Exception {
taskPresenterServices.deleteTask(zeTask.getWrappedRecord(), chuckNorrisHasDeleteAccessOnTask);
LogicalSearchCondition allTasksQuery = from(
tasksSchemas.userTask.schema()).returnAll();
Task task = tasksSchemas.getTask(searchServices.searchSingleResult(allTasksQuery).getId());
assertThat(task.getLogicallyDeletedStatus()).isTrue();
}
@Test
public void whenSendReminderTaskFixedReminderWithFixedNowDateCreated()
throws Exception {
taskPresenterServices.sendReminder(zeTask.getWrappedRecord(), chuckNorrisHasDeleteAccessOnTask);
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(zeTask.getReminders().get(0).getFixedDate()).isEqualTo(now);
}
@Test
public void whenAutoAssignTaskThenAssignationSetCorrectly()
throws Exception {
taskPresenterServices.autoAssignTask(zeTask.getWrappedRecord(), chuckNorrisHasDeleteAccessOnTask);
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(zeTask.getAssignee()).isEqualTo(chuckNorrisHasDeleteAccessOnTask.getId());
assertThat(zeTask.getAssigner()).isEqualTo(chuckNorrisHasDeleteAccessOnTask.getId());
assertThat(zeTask.getAssignedOn()).isEqualTo(now);
}
@Test
public void givenUserWithoutAccessOnTaskThenHasNoAccessOnTaskButtons()
throws Exception {
assertThat(taskPresenterServices.isEditTaskButtonVisible(zeTask.getWrappedRecord(), charlesWithNoAccessOnTask)).isFalse();
assertThat(taskPresenterServices.isCompleteTaskButtonVisible(zeTask.getWrappedRecord(), charlesWithNoAccessOnTask))
.isFalse();
assertThat(taskPresenterServices.isCloseTaskButtonVisible(zeTask.getWrappedRecord(), charlesWithNoAccessOnTask))
.isFalse();
assertThat(taskPresenterServices.isSendReminderButtonVisible(zeTask.getWrappedRecord(), charlesWithNoAccessOnTask))
.isFalse();
assertThat(taskPresenterServices.isDeleteTaskButtonVisible(zeTask.getWrappedRecord(),
charlesWithNoAccessOnTask)).isFalse();
}
@Test
public void givenUserWithReadAccessOnTaskThenHasNoAccessOnTaskModificationButtons()
throws Exception {
assertThat(taskPresenterServices.isEditTaskButtonVisible(zeTask.getWrappedRecord(), bobHasReadAccessOnTask)).isFalse();
assertThat(taskPresenterServices.isCompleteTaskButtonVisible(zeTask.getWrappedRecord(), bobHasReadAccessOnTask))
.isFalse();
assertThat(taskPresenterServices.isCloseTaskButtonVisible(zeTask.getWrappedRecord(), bobHasReadAccessOnTask))
.isFalse();
assertThat(taskPresenterServices.isSendReminderButtonVisible(zeTask.getWrappedRecord(), bobHasReadAccessOnTask))
.isFalse();
assertThat(taskPresenterServices.isDeleteTaskButtonVisible(zeTask.getWrappedRecord(),
bobHasReadAccessOnTask)).isFalse();
}
@Test
public void givenUserWithWriteAccessOnTaskThenCanEditAndCompleteTaskAndSendReminder()
throws Exception {
assertThat(taskPresenterServices.isEditTaskButtonVisible(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask))
.isTrue();
assertThat(taskPresenterServices.isCompleteTaskButtonVisible(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask))
.isTrue();
assertThat(taskPresenterServices.isSendReminderButtonVisible(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask))
.isTrue();
assertThat(taskPresenterServices.isCloseTaskButtonVisible(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask))
.isFalse();
assertThat(taskPresenterServices.isDeleteTaskButtonVisible(zeTask.getWrappedRecord(),
aliceHasWriteAccessOnZeTask)).isFalse();
}
@Test
public void givenUserWithWriteAccessOnTaskWhenTaskIsClosedThenCloseTaskButtonInvisible()
throws Exception {
recordServices.add(zeTask.setStatus(tasksSchemas.getTaskStatusWithCode(CLOSED_CODE).getId()));
assertThat(taskPresenterServices.isCloseTaskButtonVisible(zeTask.getWrappedRecord(),
aliceHasWriteAccessOnZeTask)).isFalse();
}
@Test
public void givenUserWithWriteAccessOnTaskAndIsCreatorWhenTaskIsCompletedButNotAssignedThenCloseTaskButtonIsVisible()
throws Exception {
recordServices.add(zeTask.setStatus(FIN()).setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(chuckNorrisHasDeleteAccessOnTask.hasDeleteAccess().on(zeTask)).isTrue();
assertThat(taskPresenterServices.isCloseTaskButtonVisible(zeTask.getWrappedRecord(),
chuckNorrisHasDeleteAccessOnTask)).isTrue();
}
@Test
public void givenUserWithWriteAccessOnTaskWhenTaskIsBeforeCompletedButNotAssignedThenCompleteTaskButtonInvisible()
throws Exception {
recordServices.add(zeTask.setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(chuckNorrisHasDeleteAccessOnTask.hasDeleteAccess().on(zeTask)).isTrue();
assertThat(taskPresenterServices.isCompleteTaskButtonVisible(zeTask.getWrappedRecord(),
chuckNorrisHasDeleteAccessOnTask)).isFalse();
}
@Test
public void givenUserWithWriteAccessOnTaskWhenTaskIsCompletedThenCloseTaskButtonVisible()
throws Exception {
recordServices.add(zeTask.setStatus(FIN()));
assertThat(taskPresenterServices.isCloseTaskButtonVisible(zeTask.getWrappedRecord(),
aliceHasWriteAccessOnZeTask)).isTrue();
}
@Test
public void givenUserWithWriteAccessOnTaskWhenTaskIsCompletedThenCompleteTaskButtonInvisible()
throws Exception {
recordServices.add(zeTask.setStatus(FIN()));
assertThat(taskPresenterServices.isCompleteTaskButtonVisible(zeTask.getWrappedRecord(),
aliceHasWriteAccessOnZeTask)).isFalse();
}
@Test
public void givenUserWithWriteAccessOnTaskWhenTaskIsNotAssignedThenAutoAssignTaskButtonVisible()
throws Exception {
recordServices.add(zeTask.setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(chuckNorrisHasDeleteAccessOnTask.hasDeleteAccess().on(zeTask)).isTrue();
assertThat(taskPresenterServices.isAutoAssignButtonEnabled(zeTask.getWrappedRecord(),
chuckNorrisHasDeleteAccessOnTask)).isTrue();
}
@Test
public void givenUserWithoutWriteAccessOnTaskWhenTaskIsNotAssignedThenAutoAssignTaskButtonInvisible()
throws Exception {
recordServices.add(zeTask.setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(bobHasReadAccessOnTask.hasWriteAccess().on(zeTask)).isFalse();
assertThat(taskPresenterServices.isAutoAssignButtonEnabled(zeTask.getWrappedRecord(),
bobHasReadAccessOnTask)).isFalse();
}
@Test
public void givenUserWithWriteAccessOnTaskWhenTaskIsAssignedThenAutoAssignTaskButtonInvisible()
throws Exception {
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(chuckNorrisHasDeleteAccessOnTask.hasDeleteAccess().on(zeTask)).isTrue();
assertThat(taskPresenterServices.isAutoAssignButtonEnabled(zeTask.getWrappedRecord(),
chuckNorrisHasDeleteAccessOnTask)).isFalse();
}
public String FIN() {
TaskStatus frenchType = tasksSchemas.getTaskStatusWithCode("TER");
assertThat(frenchType.isFinished()).isTrue();
return frenchType.getId();
}
@Test
public void givenUserWithDeleteAccessOnTaskThenCanEditAndDeleteTaskAndSendReminder()
throws Exception {
assertThat(taskPresenterServices.isEditTaskButtonVisible(zeTask.getWrappedRecord(), chuckNorrisHasDeleteAccessOnTask))
.isTrue();
assertThat(taskPresenterServices.isSendReminderButtonVisible(zeTask.getWrappedRecord(), chuckNorrisHasDeleteAccessOnTask))
.isTrue();
assertThat(taskPresenterServices.isDeleteTaskButtonVisible(zeTask.getWrappedRecord(),
chuckNorrisHasDeleteAccessOnTask)).isTrue();
assertThat(taskPresenterServices.isCompleteTaskButtonVisible(zeTask.getWrappedRecord(), chuckNorrisHasDeleteAccessOnTask))
.isFalse();
assertThat(taskPresenterServices.isCloseTaskButtonVisible(zeTask.getWrappedRecord(), chuckNorrisHasDeleteAccessOnTask))
.isFalse();
}
@Test
public void givenTaskWithDueDateNotSetThenIsFinishedOnTime()
throws Exception {
when(taskVOMock.getDueDate()).thenReturn(null);
assertThat(taskPresenterServices.isTaskOverdue(taskVOMock)).isFalse();
}
@Test
public void givenTaskWithEndDateAfterDueDateThenIsNotFinishedOnTime()
throws Exception {
when(taskVOMock.getDueDate()).thenReturn(now.minusDays(2));
when(taskVOMock.getEndDate()).thenReturn(now.minusDays(1));
assertThat(taskPresenterServices.isTaskOverdue(taskVOMock)).isTrue();
}
@Test
public void givenTaskWithEndDateEqualsDueDateThenIsFinishedOnTime()
throws Exception {
when(taskVOMock.getDueDate()).thenReturn(now);
when(taskVOMock.getEndDate()).thenReturn(now);
assertThat(taskPresenterServices.isTaskOverdue(taskVOMock)).isFalse();
}
@Test
public void givenTaskWithNowDueDateAndNullEndDateThenWhenIsNotFinishedOnTimeThenFalse()
throws Exception {
when(taskVOMock.getDueDate()).thenReturn(now);
when(taskVOMock.getEndDate()).thenReturn(null);
assertThat(taskPresenterServices.isTaskOverdue(taskVOMock)).isFalse();
}
@Test
public void givenTaskWithEndDateBeforeDueDateThenIsFinishedOnTime()
throws Exception {
when(taskVOMock.getDueDate()).thenReturn(now.plusDays(1));
when(taskVOMock.getEndDate()).thenReturn(now);
assertThat(taskPresenterServices.isTaskOverdue(taskVOMock)).isFalse();
}
@Test
public void givenTaskWithFixedReminderDateWhenToTaskThenRemindersSetCorrectly()
throws Exception {
when(taskVOMock.getTitle()).thenReturn("zeTitle");
TaskReminderVO taskReminderWithFixedDate = new TaskReminderVO();
taskReminderWithFixedDate.setFixedDate(now.plusDays(2));
when(taskVOMock.getReminders()).thenReturn(asList(taskReminderWithFixedDate));
Task task = taskPresenterServices.toTask(taskVOMock, tasksSchemas.newTask().getWrappedRecord());
assertThat(task.getReminders().size()).isEqualTo(1);
assertThat(task.getReminders().get(0).getFixedDate()).isEqualTo(now.plusDays(2));
}
@Test
public void givenTaskWithFollowerWhenToTaskThenFollowersSetCorrectly()
throws Exception {
when(taskVOMock.getTitle()).thenReturn("zeTitle");
TaskFollowerVO followerVO = new TaskFollowerVO();
followerVO.setFollowerId(users.adminIn(zeCollection).getId());
followerVO.setFollowTaskCompleted(true);
when(taskVOMock.getTaskFollowers()).thenReturn(asList(followerVO));
Task task = taskPresenterServices.toTask(taskVOMock, tasksSchemas.newTask().getWrappedRecord());
assertThat(task.getTaskFollowers().size()).isEqualTo(1);
TaskFollower taskFollower = task.getTaskFollowers().get(0);
assertThat(taskFollower.getFollowerId()).isEqualTo(followerVO.getFollowerId());
assertThat(taskFollower.getFollowTaskCompleted()).isTrue();
}
@Test
public void givenTaskNotAssignedWhenIsAssignedToUserThenFalse()
throws Exception {
recordServices.update(zeTask.setAssignee(null).setAssignationDate(null)
.setAssigneeGroupsCandidates(null).setAssigneeUsersCandidates(null).setAssigner(null));
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(taskPresenterServices.isAssignedToUser(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask)).isFalse();
}
@Test
public void givenTaskAssignedToAliceWhenIsAssignedToAliceThenOk()
throws Exception {
recordServices.update(zeTask.setAssignee(aliceHasWriteAccessOnZeTask.getId()).setAssigneeGroupsCandidates(
null).setAssigneeUsersCandidates(null));
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(taskPresenterServices.isAssignedToUser(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask)).isTrue();
}
@Test
public void givenTaskAssignedToAliceAndBobWhenIsAssignedToAliceThenOk()
throws Exception {
recordServices.update(zeTask.setAssigneeUsersCandidates(
asList(aliceHasWriteAccessOnZeTask.getId(), bobHasReadAccessOnTask.getId()))
.setAssigneeUsersCandidates(null).setAssigneeGroupsCandidates(null));
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(taskPresenterServices.isAssignedToUser(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask)).isTrue();
}
@Test
public void givenTaskAssignedToAliceGroupWhenIsAssignedToAliceThenOk()
throws Exception {
UserServices userServices = getModelLayerFactory().newUserServices();
String newGlobalGroup = "newGlobalGroup";
addGroup(newGlobalGroup);
String aliceNewGlobalGroup = "aliceNewGlobalGroup";
addGroup(aliceNewGlobalGroup);
String taskNewGlobalGroup = "taskNewGlobalGroup";
addGroup(taskNewGlobalGroup);
Group newGroup = userServices.getGroupInCollection(newGlobalGroup, zeCollection);
Group taskNewGroup = userServices.getGroupInCollection(taskNewGlobalGroup, zeCollection);
userServices.addUpdateUserCredential(users.alice().withGlobalGroups(asList(newGlobalGroup, aliceNewGlobalGroup)));
aliceHasWriteAccessOnZeTask = users.aliceIn(zeCollection);
recordServices.update(zeTask.setAssigneeGroupsCandidates(asList(newGroup.getId(), taskNewGroup.getId()))
.setAssignee(null).setAssigneeUsersCandidates(null)
);
zeTask = tasksSchemas.getTask(zeTask.getId());
assertThat(taskPresenterServices.isAssignedToUser(zeTask.getWrappedRecord(), aliceHasWriteAccessOnZeTask)).isTrue();
}
private void addGroup(String groupCode) {
UserServices userServices = getModelLayerFactory().newUserServices();
GlobalGroup group = userServices.createGlobalGroup(
groupCode, groupCode, new ArrayList<String>(), null, GlobalGroupStatus.ACTIVE, true);
userServices.addUpdateGlobalGroup(group);
}
}