Package com.softwaremill.common.test.web.email

Source Code of com.softwaremill.common.test.web.email.EmailInbox

package com.softwaremill.common.test.web.email;

import com.dumbster.smtp.SmtpMessage;
import com.google.common.base.Predicate;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* Class represents mock email inbox, with methods manage it.
*
* @author maciek
*/
public class EmailInbox {

    private static int REDELIVERY_LIMIT = 10;

    /**
     * Waits for first email to appear in inbox.
     *
     * When using sqs and timer this will happen after email task is downloaded from queue and executed.
     */
    public static void waitForEmailInInbox() throws InterruptedException {
        // Wait till email is received by mock smtp
        for (int i = 0; i < REDELIVERY_LIMIT; i++) {
            Thread.sleep(7000);
            if (AbstractEmailServerRunner.emailServer.getReceivedEmailSize() > 0) {
                break;
            }
        }
    }

    /**
     * Waits for specific email to appear in inbox. With given subject.
     *
     * When using sqs and timer this will happen after email task is downloaded from queue and executed.
     */
    public static void waitForEmailInInbox(final String subject) throws InterruptedException {
        waitForEmailInInbox(getSubjectPredicate(subject));
    }

    /**
     * Waits for specific email to appear in inbox. With given subject and ToEmail.
     *
     * When using sqs and timer this will happen after email task is downloaded from queue and executed.
     */
    public static void waitForEmailInInbox(final String subject, final String toEmail) throws InterruptedException {
        waitForEmailInInbox(getSubjectAndToEmailPredicate(subject, toEmail));
    }

    /**
     * Waits for specific email to appear in inbox, based on a Predicate
     *
     * When using sqs and timer this will happen after email task is downloaded from queue and executed.
     */
    private static void waitForEmailInInbox(Predicate<SmtpMessage> predicate) throws InterruptedException {
        // Wait till email is received by mock smtp
        DELIVER_CHECK: for (int i = 0; i < REDELIVERY_LIMIT; i++) {
            Thread.sleep(7000);
            if (AbstractEmailServerRunner.emailServer.getReceivedEmailSize() > 0) {
                Iterator inbox = AbstractEmailServerRunner.emailServer.getReceivedEmail();
                SmtpMessage email;
                while(inbox.hasNext()) {
                    email = (SmtpMessage) inbox.next();
                    if(predicate.apply(email)){
                        break DELIVER_CHECK;
                    }
                }
            }
        }
    }

    /**
     * Returns size of inbox
     *
     * @return Number of emails in inbox
     */
    public static int getInboxSize(){
        return AbstractEmailServerRunner.emailServer.getReceivedEmailSize();
    }

    /**
     * Downloads first email from the inbox and removes it from there
     *
     * @return EmailMessage object representing mock email or null if no email found
     */
    public static EmailMessage getFirstEmailFromInbox() {
        Iterator inbox = AbstractEmailServerRunner.emailServer.getReceivedEmail();
        if (inbox.hasNext()) {
            SmtpMessage email = (SmtpMessage) inbox.next();
            inbox.remove();
            return new EmailMessage(email);
        } else {
            return null;
        }
    }

    /**
     * Downloads latest email from the inbox with given subject and removes it from there.
     * Also removes any older emails with given subject.
     *
     * @return EmailMessage object representing mock email
     */
    public static EmailMessage getLatestEmailBySubject(String subject) {
        return getLatestEmailByData(getSubjectPredicate(subject));
    }

    /**
     * Downloads latest email from the inbox with given subject and TO email and removes it from there
     * Also removes any older emails with given subject and TO email.
     *
     * @return EmailMessage object representing mock email
     */
    public static EmailMessage getLatestEmailBySubjectAndToEmail(String subject, String toEmail) {
        return getLatestEmailByData(getSubjectAndToEmailPredicate(subject ,toEmail));
    }

    /**
     * Downloads latest email from the inbox with given predicate (e.g. certain subject or other headers).
     * Also removes any older emails with given predicate.
     *
     * @return EmailMessage object representing mock email
     */
    private static EmailMessage getLatestEmailByData(Predicate<SmtpMessage> predicate) {
        List<SmtpMessage> foundEmails = new ArrayList<SmtpMessage>();
        Iterator inbox = AbstractEmailServerRunner.emailServer.getReceivedEmail();
        SmtpMessage email;
        while (inbox.hasNext()) {
            email = (SmtpMessage) inbox.next();
            if(predicate.apply(email)){
                foundEmails.add(email);
                inbox.remove();
            }
        }

        if(foundEmails.size() > 0) {
            return new EmailMessage(foundEmails.get(foundEmails.size()-1));
        } else {
            return null;
        }
    }

    /**
     * Clears mock inbox, removing all email from it.
     * Method should be run after each test, so that next one will have no leftover data
     */
    public static void clearInbox(){
        Iterator inbox = AbstractEmailServerRunner.emailServer.getReceivedEmail();
        while (inbox.hasNext()) {
            inbox.next();
            inbox.remove();
        }
    }

    /**
     *  Checks if the server is initialized and is not stopped
     *
     *  @return true if server is running, false otherwise
     */
    public static boolean isServerRunning() {
        return AbstractEmailServerRunner.emailServer != null && !AbstractEmailServerRunner.emailServer.isStopped();
    }

    private static Predicate<SmtpMessage> getSubjectPredicate(final String subject) {
        return new Predicate<SmtpMessage>() {
      @Override
      public boolean apply(SmtpMessage email) {
        return email.getHeaderValue("Subject").equals(subject);
      }
    };
    }

    private static Predicate<SmtpMessage> getSubjectAndToEmailPredicate(final String subject, final String toEmail) {
        return new Predicate<SmtpMessage>() {
      @Override
      public boolean apply(SmtpMessage email) {
                return email.getHeaderValue("Subject").equals(subject) && email.getHeaderValue("To").equals(toEmail);
      }
    };
    }
}
TOP

Related Classes of com.softwaremill.common.test.web.email.EmailInbox

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.