1   package test.atlassian.mail.queue;
2   
3   import com.atlassian.mail.Email;
4   import com.atlassian.mail.config.ConfigLoader;
5   import com.atlassian.mail.queue.MailQueue;
6   import com.atlassian.mail.queue.MailQueueImpl;
7   import com.atlassian.mail.queue.SingleMailQueueItem;
8   import com.sun.mail.util.PropUtil;
9   import org.junit.Before;
10  import org.junit.Test;
11  import org.junit.runner.RunWith;
12  import org.mockito.Mockito;
13  import org.powermock.api.mockito.PowerMockito;
14  import org.powermock.core.classloader.annotations.PrepareForTest;
15  import org.powermock.modules.junit4.PowerMockRunner;
16  import test.mock.mail.MockMailSendingAlwaysOnSettings;
17  import test.mock.mail.server.MockMailServerManager;
18  
19  import javax.mail.Session;
20  
21  import static org.junit.Assert.*;
22  
23  
24  @RunWith(PowerMockRunner.class)
25  @PrepareForTest({Session.class, PropUtil.class, ConfigLoader.class})
26  public class TestMailQueue
27  {
28      @Before
29      public void setUp() throws Exception
30      {
31          PowerMockito.mockStatic(ConfigLoader.class);
32          final MockMailServerManager mockMailServerManager = new MockMailServerManager();
33          final MockMailSendingAlwaysOnSettings mockMailSendingAlwaysOnSettings = new MockMailSendingAlwaysOnSettings();
34          Mockito.when(ConfigLoader.getServerManager()).thenReturn(mockMailServerManager);
35          Mockito.when(ConfigLoader.getSettings()).thenReturn(mockMailSendingAlwaysOnSettings);
36      }
37  
38      @Test
39      public void testUnsentMailIsQueued()
40      {
41          MailQueue mq = new MailQueueImpl();
42          SingleMailQueueItem item = new SingleMailQueueItem(new Email("mike@atlassian.com").setSubject("Test Subject").setBody("Test Body"));
43          mq.addItem(item);
44          for (int i= 0; i<10; i++)
45          {
46              mq.sendBuffer();
47              assertEquals("Errors should be empty", 0, mq.errorSize());
48              assertEquals("Queue should contain 1 item", 1, mq.size());
49          }
50          mq.sendBuffer();
51          assertTrue("Mail Item should be in error queue", mq.getErrorQueue().contains(item));
52      }
53  
54      @Test
55      public void testMailIsSent()
56      {
57          MailQueue mq = new MailQueueImpl();
58          SingleMailQueueItem item = new SingleMailQueueItem(new Email("mike@atlassian.com").setSubject("Test Subject").setBody("Test Body").setFrom("james@atlassian.com"));
59          mq.addItem(item);
60          mq.sendBuffer();
61          assertFalse("Mail Item should not be in error queue", mq.getErrorQueue().contains(item));
62          assertTrue("Mail Queue should be empty", mq.getQueue().isEmpty());
63      }
64  
65      @Test
66      public void testOrdering()
67      {
68          MailQueue mq = new MailQueueImpl();
69          enqueueMailQueueItem(mq, "mike@atlassian.com", "Test Subject 1", "Test Body", "james@atlassian.com");
70          enqueueMailQueueItem (mq, "mike@atlassian.com", "Test Subject 2", "Test Body", "james@atlassian.com");
71          enqueueMailQueueItem (mq, "mike@atlassian.com", "Test Subject 3", "Test Body", null);
72          enqueueMailQueueItem (mq, "mike@atlassian.com", "Test Subject 4", "Test Body", "james@atlassian.com");
73          assertAtFrontOfQueue(mq, "Test Subject 1");
74          mq.sendBuffer();
75          assertAtFrontOfQueue(mq, "Test Subject 3");
76          enqueueMailQueueItem(mq, "mike@atlassian.com", "Test Subject 5", "Test Body", "james@atlassian.com");
77          enqueueMailQueueItem(mq, "mike@atlassian.com", "Test Subject 6", "Test Body", "james@atlassian.com");
78          assertAtFrontOfQueue(mq, "Test Subject 5");
79      }
80  
81      private void assertAtFrontOfQueue(MailQueue mq, final String subject) {
82          assertTrue("Correct object at top of queue", mq.getQueue().peek().getSubject().equals(subject));
83      }
84  
85      private void enqueueMailQueueItem(final MailQueue mailQueue, final String to, final String subject, final String body, final String from) {
86          Email email = new Email(to).setSubject(subject).setBody(body);
87          if (from != null)
88          {
89              email.setFrom(from);
90          }
91          mailQueue.addItem(new SingleMailQueueItem(email));
92      }
93  }