summaryrefslogtreecommitdiff
path: root/tests/test_canary.py
blob: c0ba262abb6f8daa99ad94d5fb8bc37e83ff3428 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import unittest
import mock
import tempfile, shutil
import datetime
import smtplib, email

from emailcanary import canary
from emailcanary import canarydb

FROM_ADDRESS = "from@example.com"
LIST_ADDRESS = "list@example.com"

USER_ADDRESS1 = "user1@example.com"
USER_ADDRESS2 = "user2@example.com"

SERVER = "mail.example.com"
PASSWORD = "secret"

class TestCanary(unittest.TestCase):
    def setUp(self):
        self.db = mock.Mock(canarydb.CanaryDB)
        self.smtp = mock.Mock(smtplib.SMTP_SSL)
        self.canary = canary.Canary(self.db, self.smtp, FROM_ADDRESS)
        canary.emailutils.get_imap = mock.Mock()
        canary.emailutils.get_message = mock.Mock()
        canary.emailutils.get_mail_uids = mock.Mock()
        canary.emailutils.delete_message = mock.Mock()
        canary.emailutils.close = mock.Mock()

    def tearDown(self):
        pass

    def testChirp(self):
        # Setup Mock
        self.db.get_recipients_for_list.return_value = [USER_ADDRESS1, USER_ADDRESS2]

        # Test chirp
        self.canary.chirp(LIST_ADDRESS)

        # Assert DB updated
        self.db.get_recipients_for_list.assert_called_with(LIST_ADDRESS)
        self.db.ping.assert_has_calls( \
            [mock.call(LIST_ADDRESS, USER_ADDRESS1, mock.ANY, mock.ANY), \
             mock.call(LIST_ADDRESS, USER_ADDRESS2, mock.ANY, mock.ANY)])
        args = self.db.ping.call_args
        expectedSubject = "Canary Email " + args[0][3]

        # Assert emails were sent
        self.assertEqual(1, self.smtp.sendmail.call_count)
        args = self.smtp.sendmail.call_args[0]
        self.assertEqual(FROM_ADDRESS, args[0])
        self.assertEqual(LIST_ADDRESS, args[1])
        msg = email.message_from_string(args[2])
        self.assertEqual(FROM_ADDRESS, msg['From'])
        self.assertEqual(LIST_ADDRESS, msg['To'])
        self.assertEqual(expectedSubject, msg['Subject'])

    def testCheck(self):
        # Setup mocks
        expectedUUID = "1234-5678-9012-3456"
        self.db.get_accounts.return_value = [ \
            (LIST_ADDRESS, USER_ADDRESS1, SERVER, PASSWORD), \
            (LIST_ADDRESS, USER_ADDRESS2, SERVER, PASSWORD)]
        canary.emailutils.get_mail_uids.return_value = [1]
        canary.emailutils.get_message.return_value = {'Subject': "Canary Email " + expectedUUID}

        # Test check
        self.canary.check(LIST_ADDRESS)

        # Assert DB calls
        self.db.get_accounts.assert_called_with(LIST_ADDRESS)
        self.db.pong.assert_has_calls([ \
            mock.call(USER_ADDRESS1, mock.ANY, expectedUUID), \
            mock.call(USER_ADDRESS2, mock.ANY, expectedUUID)])

        # Assert mail calls
        canary.emailutils.get_imap.assert_has_calls([ \
            mock.call(SERVER, USER_ADDRESS1, PASSWORD), \
            mock.call(SERVER, USER_ADDRESS2, PASSWORD)])
        canary.emailutils.get_message.assert_called_with(canary.emailutils.get_imap.return_value, 1)
        canary.emailutils.delete_message.assert_called_with(canary.emailutils.get_imap.return_value, 1)
        canary.emailutils.close.assert_called_with(canary.emailutils.get_imap.return_value)

    def testDontDeleteOtherMail(self):
        # Setup mocks
        self.db.get_accounts.return_value = [(LIST_ADDRESS, USER_ADDRESS1, SERVER, PASSWORD)]
        canary.emailutils.get_mail_uids.return_value = [1]
        canary.emailutils.get_message.return_value = {'Subject': "Buy Our New Widget"}

        # Test check
        self.canary.check(LIST_ADDRESS)

        # Assert DB calls
        self.db.get_accounts.assert_called_with(LIST_ADDRESS)
        self.db.pong.assert_not_called()

        # Assert mail calls
        canary.emailutils.get_imap.assert_called_with(SERVER, USER_ADDRESS1, PASSWORD)
        canary.emailutils.get_message.assert_called_with(canary.emailutils.get_imap.return_value, 1)
        canary.emailutils.delete_message.assert_not_called()
        canary.emailutils.close.assert_called_with(canary.emailutils.get_imap.return_value)