package org.jboss.seam.example.mail.test.selenium;
import org.jboss.seam.example.common.test.selenium.SeamSeleniumTest;
import org.subethamail.wiser.Wiser;
import org.subethamail.wiser.WiserMessage;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import static org.testng.AssertJUnit.assertFalse;
public class SeleniumMailTest extends SeamSeleniumTest
{
public static final String HOME_PAGE = "/index.seam";
public static final String HOME_PAGE_TITLE = "Seam Mail";
public static final String ENVELOPE_SENDER = "peter@example.com|do-not-reply@jboss.com";
public static final String FIRSTNAME_INPUT = "id=emailform:firstname";
public static final String FIRSTNAME = "John";
public static final String LASTNAME_INPUT = "id=emailform:lastname";
public static final String LASTNAME = "Smith";
public static final String ADDRESS_INPUT = "id=emailform:address";
public static final String ADDRESS = "john.smith@localhost";
public static final String SERVLET_NAME_INPUT = "id=name";
public static final String SERVLET_ADDRESS_INPUT = "id=email";
public static final String SEND_SIMPLE_BUTTON = "id=emailform:sendSimple";
public static final String SEND_PLAIN_BUTTON = "id=emailform:sendPlain";
public static final String SEND_HTML_BUTTON = "id=emailform:sendHtml";
public static final String SEND_ATTACHMENT_BUTTON = "id=emailform:sendAttachment";
public static final String SEND_ASYNCHRONOUS_BUTTON = "id=emailform:sendAsynchronous";
public static final String SEND_TEMPLATE_BUTTON = "id=emailform:sendTemplate";
public static final String SEND_SERVLET_BUTTON = "id=sendServlet";
protected Wiser wiser;
@BeforeMethod
@Override
public void setUp()
{
super.setUp();
browser.open(CONTEXT_PATH + HOME_PAGE);
}
/**
* We restart SMTP after each Method, because Wiser doesn't have mechanism to flush recieved emails.
*/
@BeforeMethod
public void startSMTP()
{
wiser = new Wiser();
wiser.setPort(2525);
wiser.start();
}
@AfterMethod
public void stopSMTP()
{
wiser.stop();
}
/**
* Place holder - just verifies that example deploys
*/
@Test
public void homePageLoadTest()
{
assertEquals("Unexpected page title.", HOME_PAGE_TITLE, browser.getTitle());
}
@DataProvider(name = "sendMethods")
public Object[][] mailTest() {
return new Object[][] {
{SEND_SIMPLE_BUTTON, new String[] {"Content-Type: text/html; charset=ISO-8859-1", "Content-Disposition: inline", "<p>Dear " + FIRSTNAME + ",</p>"}},
{SEND_PLAIN_BUTTON, new String[] {"This is a plain text, email."}},
{SEND_HTML_BUTTON, new String[] {"Subject: Seam Mail", "Content-Type: multipart/mixed;", "Content-Type: multipart/alternative;", "Content-Type: text/plain; charset=ISO-8859-1", "This is the alternative text body for mail readers that don't support html", "Content-Type: text/html; charset=ISO-8859-1", "<p>This is an example <i>HTML</i> email sent by Seam.</p>"}},
{SEND_ATTACHMENT_BUTTON, new String[] {"Content-Type: multipart/mixed;","Content-Type: application/octet-stream; name=jboss.jpg", "/9j/4AAQSkZJRgABA"/*jpeg start*/, "Content-Type: application/octet-stream; name=numbers.csv", "3,Three,treis,trois", "Content-Type: image/png; name=" + FIRSTNAME + "_" + LASTNAME + ".jpg", "iVBORw0KGgo" /*png start*/ }},
{SEND_ASYNCHRONOUS_BUTTON, new String[] {"Content-Type: multipart/mixed;", "Content-Type: text/html; charset=ISO-8859-1", "Content-Disposition: inline", "<p>Dear " + FIRSTNAME + ",</p>"}},
{SEND_TEMPLATE_BUTTON, new String[] {"Subject: Templating with Seam Mail", "Content-Type: multipart/mixed;", "Content-Type: multipart/alternative;", "Content-Type: text/plain; charset=ISO-8859-1", "Sorry, your mail reader doesn't support html.", "Content-Type: text/html; charset=ISO-8859-1", "<p>Here's a dataTable</p><table>", "<td>Saturday</td>"}},
{SEND_SERVLET_BUTTON, new String[] {"Content-Type: multipart/mixed;", "Content-Disposition: inline", "Dear John Smith,", "This is a plain text, email."}}
};
}
/**
* Sends a mail and verifies it was delivered
*/
@Test(dataProvider = "sendMethods")
public void mailTest(String buttonToClick, String[] expectedMessageContents) {
fillInInputs();
sendEmail(buttonToClick);
checkDelivered(expectedMessageContents);
}
/**
* Fills in html text inputs.
*/
private void fillInInputs()
{
browser.type(FIRSTNAME_INPUT, FIRSTNAME);
browser.type(LASTNAME_INPUT, LASTNAME);
browser.type(ADDRESS_INPUT, ADDRESS);
browser.type(SERVLET_NAME_INPUT, FIRSTNAME + " " + LASTNAME);
browser.type(SERVLET_ADDRESS_INPUT, ADDRESS);
}
/**
* Sends an email by clicking on specified button. If the send method is asynchronous,
* waits for the associated action to take place. It assures that the email was sent
* by verifying appropriate message.
* @param buttonToClick
*/
private void sendEmail(String buttonToClick)
{
browser.clickAndWait(buttonToClick);
if (buttonToClick.equals(SEND_ASYNCHRONOUS_BUTTON)) {
assertTrue(browser.isTextPresent("Seam Email")); // asynchronous email send produces no message, so we just check that we didn't end up on a debug page
try
{
Thread.sleep(4000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
} else {
assertTrue("Expected message about successfuly sent mail. See also JBSEAM-3769.", browser.isTextPresent("Email sent successfully"));
}
}
/**
* Checks that the expected email was delivered.
* @param expectedMessageContents
*/
private void checkDelivered(String[] expectedMessageContents)
{
assertFalse("Expected a message", wiser.getMessages().isEmpty());
WiserMessage message = wiser.getMessages().get(0); // although "send plain text" example sends 3 mails (To:, CC:, Bcc:) Wiser cannot distinquish between them so we just check the first mail.
assertEquals(ADDRESS, message.getEnvelopeReceiver());
assertTrue("Envelope sender (" + message.getEnvelopeSender() + ") doesn't match expected one (" + ENVELOPE_SENDER + ")", message.getEnvelopeSender().matches(ENVELOPE_SENDER));
for (String expectedMessageContent: expectedMessageContents) {
assertTrue("Didn't find expected text (" + expectedMessageContent + ") in the received email.", new String(message.getData()).contains(expectedMessageContent));
}
}
}