package com.constellio.model.services.emails;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMultipart;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import com.constellio.app.modules.rm.RMEmailTemplateConstants;
import com.constellio.data.utils.TimeProvider;
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.MetadataSchemaTypes;
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.schemas.MetadataSchemasManager;
import com.constellio.sdk.SDKPasswords;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.annotations.InternetTest;
import com.constellio.sdk.tests.annotations.SlowTest;
public class EmailBuilderAcceptTest extends ConstellioTest {
private static final String TEMPLATE_TITLE = "templateTitle";
private static final String TEMPLATE_TITLE_VALUE_WIHT_HTML_CODE = "templateTitle âé";
private static final String TEMPLATE_TITLE_FINAL_VALUE = "templateTitle âé";
private static final String CONTENT = "content";
private static final String SIGNATURE = "signature";
private static final String CONTENT_VALUE = "contentValue";
private static final String SIGNATURE_VALUE = "signatureValue";
public static final String TEST_SUBJECT = "test subject";
EmailBuilder builder;
@Mock EmailTemplatesManager emailTemplatesManagerMock;
EmailTemplatesManager emailTemplatesManager;
String html =
"<html> <title>${" + TEMPLATE_TITLE + "}</title> <body><table><tr><td background=\"cid:"
+ EmailTemplatesManager.BACKGROUND_ID
+ "\" align=\"center\" valign=\"top\">\n"
+ "\"<img src=\"cid" + EmailTemplatesManager.LOGO_ID + "\"> <p style=\"color:#088A08;\">${" + CONTENT + "}" +
" ${" + CONTENT + "}</p> ${" + SIGNATURE + "}</p> </td></tr>"
+ "<tr><td><div><a href=\"${completeTask}\" style=\"text-decoration:none; color:inherit;\">Completer</a></div></td></tr>"
+ "</table> </body> </html>";
String finalHtml =
"<html> <title>" + TEMPLATE_TITLE_VALUE_WIHT_HTML_CODE + "</title> <body><table><tr><td background=\"cid:"
+ EmailTemplatesManager.BACKGROUND_ID
+ "\" align=\"center\" valign=\"top\">\n"
+ "\"<img src=\"cid" + EmailTemplatesManager.LOGO_ID + "\"> <p style=\"color:#088A08;\">" + CONTENT_VALUE +
" " + CONTENT_VALUE + "</p> " + SIGNATURE_VALUE + "</p> </td></tr>"
+ "<tr><td><div><a href=\"http://localhost:7070/constellio/\" style=\"text-decoration:none; color:inherit;\">Completer</a></div></td></tr>"
+ "</table> </body> </html>";
EmailToSend emailToSend;
RecordServices recordServices;
MetadataSchemasManager metadataSchemasManager;
static final String TEMPLATE = RMEmailTemplateConstants.REMIND_BORROW_TEMPLATE_ID;
static final String CONSTELLIO = "Constellio";
// <a href="${completeTask}"
// style="text-decoration:none; color:inherit;">Completer</a>
EmailAddress emailAddressChuck;
List<EmailAddress> emailAddressesTo, emailAddressesBcc, emailAddressesCc;
List<String> parameters;
@Before
public void setUp()
throws Exception {
prepareSystem(withZeCollection().withConstellioRMModule().withAllTestUsers());
recordServices = getModelLayerFactory().newRecordServices();
metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
configureEmailFields();
emailToSend = newEmailToSend();
emailTemplatesManager = getModelLayerFactory().getEmailTemplatesManager();
when(emailTemplatesManagerMock.getCollectionTemplate(any(String.class), any(String.class))).thenReturn(html);
builder = new EmailBuilder(emailTemplatesManager, getModelLayerFactory().getSystemConfigurationsManager());
// builder = new EmailBuilder(emailTemplatesManagerMock);
}
@Test
public void whenBuildMessageThenOk()
throws Exception {
builder = new EmailBuilder(emailTemplatesManagerMock, getModelLayerFactory().getSystemConfigurationsManager());
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);
Message message = builder.build(emailToSend, session, null);
assertThat(message.getSubject()).isEqualTo(TEST_SUBJECT);
InternetAddress[] from = (InternetAddress[]) message.getFrom();
InternetAddress[] to = (InternetAddress[]) message.getRecipients(RecipientType.TO);
InternetAddress[] cc = (InternetAddress[]) message.getRecipients(RecipientType.CC);
InternetAddress[] bcc = (InternetAddress[]) message.getRecipients(RecipientType.BCC);
assertThat(from.length).isEqualTo(1);
assertThat(from[0].getAddress()).isEqualTo(emailToSend.getFrom().getEmail());
assertThat(from[0].getPersonal()).isEqualTo(emailToSend.getFrom().getName());
assertThat(to.length).isEqualTo(2);
assertThat(to[0].getAddress()).isEqualTo(emailToSend.getTo().get(0).getEmail());
assertThat(to[0].getPersonal()).isEqualTo(emailToSend.getTo().get(0).getName());
assertThat(to[1].getAddress()).isEqualTo(emailToSend.getTo().get(1).getEmail());
assertThat(to[1].getPersonal()).isEqualTo(emailToSend.getTo().get(1).getName());
assertThat(cc.length).isEqualTo(1);
assertThat(cc[0].getAddress()).isEqualTo(emailToSend.getCC().get(0).getEmail());
assertThat(cc[0].getPersonal()).isEqualTo(emailToSend.getCC().get(0).getName());
assertThat(bcc.length).isEqualTo(1);
assertThat(bcc[0].getAddress()).isEqualTo(emailToSend.getBCC().get(0).getEmail());
assertThat(bcc[0].getPersonal()).isEqualTo(emailToSend.getBCC().get(0).getName());
assertThat(message.getSubject()).isEqualTo(TEST_SUBJECT);
assertThat(message.getSentDate()).isEqualToIgnoringMillis(emailToSend.getSendOn().toDate());
assertThat(message.getReplyTo()).isEqualTo(from);
MimeMultipart mimeMultipart = (MimeMultipart) message.getContent();
assertThat(mimeMultipart.getCount()).isEqualTo(2);
assertThat(mimeMultipart.getBodyPart(0).getContent()).isEqualTo(finalHtml);
}
@Test
public void whenBuildMessageWithNullFromThenReturnDefaultFrom()
throws Exception {
builder = new EmailBuilder(emailTemplatesManagerMock, getModelLayerFactory().getSystemConfigurationsManager());
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);
String defaultFrom = new SmtpServerTestConfig().getDefaultSenderEmail();
emailToSend.setFrom(null);
Message message = builder.build(emailToSend, session, defaultFrom);
assertThat(message.getFrom()[0].toString()).isEqualTo(defaultFrom);
}
@Test
public void whenBuildMessageWithSubjectFromThenReturnTitleTemplateAsSubject()
throws Exception {
builder = new EmailBuilder(emailTemplatesManagerMock, getModelLayerFactory().getSystemConfigurationsManager());
Properties props = System.getProperties();
Session session = Session.getDefaultInstance(props, null);
String defaultFrom = new SmtpServerTestConfig().getDefaultSenderEmail();
emailToSend.setSubject(null);
Message message = builder.build(emailToSend, session, defaultFrom);
assertThat(message.getSubject()).isEqualTo(TEMPLATE_TITLE_FINAL_VALUE);
}
@Test(expected = AddressException.class)
public void givenInvalidEmailWhenBuildMessageThenException()
throws Exception {
final String authEmail = "invalidEmail";
Properties props = System.getProperties();
EmailAddress emailAddress = new EmailAddress(CONSTELLIO, authEmail);
Session session = Session.getDefaultInstance(props, null);
builder.build(newEmailToSend(emailAddress), session, null);
}
@InternetTest
@SlowTest
@Test
public void realSendTest()
throws Exception {
SmtpServerTestConfig smtpServerConfig = new SmtpServerTestConfig();
Properties props = new Properties();
props.putAll(smtpServerConfig.getProperties());
Authenticator auth = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(SDKPasswords.testSMTPUsername(), SDKPasswords.testSMTPPassword());
}
};
builder = new EmailBuilder(getModelLayerFactory().getEmailTemplatesManager(),
getModelLayerFactory().getSystemConfigurationsManager());
Session session = Session.getInstance(props, auth);
Message message = builder.build(emailToSend, session, null);
Transport.send(message);
}
//
private void configureEmailFields() {
emailAddressChuck = new EmailAddress("Chuck Norris", "chuck@gmail.com");
EmailAddress emailAddressBob = new EmailAddress("Bob", SDKPasswords.testSMTPUsername());
EmailAddress emailAddressAlice = new EmailAddress("Bob", "bob@gmail.com");
EmailAddress emailAddressGandalf = new EmailAddress("Gandalf", "gandalf@gmail.com");
EmailAddress emailAddressEdouard = new EmailAddress("Edouard", "edouard@gmail.com");
emailAddressesTo = new ArrayList<>();
emailAddressesTo.add(emailAddressBob);
emailAddressesTo.add(emailAddressAlice);
emailAddressesBcc = new ArrayList<>();
emailAddressesBcc.add(emailAddressGandalf);
emailAddressesCc = new ArrayList<>();
emailAddressesCc.add(emailAddressEdouard);
parameters = new ArrayList<>();
String content = CONTENT + EmailToSend.PARAMETER_SEPARATOR + CONTENT_VALUE;
String signature = SIGNATURE + ":" + SIGNATURE_VALUE;
//String pathLogo = getTestResourceFile("logo_eim_203x30.png").getPath();
//String pathBackGroundImg = getTestResourceFile("back-const-1920x1358.jpg").getPath();
//String logo = "logo:'cid:" + pathLogo + "'";
//String backgroundImg = "backgroundImg:'cid:" + pathBackGroundImg + "'";
String inxestentParameter = "inxestent" + EmailToSend.PARAMETER_SEPARATOR + "Ze inxestent";
parameters.add(TEMPLATE_TITLE + EmailToSend.PARAMETER_SEPARATOR + TEMPLATE_TITLE_VALUE_WIHT_HTML_CODE);
parameters.add(content);
parameters.add(signature);
parameters.add(inxestentParameter);
parameters.add("completeTask" + EmailToSend.PARAMETER_SEPARATOR + "http://localhost:7070/constellio/");
parameters.add("previewReturnDate" + EmailToSend.PARAMETER_SEPARATOR + LocalDate.now());
parameters.add("borrower" + EmailToSend.PARAMETER_SEPARATOR + chuckNorris);
parameters.add("borrowedFolderTitle" + EmailToSend.PARAMETER_SEPARATOR + "dossier école");
//parameters.add(logo);
//parameters.add(backgroundImg);
}
public EmailToSend newEmailToSend()
throws RecordServicesException {
EmailToSend emailToSend = newEmailToSendRecord();
emailToSend.setFrom(emailAddressChuck);
emailToSend.setTo(emailAddressesTo);
emailToSend.setBCC(emailAddressesBcc);
emailToSend.setCC(emailAddressesCc);
emailToSend.setParameters(parameters);
emailToSend.setSendOn(TimeProvider.getLocalDateTime().plusDays(1));
emailToSend.setTemplate(TEMPLATE);
emailToSend.setSubject(TEST_SUBJECT);
recordServices.add(emailToSend);
return emailToSend;
}
public EmailToSend newEmailToSend(EmailAddress emailAddress)
throws RecordServicesException {
EmailToSend emailToSend = newEmailToSendRecord();
emailToSend.setFrom(emailAddress);
emailToSend.setTo(Arrays.asList(emailAddress));
emailToSend.setParameters(parameters);
emailToSend.setSendOn(TimeProvider.getLocalDateTime().plusMinutes(2));
emailToSend.setTemplate(TEMPLATE);
emailToSend.setSubject(TEST_SUBJECT);
emailToSend.setTemplate(RMEmailTemplateConstants.REMIND_BORROW_TEMPLATE_ID);
recordServices.add(emailToSend);
return emailToSend;
}
private EmailToSend newEmailToSendRecord() {
MetadataSchemaTypes types = metadataSchemasManager.getSchemaTypes(zeCollection);
MetadataSchema schema = types.getSchemaType(EmailToSend.SCHEMA_TYPE).getDefaultSchema();
Record emailToSendRecord = recordServices.newRecordWithSchema(schema);
return new EmailToSend(emailToSendRecord, types);
}
}