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 }