package com.constellio.app.modules.tasks.extensions;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.COMPLETE_TASK;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.CONSTELLIO_URL;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.DISPLAY_TASK;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.PARENT_TASK_TITLE;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_ASSIGNED;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_ASSIGNED_BY;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_ASSIGNED_ON;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_ASSIGNED_TO_YOU;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_ASSIGNEE_MODIFIED;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_COMPLETED;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_DELETED;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_DESCRIPTION;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_DUE_DATE;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_STATUS;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_STATUS_MODIFIED;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_SUB_TASKS_MODIFIED;
import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_TITLE_PARAMETER;
import static com.constellio.app.modules.tasks.model.wrappers.Task.START_DATE;
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 java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.*;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.structures.EmailAddress;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.LocalDate;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
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.structures.TaskReminder;
import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus;
import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.EmailToSend;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.Schemas;
import com.constellio.model.services.migrations.ConstellioEIMConfigs;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.search.SearchServices;
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 TaskRecordExtensionAcceptanceTest extends ConstellioTest {
private TaskRecordExtension taskRecordExtension;
Users users = new Users();
RecordServices recordServices;
UserServices userServices;
ConstellioEIMConfigs eimConfigs;
String constellioUrl;
private LocalDateTime now = LocalDateTime.now();
private Task zeTask;
private Task validParentTaskFollowingSubTasks;
private TasksSchemasRecordsServices tasksSchemas;
private SearchServices searchServices;
private MetadataSchema emailToSendSchema;
private List<TaskFollower> zeFollowers;
private TaskFollower zeTaskStatusModificationFollower;
private TaskFollower zeTaskDeletionFollower;
private TaskFollower zeTaskFinishedEventFollower;
private TaskFollower zeTaskAssigneeModificationFollower;
private TaskFollower zeTaskSubTasksModificationFollower;
private LocalDate newStartDate = LocalDate.now().minusDays(2);
private TaskReminder processedReminderWithRelativeDateBeforeStartDate_0;
private TaskReminder processedReminderWithRelativeDateAfterStartDate_1;
private TaskReminder processedReminderWithFixedDateAfterNewStartDate_3;
private TaskReminder processedReminderWithRelativeDateEqualsStartDate_2;
private TaskReminder processedReminderWithRelativeDateAfterEndDate_4;
@Before
public void setUp()
throws Exception {
givenTimeIs(now);
prepareSystem(withZeCollection().withTasksModule().withAllTest(users));
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
tasksSchemas = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
emailToSendSchema = tasksSchemas.emailToSend();
taskRecordExtension = new TaskRecordExtension(zeCollection, getAppLayerFactory());
userServices = getModelLayerFactory().newUserServices();
eimConfigs = new ConstellioEIMConfigs(getModelLayerFactory().getSystemConfigurationsManager());
constellioUrl = eimConfigs.getConstellioUrl();
initTasks();
}
private void initTasks()
throws RecordServicesException {
zeTaskDeletionFollower = new TaskFollower().setFollowerId(users.aliceIn(zeCollection).getId())
.setFollowTaskDeleted(true);
zeTaskFinishedEventFollower = new TaskFollower().setFollowerId(users.charlesIn(zeCollection).getId())
.setFollowTaskCompleted(true);
zeTaskStatusModificationFollower = new TaskFollower().setFollowerId(users.chuckNorrisIn(zeCollection).getId())
.setFollowTaskStatusModified(true);
zeTaskAssigneeModificationFollower = new TaskFollower().setFollowerId(users.bobIn(zeCollection).getId())
.setFollowTaskAssigneeModified(true);
zeTaskSubTasksModificationFollower = new TaskFollower().setFollowerId(users.adminIn(zeCollection).getId())
.setFollowSubTasksModified(true);
zeFollowers = new ArrayList<>(asList(zeTaskDeletionFollower, zeTaskFinishedEventFollower,
zeTaskStatusModificationFollower, zeTaskAssigneeModificationFollower, zeTaskSubTasksModificationFollower));
validParentTaskFollowingSubTasks = tasksSchemas.newTask().setTitle("parentTask");
validParentTaskFollowingSubTasks.setTaskFollowers(asList(zeTaskSubTasksModificationFollower));
recordServices.add(validParentTaskFollowingSubTasks);
zeTask = tasksSchemas.newTask();
recordServices.add(zeTask.setTitle("taskTitle")
.setTaskFollowers(zeFollowers)
.setAssignee(users.chuckNorrisIn(zeCollection).getId())
.setAssigner(users.aliceIn(zeCollection).getId())
.setAssignationDate(now.toLocalDate())
.setParentTask(validParentTaskFollowingSubTasks.getId())
);
recordServices.flush();
}
@Test
public void givenTaskStatusModifiedToCompletedThenOneValidEmailToSendToAssignerAndFollowerIsCreatedAndTaskEndDateSetToNow()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(FIN()));
recordServices.flush();
EmailToSend emailToSend = getEmailToSendNotHavingAssignedToYouTemplateId();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(TASK_COMPLETED);
assertThatParametersAreOk(zeTask, emailToSend);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(2);
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
final Set<String> expectedRecipients = new HashSet<>();
for (EmailAddress emailAddress : emailToSend.getTo()) {
expectedRecipients.add(emailAddress.getEmail());
}
assertThat(expectedRecipients).isEqualTo(new HashSet<>(Arrays.asList(getUserEmail(users.aliceIn(zeCollection).getId()), getUserEmail(zeTaskFinishedEventFollower.getFollowerId()))));
}
@Test
public void givenTaskWithCompletedStatusWhenStatusSetToCompletedThenEndDateNotModified()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
givenTimeIs(now.plusDays(1));
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
}
@Test
public void givenTaskStandbyStatusWhenStatusSetToCompletedThenEndDateSetCorrectly()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(STB()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
givenTimeIs(now.plusDays(1));
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.plusDays(1).toLocalDate());
}
@Test
public void givenTaskStandbyStatusWhenStatusSetToAfterCompletedThenEndDateSetCorrectly()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(STB()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
givenTimeIs(now);
recordServices.add(zeTask.setStatus(AFTER_FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
}
@Test
public void givenTaskBeforeCompletedStatusWhenStatusSetToAfterCompletedThenEndDateSetCorrectly()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(INP()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
givenTimeIs(now);
recordServices.add(zeTask.setStatus(AFTER_FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
}
@Test
public void whenStatusSetToNullThenEndDateSetToNull()
throws RecordServicesException {
givenStandbyStatusWhenStatusSetToNullThenEndDateSetToNull();
givenCompletedStatusWhenStatusSetToStandbyThenEndDateSetToNull();
givenUnCompletedStatusWhenStatusSetToStandbyThenEndDateSetToNull();
givenAfterCompletedStatusWhenStatusSetToStandbyThenEndDateSetToNull();
}
private void givenAfterCompletedStatusWhenStatusSetToStandbyThenEndDateSetToNull()
throws RecordServicesException {
givenTimeIs(now);
recordServices.add(zeTask.setStatus(AFTER_FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
recordServices.add(zeTask.setStatus(STB()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
}
private void givenUnCompletedStatusWhenStatusSetToStandbyThenEndDateSetToNull()
throws RecordServicesException {
givenTimeIs(now);
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
recordServices.add(zeTask.setStatus(STB()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
}
private void givenCompletedStatusWhenStatusSetToStandbyThenEndDateSetToNull()
throws RecordServicesException {
givenTimeIs(now.plusDays(1));
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.plusDays(1).toLocalDate());
recordServices.add(zeTask.setStatus(STB()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
}
private void givenStandbyStatusWhenStatusSetToNullThenEndDateSetToNull()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(STB()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
}
@Test
public void givenTaskWithUnCompletedStatusWhenStatusSetToCompletedThenEndDateSetCorrectly()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(INP()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
givenTimeIs(now.plusDays(1));
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.plusDays(1).toLocalDate());
}
@Test
public void givenTaskWithCompletedStatusWhenStatusSetToBeforeFinishedThenEndDateSetToNull()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
givenTimeIs(now.plusDays(1));
recordServices.add(zeTask.setStatus((INP())));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(null);
}
@Test
public void givenTaskCreatedWithCompletedStatusThenEndDateSetAndNoEmailToSendCreated()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask().setTitle("title").setStatus(FIN());
recordServices.add(newTask);
recordServices.flush();
assertThat(tasksSchemas.getTask(newTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
assertThat(getEmailToSendNotHavingAssignedToYouTemplateId()).isNull();
}
@Test
public void givenTaskWithCompletedStatusWhenStatusSetToAfterFinishedThenEndDateNotSet()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
givenTimeIs(now.plusDays(1));
recordServices.add(zeTask.setStatus((AFTER_FIN())));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
}
@Test
public void givenTaskStatusModifiedThenValidEmailToSendCreated()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(INP()));
recordServices.flush();
EmailToSend emailToSend = getEmailToSendNotHavingAssignedToYouTemplateId();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(TASK_STATUS_MODIFIED);
assertThatParametersAreOk(zeTask, emailToSend);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(1);
assertThat(emailToSend.getTo().get(0).getEmail())
.isEqualTo(getUserEmail(zeTaskStatusModificationFollower.getFollowerId()));
}
@Test
public void givenTaskWithPreviousParentNullWhenParentSetToNewNewParentFollowingSubTasksThenValidEmailToSendCreated()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask();
recordServices.add(newTask.setTitle("new task")
.setParentTask(validParentTaskFollowingSubTasks.getId())
.setTaskFollowers(zeFollowers)
.setAssigner(users.adminIn(zeCollection).getId())
.setAssignee(users.adminIn(zeCollection).getId())
.setAssignationDate(now.plusDays(1).toLocalDate())
);
recordServices.add(newTask.setParentTask((String) null));
recordServices.flush();
EmailToSend emailToSend = getEmailToSendNotHavingAssignedToYouTemplateId();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(TASK_SUB_TASKS_MODIFIED);
assertThatParametersAreOk(newTask, emailToSend);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(1);
assertThat(emailToSend.getTo().get(0).getEmail())
.isEqualTo(getUserEmail(zeTaskSubTasksModificationFollower.getFollowerId()));
}
@Test
public void givenTaskWithPreviousParentFollowingSubTasksWhenParentSetToNullThenValidEmailToSendCreated()
throws RecordServicesException {
recordServices.add(zeTask.setParentTask((String) null));
recordServices.flush();
EmailToSend emailToSend = getEmailToSendNotHavingAssignedToYouTemplateId();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(TASK_SUB_TASKS_MODIFIED);
assertThatParametersAreOk(zeTask, emailToSend);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(1);
assertThat(emailToSend.getTo().get(0).getEmail())
.isEqualTo(getUserEmail(zeTaskSubTasksModificationFollower.getFollowerId()));
}
@Test
public void givenTaskAssigneeModifiedThenValidEmailToSendCreated()
throws RecordServicesException {
String aliceId = users.aliceIn(zeCollection).getId();
recordServices.add(zeTask.setAssignee(aliceId));
recordServices.flush();
EmailToSend emailToSend = getEmailToSendNotHavingAssignedToYouTemplateId();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(TASK_ASSIGNEE_MODIFIED);
assertThatParametersAreOk(zeTask, emailToSend);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(1);
assertThat(emailToSend.getTo().get(0).getEmail())
.isEqualTo(getUserEmail(zeTaskAssigneeModificationFollower.getFollowerId()));
}
@Test
public void givenTaskAssignedOnModifiedThenNoEmailToSendCreated()
throws RecordServicesException {
recordServices.add(zeTask.setAssignationDate(now.toLocalDate()));
recordServices.flush();
assertThat(getEmailToSendNotHavingAssignedToYouTemplateId()).isNull();
}
@Test
public void givenTaskAssigneeModifiedAndNoFollowersThenNoEmailToSendCreated()
throws RecordServicesException {
String aliceId = users.aliceIn(zeCollection).getId();
recordServices.add(zeTask.setAssignee(aliceId).setTaskFollowers(new ArrayList<TaskFollower>()));
recordServices.flush();
assertThat(getEmailToSendNotHavingAssignedToYouTemplateId(
))
.isNull();
}
@Test
public void givenTaskDeletedLogicallyThenValidEmailToSendCreated() {
recordServices.logicallyDelete(zeTask.getWrappedRecord(), null);
recordServices.flush();
EmailToSend emailToSend = getEmailToSendNotHavingAssignedToYouTemplateId();
assertThat(emailToSend).isNotNull();
assertThat(emailToSend.getTemplate()).isEqualTo(TASK_DELETED);
assertThatParametersAreOk(zeTask, emailToSend);
assertThat(emailToSend.getFrom()).isNull();
assertThat(emailToSend.getSendOn()).isEqualTo(now);
assertThat(emailToSend.getTo().size()).isEqualTo(1);
assertThat(emailToSend.getTo().get(0).getEmail()).isEqualTo(getUserEmail(zeTaskDeletionFollower.getFollowerId()));
}
@Test
public void givenTaskDeletedLogicallyAndNoFollowersThenNoEmailToSendCreated()
throws RecordServicesException {
zeTask.setTaskFollowers(null);
recordServices.add(zeTask);
recordServices.flush();
taskRecordExtension.sendDeletionEventToFollowers(zeTask);
assertThat(getEmailToSendNotHavingAssignedToYouTemplateId()).isNull();
}
@Test
public void givenProcessedRemindersRelativeToStartDateWhenStartDateSetToNewStartDateThenAllRemindersWithDatesAfterNewStartDateAreSetToUnProcessed()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask();
newTask.setTitle("zeTitle");
List<TaskReminder> reminders = initReminders();
newTask.setReminders(reminders);
recordServices.add(newTask);
newTask = reloadTask(newTask.getId());
newTask.setStartDate(newStartDate);
recordServices.add(newTask);
reminders = newTask.getReminders();
assertThat(reminders.get(0).computeDate(newTask))
.isEqualTo(processedReminderWithRelativeDateBeforeStartDate_0.computeDate(newTask));
assertThat(reminders.get(0).isProcessed()).isTrue();
assertThat(reminders.get(1).computeDate(newTask))
.isEqualTo(processedReminderWithRelativeDateAfterStartDate_1.computeDate(newTask));
assertThat(reminders.get(1).isProcessed()).isFalse();
assertThat(reminders.get(2).computeDate(newTask))
.isEqualTo(processedReminderWithRelativeDateEqualsStartDate_2.computeDate(newTask));
assertThat(reminders.get(2).isProcessed()).isTrue();
assertThat(reminders.get(3).computeDate(newTask))
.isEqualTo(processedReminderWithFixedDateAfterNewStartDate_3.computeDate(newTask));
assertThat(reminders.get(3).isProcessed()).isTrue();
assertThat(reminders.get(4).computeDate(newTask))
.isEqualTo(processedReminderWithRelativeDateAfterEndDate_4.computeDate(newTask));
assertThat(reminders.get(4).isProcessed()).isTrue();
}
//start date
@Test
public void givenTaskWithNullStartDateAndWithNotStandbyWhenCreateTaskThenStartDateSet()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask().setTitle("title").setStatus(INP());
recordServices.add(newTask);
newTask = reloadTask(newTask.getId());
assertThat(newTask.getStartDate()).isEqualTo(now.toLocalDate());
assertThat(getEmailToSendNotHavingAssignedToYouTemplateId()).isNull();
}
@Test
public void givenTaskWithStartDateAndWithStatusNotStandbyWhenCreateTaskThenStartDateNotSet()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask().setTitle("title").setStartDate(now.toLocalDate().minusDays(1)).setStatus(INP());
recordServices.add(newTask);
newTask = reloadTask(newTask.getId());
assertThat(newTask.getStartDate()).isEqualTo(now.toLocalDate().minusDays(1));
}
@Test
public void givenTaskWithNullStartDateAndWithStandbyStatusWhenCreateTaskThenStartDateNotSet()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask().setTitle("title");
recordServices.add(newTask);
newTask = reloadTask(newTask.getId());
assertThat(newTask.getStatus()).isEqualTo(STB());
assertThat(newTask.getStartDate()).isNull();
}
@Test
public void givenTaskWithNullStartDateAndWithStatusNonStandbyWhenUpdateTaskThenStartDateSet()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask().setTitle("title");
recordServices.add(newTask);
assertThat(newTask.getStartDate()).isNull();
recordServices.add(newTask.setStatus(INP()));
newTask = reloadTask(newTask.getId());
assertThat(newTask.getStartDate()).isEqualTo(now.toLocalDate());
assertThat(getEmailToSendNotHavingAssignedToYouTemplateId()).isNull();
}
@Test
public void givenTaskWithStartDateAndWithStatusNonStandbyWhenUpdateTaskThenStartDateNotSet()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask().setTitle("title");
recordServices.add(newTask);
recordServices.add(newTask.setStatus(INP()).setStartDate(now.toLocalDate().minusDays(1)));
newTask = reloadTask(newTask.getId());
assertThat(newTask.getStartDate()).isEqualTo(now.toLocalDate().minusDays(1));
}
@Test
public void givenTaskWithNullStartDateAndWithNullStatusWhenUpdateTaskThenStartDateNotSet()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask().setTitle("title");
recordServices.add(newTask);
recordServices.add(newTask.setTitle("newTitle"));
newTask = reloadTask(newTask.getId());
assertThat(newTask.getStartDate()).isNull();
}
@Test
public void givenTaskWithCompletedStatusWhenStatusSetToStandbyThenStartDateSetToNull()
throws RecordServicesException {
recordServices.add(zeTask.setStatus(FIN()));
assertThat(tasksSchemas.getTask(zeTask.getId()).getEndDate()).isEqualTo(now.toLocalDate());
givenTimeIs(now.plusDays(1));
recordServices.add(zeTask.setStatus((STB())));
assertThat(tasksSchemas.getTask(zeTask.getId()).getStartDate()).isEqualTo(null);
}
private Task reloadTask(String id) {
return tasksSchemas.wrapTask(recordServices.getDocumentById(id));
}
private List<TaskReminder> initReminders() {
List<TaskReminder> reminders = new ArrayList<>();
processedReminderWithRelativeDateBeforeStartDate_0 = new TaskReminder().setRelativeDateMetadataCode(START_DATE)
.setBeforeRelativeDate(true).setNumberOfDaysToRelativeDate(1).setProcessed(true);
reminders.add(processedReminderWithRelativeDateBeforeStartDate_0);
processedReminderWithRelativeDateAfterStartDate_1 = new TaskReminder().setRelativeDateMetadataCode(START_DATE)
.setBeforeRelativeDate(false).setNumberOfDaysToRelativeDate(3).setProcessed(true);
reminders.add(processedReminderWithRelativeDateAfterStartDate_1);
processedReminderWithRelativeDateEqualsStartDate_2 = new TaskReminder().setRelativeDateMetadataCode(START_DATE)
.setBeforeRelativeDate(false).setNumberOfDaysToRelativeDate(0).setProcessed(true);
reminders.add(processedReminderWithRelativeDateEqualsStartDate_2);
processedReminderWithFixedDateAfterNewStartDate_3 = new TaskReminder().setFixedDate(newStartDate.plusDays(3))
.setProcessed(true);
reminders.add(processedReminderWithFixedDateAfterNewStartDate_3);
processedReminderWithRelativeDateAfterEndDate_4 = new TaskReminder().setRelativeDateMetadataCode(Task.DUE_DATE)
.setBeforeRelativeDate(false).setNumberOfDaysToRelativeDate(1).setProcessed(true);
reminders.add(processedReminderWithRelativeDateAfterEndDate_4);
return reminders;
}
private EmailToSend getEmailToSendNotHavingAssignedToYouTemplateId() {
LogicalSearchCondition condition = from(emailToSendSchema)
.where(tasksSchemas.emailToSend().getMetadata(EmailToSend.TEMPLATE))
.isNotEqual(TASK_ASSIGNED_TO_YOU);
Record emailRecord = searchServices.searchSingleResult(condition);
if (emailRecord != null) {
return tasksSchemas.wrapEmailToSend(emailRecord);
} else {
return null;
}
}
private String getUserEmail(String userId) {
return tasksSchemas
.wrapUser(searchServices.searchSingleResult(from(tasksSchemas.userSchema()).where(Schemas.IDENTIFIER).is(userId)))
.getEmail();
}
public String INP() {
TaskStatus frenchType = tasksSchemas.getTaskStatusWithCode("ENC");
if (frenchType == null) {
return tasksSchemas.getTaskStatusWithCode("INP").getId();
}
return frenchType.getId();
}
public String FIN() {
TaskStatus frenchType = tasksSchemas.getTaskStatusWithCode("TER");
assertThat(frenchType.isFinished()).isTrue();
return frenchType.getId();
}
public String AFTER_FIN() {
TaskStatus frenchType = tasksSchemas.getTaskStatusWithCode(CLOSED_CODE);
assertThat(frenchType.isAfterFinished()).isTrue();
return frenchType.getId();
}
public String STB() {
return tasksSchemas.getTaskStatusWithCode(STANDBY_CODE).getId();
}
private void assertThatParametersAreOk(Task task, EmailToSend emailToSend) {
String assignerFullName = getUserFullNameById(task.getAssigner());
assertThat(assignerFullName).isNotEmpty();
String assigneeFullName = getUserFullNameById(task.getAssignee());
assertThat(assigneeFullName).isNotEmpty();
assertThat(task.getAssignedOn()).isNotNull();
String parentTaskTitle = "";
if (task.getParentTask() != null) {
Task parentTask = tasksSchemas.getTask(task.getParentTask());
parentTaskTitle = parentTask.getTitle();
}
String status = tasksSchemas.getTaskStatus(task.getStatus()).getTitle();
assertThat(emailToSend.getParameters()).contains(
TASK_TITLE_PARAMETER + ":" + task.getTitle(),
PARENT_TASK_TITLE + ":" + parentTaskTitle,
TASK_ASSIGNED_BY + ":" + assignerFullName,
TASK_ASSIGNED_ON + ":" + task.getAssignedOn(),
TASK_ASSIGNED + ":" + assigneeFullName,
TASK_DUE_DATE + ":" + "",
TASK_STATUS + ":" + status,
TASK_DESCRIPTION + ":" + "",
DISPLAY_TASK + ":" + constellioUrl + "#!displayTask/" + task.getId(),
COMPLETE_TASK + ":" + constellioUrl + "#!editTask/completeTask%253Dtrue%253Bid%253D" + task.getId(),
CONSTELLIO_URL + ":" + constellioUrl
);
assertThat(emailToSend.getSubject()).isNull();
}
private String getUserNameById(String userId) {
if (StringUtils.isBlank(userId)) {
return "";
}
return tasksSchemas.wrapUser(recordServices.getDocumentById(userId)).getUsername();
}
private String getUserFullNameById(String userId) {
if (org.apache.commons.lang3.StringUtils.isBlank(userId)) {
return "";
}
return tasksSchemas.wrapUser(recordServices.getDocumentById(userId)).getFirstName() + " " +
tasksSchemas.wrapUser(recordServices.getDocumentById(userId)).getLastName();
}
@Test
public void givenTaskCreatedThenAssignerIsAddedByDefaultToCompletionEventFollowers()
throws RecordServicesException {
// Given
final User someAssigner = users.aliceIn(zeCollection);
final User someAssignee = users.bobIn(zeCollection);
final Task someTask = tasksSchemas.newTask().
setTitle("title").
setAssigner(someAssigner.getId()).
setAssignee(someAssignee.getId()).
setAssignationDate(now.toLocalDate()).
setAssignedOn(now.toLocalDate());
// When
recordServices.add(someTask);
recordServices.flush();
// Then
assertThat(tasksSchemas.getTask(someTask.getId()).getTaskFollowers()).isNotEmpty();
assertThat(tasksSchemas.getTask(someTask.getId()).getTaskFollowers()).contains(new TaskFollower().setFollowerId(someAssigner.getId()).setFollowTaskCompleted(true));
}
}