package com.github.jaystgelais.easymail;
import org.junit.Test;
import org.jvnet.mock_javamail.Mailbox;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.internet.InternetAddress;
import java.util.List;
import java.util.Properties;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertTrue;
import static junit.framework.Assert.fail;
/**
* Created by jaystgelais on 1/25/14.
*/
public final class EmailMessageTest {
public static final String EMAIL_SENDER = "sender@fakemail.net";
public static final String EMAIL_SUBJECT = "This is a test email!";
public static final String HTML
= "<html><head><title>Sample Message</title><style>body {font-weight: bold;}</style></head>"
+ "<body>Hello World!</html>";
public static final String EMAIL_RECIPIENT = "recipient@fakemail.com";
public static final String EMAIL_CC = "keepmeintheloop@fakemail.com";
public static final String EMAIL_BCC = "ispyyourmail@fakemail.com";
public static final String MALFORMED_ADDRESS = "malformedaddress<";
@Test
public void testSendingOfMessage() throws Exception {
Mailbox.clearAll();
EmailMessage message
= new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT, new StaticHtmlContentProvider(HTML))
.addTo(EMAIL_RECIPIENT)
.addCC(EMAIL_CC)
.addBCC(EMAIL_BCC)
.build();
message.send(getMockSession());
List<Message> inbox = Mailbox.get(EMAIL_RECIPIENT);
assertTrue("Inbox size is actually: " + inbox.size(), inbox.size() == 1);
assertTrue("From size is actually: " + inbox.get(0).getFrom().length, inbox.get(0).getFrom().length == 1);
assertEquals(new InternetAddress(EMAIL_SENDER), inbox.get(0).getFrom()[0]);
assertTrue("To size is actually: " + inbox.get(0).getRecipients(Message.RecipientType.TO).length,
inbox.get(0).getRecipients(Message.RecipientType.TO).length == 1);
assertEquals(new InternetAddress(EMAIL_RECIPIENT), inbox.get(0).getRecipients(Message.RecipientType.TO)[0]);
assertTrue("CC size is actually: " + inbox.get(0).getRecipients(Message.RecipientType.CC).length,
inbox.get(0).getRecipients(Message.RecipientType.CC).length == 1);
assertEquals(new InternetAddress(EMAIL_CC), inbox.get(0).getRecipients(Message.RecipientType.CC)[0]);
assertTrue("BCC size is actually: " + inbox.get(0).getRecipients(Message.RecipientType.BCC).length,
inbox.get(0).getRecipients(Message.RecipientType.BCC).length == 1);
assertEquals(new InternetAddress(EMAIL_BCC), inbox.get(0).getRecipients(Message.RecipientType.BCC)[0]);
assertEquals(EMAIL_SUBJECT, inbox.get(0).getSubject());
assertEquals(HtmlProcessor.process(new StaticHtmlContentProvider(HTML)).getHtmlMessage(),
inbox.get(0).getContent());
}
@Test
public void testEmbeddingOfMessage() throws Exception {
Mailbox.clearAll();
EmailMessage message
= new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT,
new URLHtmlContentProvider(getClass().getResource("./EmbeddedImageTest.html")))
.addTo(EMAIL_RECIPIENT)
.build();
message.send(getMockSession());
List<Message> inbox = Mailbox.get(EMAIL_RECIPIENT);
assertTrue("Inbox size is actually: " + inbox.size(), inbox.size() == 1);
assertTrue("Meaasge was of type " + inbox.get(0).getContent().getClass().toString(),
inbox.get(0).getContent() instanceof Multipart);
Multipart multiPartMessage = (Multipart) inbox.get(0).getContent();
assertEquals(2, multiPartMessage.getCount());
assertTrue("Expected content to be text/html. Instead it was "
+ multiPartMessage.getBodyPart(0).getContentType(),
multiPartMessage.getBodyPart(0).getContentType().contains("text/html"));
assertTrue("Expected content to be image/jpeg. Instead it was "
+ multiPartMessage.getBodyPart(1).getContentType(),
multiPartMessage.getBodyPart(1).getContentType().contains("image/jpeg"));
assertTrue(multiPartMessage.getBodyPart(1).getHeader("Content-ID") != null);
}
@Test
public void testBuilder() throws Exception {
EmailMessage message
= new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT, new StaticHtmlContentProvider(HTML))
.addTo(EMAIL_RECIPIENT)
.addCC(EMAIL_CC)
.addBCC(EMAIL_BCC)
.build();
assertEquals("FROM was not equal.", new InternetAddress(EMAIL_SENDER), message.getFrom());
assertTrue("Unexpected count of TO addresses: " + message.getTo().size(), message.getTo().size() == 1);
assertEquals("TO was not equal.", new InternetAddress(EMAIL_RECIPIENT), message.getTo().iterator().next());
assertTrue("Unexpected count of CC addresses: " + message.getCc().size(), message.getCc().size() == 1);
assertEquals("CC was not equal.", new InternetAddress(EMAIL_CC), message.getCc().iterator().next());
assertTrue("Unexpected count of BCC addresses: " + message.getBcc().size(), message.getBcc().size() == 1);
assertEquals("BCC was not equal.", new InternetAddress(EMAIL_BCC), message.getBcc().iterator().next());
assertEquals("Subject was not equal.", EMAIL_SUBJECT, message.getSubject());
assertEquals("Message content was not equal.",
HtmlProcessor.process(new StaticHtmlContentProvider(HTML)).getHtmlMessage(), message.getMessageBody());
}
@Test
public void testBuilderWithStringHTMLConstructor() throws Exception {
EmailMessage message
= new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT, HTML)
.addTo(EMAIL_RECIPIENT)
.build();
assertEquals("Message content was not equal.",
HtmlProcessor.process(new StaticHtmlContentProvider(HTML)).getHtmlMessage(), message.getMessageBody());
}
@Test
public void testBuilderConstructorExceptionHandling() throws HtmlTransformationException {
boolean hasIllegalArgumentExceptionBeenCaught = false;
try {
EmailMessage.Builder builder
= new EmailMessage.Builder(MALFORMED_ADDRESS, EMAIL_SUBJECT, new StaticHtmlContentProvider(HTML));
fail("Should have thrown IllegalArgumentException on malformed address.");
} catch (IllegalArgumentException e) {
hasIllegalArgumentExceptionBeenCaught = true;
}
assertTrue("Never Caught IllegalArgumentException", hasIllegalArgumentExceptionBeenCaught);
}
@Test
public void testBuilderAddToExceptionHandling() {
EmailMessage.Builder builder;
try {
builder = new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT, new StaticHtmlContentProvider(HTML));
} catch (Exception e) {
fail("Exception Occured in construction.");
return;
}
boolean hasIllegalArgumentExceptionBeenCaught = false;
try {
builder.addTo(MALFORMED_ADDRESS);
fail("Should have thrown IllegalArgumentException on malformed address.");
} catch (IllegalArgumentException e) {
hasIllegalArgumentExceptionBeenCaught = true;
}
assertTrue("Never Caught IllegalArgumentException", hasIllegalArgumentExceptionBeenCaught);
}
@Test
public void testBuilderAddCCExceptionHandling() {
EmailMessage.Builder builder;
try {
builder = new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT, new StaticHtmlContentProvider(HTML));
} catch (Exception e) {
fail("Exception Occured in construction.");
return;
}
boolean hasIllegalArgumentExceptionBeenCaught = false;
try {
builder.addCC(MALFORMED_ADDRESS);
fail("Should have thrown IllegalArgumentException on malformed address.");
} catch (IllegalArgumentException e) {
hasIllegalArgumentExceptionBeenCaught = true;
}
assertTrue("Never Caught IllegalArgumentException", hasIllegalArgumentExceptionBeenCaught);
}
@Test
public void testBuilderAddBCCExceptionHandling() {
EmailMessage.Builder builder;
try {
builder = new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT, new StaticHtmlContentProvider(HTML));
} catch (Exception e) {
fail("Exception Occured in construction.");
return;
}
boolean hasIllegalArgumentExceptionBeenCaught = false;
try {
builder.addBCC(MALFORMED_ADDRESS);
fail("Should have thrown IllegalArgumentException on malformed address.");
} catch (IllegalArgumentException e) {
hasIllegalArgumentExceptionBeenCaught = true;
}
assertTrue("Never Caught IllegalArgumentException", hasIllegalArgumentExceptionBeenCaught);
}
@Test
public void testBuilderInvalidSetup() throws Exception {
boolean hasIllegalStateExceptionBeenCaught = false;
try {
new EmailMessage.Builder(EMAIL_SENDER, EMAIL_SUBJECT, new StaticHtmlContentProvider(HTML)).build();
fail("Should have thrown IllegalStateException on missing Recipients.");
} catch (IllegalStateException e) {
hasIllegalStateExceptionBeenCaught = true;
}
assertTrue("Never Caught IllegalArgumentException", hasIllegalStateExceptionBeenCaught);
}
private Session getMockSession() {
Properties properties = System.getProperties();
properties.setProperty("mail.smtp.host", "testmail.localhost");
return Session.getDefaultInstance(properties);
}
}