package it.com.atlassian.labs.speakeasy;
import com.atlassian.mail.server.MailServer;
import com.atlassian.plugin.util.WaitUntil;
import com.dumbster.smtp.SimpleSmtpServer;
import com.dumbster.smtp.SmtpMessage;
import org.junit.Assert;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.mail.MessagingException;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
public class MailUtils
{
private static final Logger log = LoggerFactory.getLogger(MailUtils.class);
public static String assertEmailExists(final SimpleSmtpServer mailServer, String to, String title, List<String> bodyStrings) throws MessagingException, IOException
{
final AtomicReference<SmtpMessage> ref = new AtomicReference<SmtpMessage>();
WaitUntil.invoke(new WaitUntil.WaitCondition()
{
public boolean isFinished()
{
Iterator itr = mailServer.getReceivedEmail();
while (itr.hasNext())
{
ref.set((SmtpMessage) itr.next());
}
return ref.get() != null;
}
public String getWaitMessage()
{
return null; //To change body of implemented methods use File | Settings | File Templates.
}
});
try
{
Assert.assertTrue(ref.get() != null);
SmtpMessage lastMessage = ref.get();
String subject = lastMessage.getHeaderValue("Subject");
Assert.assertTrue(subject.startsWith("[test] " + title));
Assert.assertFalse(subject.contains("$"));
String body = lastMessage.getBody();
Assert.assertFalse(body.contains("$"));
for (String toMatch : bodyStrings)
{
if (!body.contains(toMatch))
{
Assert.fail("Couldn't match '" + toMatch + "' in:\n" + body);
}
}
Assert.assertTrue(lastMessage.getHeaderValue("To").contains(to));
return body;
}
catch (AssertionError error)
{
if (ref.get() != null)
{
log.error("Error asserting on message: " + ref.get().toString());
}
throw error;
}
}
}