package org.jbpm.mail;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.mail.Address;
import javax.mail.MessagingException;
import javax.mail.Message.RecipientType;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import junit.framework.Test;
import org.subethamail.wiser.Wiser;
import org.subethamail.wiser.WiserMessage;
import org.jbpm.AbstractJbpmTestCase;
import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.taskmgmt.def.Swimlane;
import org.jbpm.taskmgmt.exe.SwimlaneInstance;
public class MailTest extends AbstractJbpmTestCase {
private JbpmContext jbpmContext;
private static final String XML_DECL = "<?xml version='1.0'?>";
private static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString(XML_DECL
+ "<jbpm-configuration>"
+ " <jbpm-context />"
+ " <string name='resource.mail.properties' value='org/jbpm/mail/test.mail.properties' />"
+ " <string name='jbpm.mail.from.address' value='workflow@redhat.com' /> "
+ " <bean name='jbpm.mail.address.resolver' class='"
+ TestAddressResolver.class.getName()
+ "' singleton='true' />"
+ "</jbpm-configuration>");
private static Wiser wiser;
protected void setUp() throws Exception {
super.setUp();
jbpmContext = jbpmConfiguration.createJbpmContext();
}
protected void tearDown() throws Exception {
wiser.getMessages().clear();
jbpmContext.close();
super.tearDown();
}
public static Test suite() {
MailTestSetup testSetup = new MailTestSetup(MailTest.class);
wiser = testSetup.getWiser();
return testSetup;
}
public void testWithoutAddressResolving() throws MessagingException, IOException {
String to = "sample.shipper@example.domain";
String subject = "latest news";
String text = "roy is assurancetourix";
Mail mail = new Mail(null, null, to, subject, text);
mail.send();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("latest news", email.getSubject());
assertEquals("roy is assurancetourix", email.getContent());
assert Arrays.equals(InternetAddress.parse("sample.shipper@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testMailWithAddressResolving() throws MessagingException, IOException {
String actors = "manager";
String subject = "latest news";
String text = "roy is assurancetourix";
Mail mail = new Mail(null, actors, null, subject, text);
mail.send();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("latest news", email.getSubject());
assertEquals("roy is assurancetourix", email.getContent());
assert Arrays.equals(InternetAddress.parse("manager@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testMailWithBccAddress() throws MessagingException, IOException {
String bcc = "bcc@example.domain";
String subject = "latest news";
String text = "roy is assurancetourix";
Mail mail = new Mail(null, null, null, null, bcc, subject, text);
mail.send();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("latest news", email.getSubject());
assertEquals("roy is assurancetourix", email.getContent());
assertNull(email.getRecipients(RecipientType.TO));
}
public void testMailNodeAttributes() throws MessagingException, IOException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='send email' />"
+ " </start-state>"
+ " <mail-node name='send email' actors='george' subject='readmylips' text='nomoretaxes'>"
+ " <transition to='end' />"
+ " </mail-node>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("readmylips", email.getSubject());
assertEquals("nomoretaxes", email.getContent());
assert Arrays.equals(InternetAddress.parse("george@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testMailNodeElements() throws MessagingException, IOException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='send email' />"
+ " </start-state>"
+ " <mail-node name='send email' actors='george'>"
+ " <subject>readmylips</subject>"
+ " <text>nomoretaxes</text>"
+ " <transition to='end' />"
+ " </mail-node>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("readmylips", email.getSubject());
assertEquals("nomoretaxes", email.getContent());
assert Arrays.equals(InternetAddress.parse("george@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testMailActionAttributes() throws MessagingException, IOException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' actors='george' subject='readmylips' text='nomoretaxes' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("readmylips", email.getSubject());
assertEquals("nomoretaxes", email.getContent());
assert Arrays.equals(InternetAddress.parse("george@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testMailActionElements() throws MessagingException, IOException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail actors='george'>"
+ " <subject>readmylips</subject>"
+ " <text>nomoretaxes</text>"
+ " </mail>"
+ " <transition to='end' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("readmylips", email.getSubject());
assertEquals("nomoretaxes", email.getContent());
assert Arrays.equals(InternetAddress.parse("george@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testMultipleRecipients() throws MessagingException, IOException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' actors='george; barbara; suzy'"
+ " subject='readmylips' text='nomoretaxes' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(3, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("readmylips", email.getSubject());
assertEquals("nomoretaxes", email.getContent());
InternetAddress[] expectedTo = InternetAddress.parse("george@example.domain, barbara@example.domain, suzy@example.domain");
assert Arrays.equals(expectedTo, email.getRecipients(RecipientType.TO));
}
public void testMailWithoutAddressResolving() throws MessagingException, IOException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' to='george@humpydumpy.gov: spiderman@hollywood.ca.us'"
+ " subject='readmylips' text='nomoretaxes' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(2, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("readmylips", email.getSubject());
assertEquals("nomoretaxes", email.getContent());
InternetAddress[] expectedTo = InternetAddress.parse("george@humpydumpy.gov, spiderman@hollywood.ca.us");
assert Arrays.equals(expectedTo, email.getRecipients(RecipientType.TO));
}
public void testToVariableExpression() throws MessagingException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' to='#{user.email}' subject='s' text='t' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
User mrNobody = new User("hucklebuck@example.domain");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("user", mrNobody);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assert Arrays.equals(InternetAddress.parse("hucklebuck@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testToSwimlaneExpression() throws MessagingException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' actors='#{initiator}' subject='s' text='t' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
SwimlaneInstance initiatorInstance = new SwimlaneInstance(new Swimlane("initiator"));
initiatorInstance.setActorId("huckelberry");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getTaskMgmtInstance().addSwimlaneInstance(initiatorInstance);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assert Arrays.equals(InternetAddress.parse("huckelberry@example.domain"), email.getRecipients(RecipientType.TO));
}
public void testSubjectExpression() throws MessagingException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' actors='me' subject='your ${item} order' text='t' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("item", "cookies");
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("your cookies order", email.getSubject());
}
public void testTextExpression() throws IOException, MessagingException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' actors='me' text='your ${item} order' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.getContextInstance().setVariable("item", "cookies");
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
assertEquals("your cookies order", email.getContent());
}
public void testFrom() throws MessagingException {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(XML_DECL
+ "<process-definition>"
+ " <start-state>"
+ " <transition to='end'>"
+ " <mail name='send email' to='long.cat@meme.org'"
+ " subject='important info' text='longcat iz looooooong' />"
+ " </transition>"
+ " </start-state>"
+ " <end-state name='end' />"
+ "</process-definition>");
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
List messages = wiser.getMessages();
assertEquals(1, messages.size());
WiserMessage message = (WiserMessage) messages.get(0);
MimeMessage email = message.getMimeMessage();
Address[] from = email.getFrom();
assertEquals(1, from.length);
InternetAddress fromAddress = (InternetAddress) from[0];
assertEquals("workflow@redhat.com", fromAddress.getAddress());
}
public static class User {
String email;
public User(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
}
public static class TestAddressResolver implements AddressResolver {
private static final long serialVersionUID = 1L;
public Object resolveAddress(String actorId) {
if ("ghost".equals(actorId)) return null;
return actorId + "@example.domain";
}
}
}