package com.constellio.app.modules.tasks.model.managers; import static com.constellio.app.modules.tasks.TasksEmailTemplates.TASK_ASSIGNED_TO_YOU; 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.ArrayList; import java.util.List; import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Test; import com.constellio.app.modules.tasks.TasksEmailTemplates; import com.constellio.app.modules.tasks.model.wrappers.Task; import com.constellio.app.modules.tasks.model.wrappers.structures.TaskReminder; import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices; import com.constellio.model.entities.records.wrappers.EmailToSend; import com.constellio.model.entities.structures.EmailAddress; 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 TaskReminderEmailManagerAcceptanceTest extends ConstellioTest { private LocalDate now = LocalDate.now(); Users users = new Users(); Task zeTask; private TasksSchemasRecordsServices schemas; private TaskReminderEmailManager manager; private SearchServices searchServices; private UserServices userServices; private List<EmailAddress> allAssigneesAddresses; private List<EmailAddress> allAssigneeGroupsAddresses; private List<EmailAddress> allAssigneeUsersAddresses; private TaskReminder reminderAfterNow; private TaskReminder reminderBeforeNow; private TaskReminder reminderNow; private RecordServices recordServices; @Before public void setUp() throws Exception { prepareSystem(withZeCollection().withTasksModule().withAllTest(users)); givenTimeIs(now); schemas = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory()); manager = schemas.getTaskReminderEmailManager(); searchServices = getModelLayerFactory().newSearchServices(); userServices = getModelLayerFactory().newUserServices(); recordServices = getModelLayerFactory().newRecordServices(); setupTestData(); } private void setupTestData() throws RecordServicesException { String aliceAndBobGroupId = users.heroesIn(zeCollection).getId(); users.aliceIn(zeCollection); userServices.addUpdateUserCredential(users.alice().withCollections(asList(zeCollection)) .withGlobalGroups(asList(users.heroesIn(zeCollection).getCode()))); userServices.addUpdateUserCredential(users.bob().withCollections(asList(zeCollection)) .withGlobalGroups(asList(users.heroesIn(zeCollection).getCode()))); userServices.addUpdateUserCredential(users.chuckNorris().withGlobalGroups(new ArrayList<String>())); userServices.setGlobalGroupUsers(users.heroes().getCode(), asList(users.alice(), users.bob())); EmailAddress aliceEmailAddress = new EmailAddress(users.alice().getTitle(), users.alice().getEmail()); EmailAddress bobEmailAddress = new EmailAddress(users.bob().getTitle(), users.bob().getEmail()); EmailAddress chuckEmailAddress = new EmailAddress(users.chuckNorris().getTitle(), users.chuckNorris().getEmail()); reminderBeforeNow = new TaskReminder().setFixedDate(now.minusDays(1)); reminderAfterNow = new TaskReminder().setFixedDate(now.plusDays(1)); reminderNow = new TaskReminder().setFixedDate(now); allAssigneeUsersAddresses = asList(aliceEmailAddress, chuckEmailAddress); allAssigneeGroupsAddresses = asList(aliceEmailAddress, bobEmailAddress); allAssigneesAddresses = asList(aliceEmailAddress, chuckEmailAddress, bobEmailAddress); zeTask = schemas.newTask() .setReminders(asList(reminderBeforeNow, reminderAfterNow, reminderNow)) .setAssigneeGroupsCandidates(asList(aliceAndBobGroupId)) .setAssigneeUsersCandidates( asList(users.aliceIn(zeCollection).getId(), users.chuckNorrisIn(zeCollection).getId())); zeTask.setTitle("zeTitle"); zeTask = saveAndReload(zeTask); assertThat(zeTask.getNextReminderOn()).isEqualTo(now.minusDays(1)); } private Task saveAndReload(Task task) throws RecordServicesException { recordServices.add(task.getWrappedRecord()); return schemas.getTask(task.getId()); } @Test public void givenTaskWithoutNextReminderOnWhenManagerCalledThenNoReminderEmailGenerated() throws Exception { zeTask.setReminders(null); recordServices.add(zeTask); zeTask = schemas.getTask(zeTask.getId()); assertThat(zeTask.getNextReminderOn()).isNull(); manager.generateReminderEmails(); assertThat(getEmailToSendWithTemplateIdDifferentFromAssignedToYouCount()).isEqualTo(0); } @Test public void givenTaskWithAliceAssigneeAndAliceWithBlankEmailWhenManagerCalledThenNoReminderEmailGenerated() throws Exception { userServices.addUpdateUserCredential(users.alice().withGlobalGroups(new ArrayList<String>()).withEmail(null)); zeTask = saveAndReload(zeTask.setAssignee(users.aliceIn(zeCollection).getId()) .setAssignationDate(now) .setAssigner(users.adminIn(zeCollection).getId()) .setAssigneeGroupsCandidates(new ArrayList<String>()) .setAssigneeUsersCandidates(new ArrayList<String>())); manager.generateReminderEmails(); assertThat(getEmailToSendWithTemplateIdDifferentFromAssignedToYouCount()).isEqualTo(0); } @Test public void givenTaskWithoutAssigneesWhenManagerCalledThenNoReminderEmailGenerated() throws Exception { zeTask = saveAndReload( zeTask.setAssigneeGroupsCandidates(new ArrayList<String>()).setAssigneeUsersCandidates(new ArrayList<String>())); assertThat(zeTask.getAssigneeGroupsCandidates()).isEqualTo(new ArrayList<String>()); assertThat(zeTask.getAssigneeUsersCandidates()).isEqualTo(new ArrayList<String>()); manager.generateReminderEmails(); assertThat(getEmailToSendWithTemplateIdDifferentFromAssignedToYouCount()).isEqualTo(0); } @Test public void givenTaskWithNextReminderOnBeforeNowAndValidAssignedToWhenManagerCalledThenReminderEmailGenerated() throws Exception { manager.generateReminderEmails(); assertValidEmailToSendCreated(allAssigneesAddresses); } @Test public void givenTaskWithNextReminderOnAfterNowWhenManagerCalledThenNoReminderNoEmailGenerated() throws Exception { zeTask = saveAndReload(zeTask.setReminders(asList(reminderAfterNow))); assertThat(zeTask.getNextReminderOn()).isEqualTo(reminderAfterNow.getFixedDate()); manager.generateReminderEmails(); assertThat(getEmailToSendWithTemplateIdDifferentFromAssignedToYouCount()).isEqualTo(0); } @Test public void givenTaskWithValidNextReminderOnButRemindersProcessedThenNoReminderEmailGenerated() throws Exception { List<TaskReminder> processedReminders = zeTask.getReminders(); for (TaskReminder taskReminder : processedReminders) { taskReminder.setProcessed(true); } zeTask = saveAndReload(zeTask.setAssigneeUsersCandidates(new ArrayList<String>()).setReminders(processedReminders)); assertThat(zeTask.getAssigneeUsersCandidates()).isEqualTo(new ArrayList<String>()); manager.generateReminderEmails(); assertThat(getEmailToSendWithTemplateIdDifferentFromAssignedToYouCount()).isEqualTo(0); } @Test public void givenTaskWithValidNextReminderOnAndAssignedToGroupWhenManagerCalledThenReminderEmailGeneratedToBeSentToAllGroupUsers() throws Exception { zeTask = saveAndReload(zeTask.setAssigneeUsersCandidates(new ArrayList<String>())); assertThat(zeTask.getAssigneeUsersCandidates()).isEqualTo(new ArrayList<String>()); manager.generateReminderEmails(); assertValidEmailToSendCreated(allAssigneeGroupsAddresses); } @Test public void givenTaskWithReminderBeforeNowAndReminderAfterNowWhenManagerCalledThenReminderBeforeNowSetToProcessed() throws Exception { manager.generateReminderEmails(); zeTask = schemas.getTask(zeTask.getId()); List<TaskReminder> reminders = zeTask.getReminders(); assertThat(reminders.size()).isEqualTo(3); reminderBeforeNow = reminders.get(0); assertThat(reminderBeforeNow.isProcessed()).isTrue(); reminderAfterNow = reminders.get(1); assertThat(reminderAfterNow.isProcessed()).isFalse(); reminderNow = reminders.get(2); assertThat(reminderBeforeNow.isProcessed()).isTrue(); assertThat(zeTask.getNextReminderOn()).isEqualTo(now.plusDays(1)); } @Test public void givenTaskWithValidNextReminderOnAndAssignedToUsersWhenManagerCalledThenReminderEmailGeneratedToBeSentToAllUsers() throws Exception { zeTask = saveAndReload(zeTask.setAssigneeGroupsCandidates(new ArrayList<String>())); manager.generateReminderEmails(); assertValidEmailToSendCreated(allAssigneeUsersAddresses); } @Test public void testPagination() throws Exception { TaskReminderEmailManager.RECORDS_BATCH = 1; givenTowValidTasksThenTowEmailsCreated(); } private void givenTowValidTasksThenTowEmailsCreated() throws RecordServicesException { Task task2 = schemas.newTask() .setAssignee(users.aliceIn(zeCollection).getId()) .setAssignationDate(now) .setAssigner(users.adminIn(zeCollection).getId()) .setReminders(asList(reminderBeforeNow)) .setTitle("task2"); recordServices.add(task2); manager.generateReminderEmails(); assertThat(getEmailToSendWithTemplateIdDifferentFromAssignedToYouCount()).isEqualTo(2); } private Long getEmailToSendWithTemplateIdDifferentFromAssignedToYouCount() { LogicalSearchCondition condition = from(schemas.emailToSend()) .where(schemas.emailToSend().getMetadata(EmailToSend.TEMPLATE)).isNotEqual(TASK_ASSIGNED_TO_YOU); return searchServices.getResultsCount(condition); } private void assertValidEmailToSendCreated(List<EmailAddress> expectedToEmails) { LogicalSearchCondition condition = from(schemas.emailToSend()) .where(schemas.emailToSend().getMetadata(EmailToSend.TEMPLATE)).isNotEqual(TASK_ASSIGNED_TO_YOU); EmailToSend emailToSend = schemas .wrapEmailToSend(searchServices.searchSingleResult(condition)); assertThat(emailToSend.getTo().size()).isEqualTo(expectedToEmails.size()); assertThat(emailToSend.getTo()).containsAll(expectedToEmails); assertThat(emailToSend.getTemplate()).isEqualTo(TasksEmailTemplates.TASK_REMINDER); assertThat(emailToSend.getFrom()).isNull(); assertThat(emailToSend.getSendOn().toLocalDate()).isEqualTo(now); assertThat(emailToSend.getSubject()).isNull(); } }