package com.constellio.app.modules.tasks.extensions;
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.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
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.services.TasksSchemasRecordsServices;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.EmailToSend;
import com.constellio.model.entities.records.wrappers.Group;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.security.global.UserCredential;
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 TaskSchemasExtensionTestAssigneeAlertAcceptanceTest extends ConstellioTest {
Users users = new Users();
RecordServices recordServices;
private LocalDateTime now = LocalDateTime.now();
private Task zeTask;
private TasksSchemasRecordsServices tasksSchemas;
private SearchServices searchServices;
private MetadataSchema emailToSendSchema;
User alice;
String aliceId;
@Before
public void setUp()
throws Exception {
givenTimeIs(now);
prepareSystem(withZeCollection().withTasksModule().withAllTest(users));
alice = users.aliceIn(zeCollection);
aliceId = alice.getId();
recordServices = getModelLayerFactory().newRecordServices();
searchServices = getModelLayerFactory().newSearchServices();
tasksSchemas = new TasksSchemasRecordsServices(zeCollection, getAppLayerFactory());
emailToSendSchema = tasksSchemas.emailToSend();
zeTask = tasksSchemas.newTask();
recordServices.add(zeTask.setTitle("taskTitle"));
recordServices.flush();
}
@Test
public void givenTaskAssigneeModifiedToAliceThenEmailToSendToAliceCreatedWithTaskAssignedToYouTemplate()
throws RecordServicesException {
recordServices.add(zeTask.setAssignee(aliceId).setAssignationDate(now.toLocalDate()).setAssigner(aliceId));
recordServices.flush();
EmailToSend toAlice = getEmailToSendByTemplateId(TASK_ASSIGNED_TO_YOU);
assertThat(toAlice.getTo().get(0).getEmail()).isEqualTo(alice.getEmail());
}
@Test
public void givenTaskAssigneeModifiedToHeroesThenEmailToSendToHeroesCreatedWithTaskAssignedToYouTemplate()
throws RecordServicesException {
Group heroes = users.heroesIn(zeCollection);
for (final UserCredential user : getModelLayerFactory().newUserServices().getGlobalGroupActifUsers(heroes.getCode())) {
user.withPersonalEmails(Arrays.asList(user.getUsername()+".personal.mail@gmail.com"));
getModelLayerFactory().newUserServices().addUpdateUserCredential(user);
}
List<String> heroesEmails = getGroupUsersEmails(heroes);
assertThat(heroesEmails).isNotEmpty();
recordServices.add(zeTask.setAssigneeGroupsCandidates(asList(heroes.getId())).setAssignationDate(now.toLocalDate())
.setAssigner(aliceId));
recordServices.flush();
EmailToSend emailToSend = getEmailToSendByTemplateId(TASK_ASSIGNED_TO_YOU);
assertThat(emailToSend).isNotNull();
List<String> emailToSendRecipients = getRecipients(emailToSend);
assertThat(emailToSendRecipients.size()).isEqualTo(heroesEmails.size());
assertThat(emailToSendRecipients).containsAll(heroesEmails);
}
@Test
public void givenTaskAssigneeSetToNullThenNoEmailToSendCreatedWithTaskAssignedToYouTemplate()
throws RecordServicesException {
recordServices.add(zeTask.setAssignee(null).setAssigner(null).setAssignationDate(null));
recordServices.flush();
assertThat(getEmailToSendByTemplateId(TASK_ASSIGNED_TO_YOU)).isNull();
}
@Test
public void givenTaskCreatedWithoutAssigneeThenNoEmailToSendCreatedWithTaskAssignedToYouTemplate()
throws RecordServicesException {
Task newTask = tasksSchemas.newTask();
recordServices.add(newTask.setTitle("newTask"));
recordServices.flush();
assertThat(getEmailToSendByTemplateId(TASK_ASSIGNED_TO_YOU)).isNull();
}
@Test
public void givenTaskCreatedWithAssigneeThenEmailToSendCreatedWithTaskAssignedToYouTemplate()
throws RecordServicesException {
User alice = users.aliceIn(zeCollection);
alice.setPersonalEmails(Arrays.asList("alice.personal.mail@gmail.com"));
recordServices.update(alice);
Task newTask = tasksSchemas.newTask();
recordServices
.add(newTask.setTitle("newTask").setAssignee(alice.getId()).setAssigner(alice.getId())
.setAssignationDate(now.toLocalDate()));
recordServices.flush();
EmailToSend toAlice = getEmailToSendByTemplateId(TASK_ASSIGNED_TO_YOU);
assertThat(toAlice.getTo().size()).isEqualTo(2);
final Set<String> actualRecipents = new HashSet<>(Arrays.asList(toAlice.getTo().get(0).getEmail(), toAlice.getTo().get(1).getEmail()));
final List<String> expectedRecipents = new ArrayList<>(alice.getPersonalEmails());
expectedRecipents.add(alice.getEmail());
assertThat(actualRecipents).isEqualTo(new HashSet<>(expectedRecipents));
}
private List<String> getGroupUsersEmails(Group group) {
List<String> returnList = new ArrayList<>();
UserServices userServices = getModelLayerFactory().newUserServices();
List<UserCredential> groupUsers = userServices
.getGlobalGroupActifUsers(group.getCode());
for (UserCredential user : groupUsers) {
String email = user.getEmail();
if (StringUtils.isNotBlank(email)) {
returnList.add(email);
}
if (!CollectionUtils.isEmpty(user.getPersonalEmails())) {
for (final String personalEmail : user.getPersonalEmails()) {
returnList.add(personalEmail);
}
}
}
return returnList;
}
private List<String> getRecipients(EmailToSend emailToSend) {
List<String> recipients = new ArrayList<>();
for (EmailAddress emailAddress : emailToSend.getTo()) {
recipients.add(emailAddress.getEmail());
}
for (EmailAddress emailAddress : emailToSend.getBCC()) {
recipients.add(emailAddress.getEmail());
}
for (EmailAddress emailAddress : emailToSend.getCC()) {
recipients.add(emailAddress.getEmail());
}
return recipients;
}
private EmailToSend getEmailToSendByTemplateId(String templateId) {
LogicalSearchCondition condition = from(emailToSendSchema)
.where(tasksSchemas.emailToSend().getMetadata(EmailToSend.TEMPLATE)).is(templateId);
Record emailRecord = searchServices.searchSingleResult(condition);
if (emailRecord != null) {
return tasksSchemas.wrapEmailToSend(emailRecord);
} else {
return null;
}
}
}