summaryrefslogtreecommitdiff
path: root/tests/test_canary.py
blob: d23f3fedcdbedf8bc712927d05144a30082c6240 (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)