-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_mailsender.py
150 lines (133 loc) · 6.79 KB
/
test_mailsender.py
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
from unittest import TestCase
import pickle
import requests
from mailsender import EnvConfig, RETRY_WAIT_MS_DEFAULT, RETRY_COUNT_DEFAULT, BespinApi, \
SendEmailMessage, EMAIL_EXCHANGE, ROUTING_KEY, MailSender
from unittest.mock import patch, Mock, call
class EnvConfigTests(TestCase):
@patch('mailsender.os')
def test_constructor_defaults(self, mock_os):
mock_os.environ = {
"BESPIN_API_TOKEN": "123",
"BESPIN_API_URL": "http://someurl/api",
}
config = EnvConfig()
self.assertEqual(config.work_queue_config.host, "127.0.0.1")
self.assertEqual(config.work_queue_config.username, "guest")
self.assertEqual(config.work_queue_config.password, "guest")
self.assertEqual(config.email_retry_count, int(RETRY_COUNT_DEFAULT))
self.assertEqual(config.retry_wait_ms, RETRY_WAIT_MS_DEFAULT)
self.assertEqual(config.bespin_api_token, "123")
self.assertEqual(config.bespin_api_url, "http://someurl/api")
@patch('mailsender.os')
def test_constructor_all_values(self, mock_os):
mock_os.environ = {
"MESSAGE_QUEUE_HOST":"somehost",
"MESSAGE_QUEUE_USERNAME":"myuser",
"MESSAGE_QUEUE_PASSWORD":"mypass",
"BESPIN_API_TOKEN": "123",
"BESPIN_API_URL": "http://someurl/api",
"RETRY_COUNT": '100',
"RETRY_WAIT_MS": '2000',
}
config = EnvConfig()
self.assertEqual(config.work_queue_config.host, "somehost")
self.assertEqual(config.work_queue_config.username, "myuser")
self.assertEqual(config.work_queue_config.password, "mypass")
self.assertEqual(config.bespin_api_token, "123")
self.assertEqual(config.bespin_api_url, "http://someurl/api")
self.assertEqual(config.email_retry_count, 100)
self.assertEqual(config.retry_wait_ms, '2000')
class BespinApiTests(TestCase):
def setUp(self):
self.bespin_api = BespinApi(Mock(bespin_api_token='123', bespin_api_url='http://someurl/api'))
def test_headers(self):
headers = self.bespin_api.headers()
self.assertEqual(headers['Authorization'], 'Token 123')
self.assertEqual(headers['Content-type'], 'application/json')
@patch('mailsender.requests')
def test_email_message_send(self, mock_requests):
self.bespin_api.email_message_send(475)
expected_url = 'http://someurl/api/admin/email-messages/475/send/'
mock_requests.post.assert_called_with(expected_url, headers=self.bespin_api.headers(), json={})
class SendEmailMessageTests(TestCase):
def setUp(self):
self.config = Mock(email_retry_count=12345)
def test_constructor(self):
send_email_message = SendEmailMessage(send_email_id=1, retry_count=2)
self.assertEqual(send_email_message.send_email_id, 1)
self.assertEqual(send_email_message.retry_count, 2)
self.assertEqual(send_email_message.exchange, EMAIL_EXCHANGE)
self.assertEqual(send_email_message.routing_key, ROUTING_KEY)
def test_build_body(self):
picked_body = SendEmailMessage(send_email_id=1, retry_count=2).build_body()
body = pickle.loads(picked_body)
self.assertEqual(body["send_email"], 1)
self.assertEqual(body["retry_count"], 2)
def test_try_create_from_body_with_bad_data(self):
send_email_message = SendEmailMessage.try_create_from_body(pickle.dumps({}), self.config)
self.assertEqual(None, send_email_message)
send_email_message = SendEmailMessage.try_create_from_body(pickle.dumps("blah"), self.config)
self.assertEqual(None, send_email_message)
send_email_message = SendEmailMessage.try_create_from_body(pickle.dumps({"send": 2}), self.config)
self.assertEqual(None, send_email_message)
def test_try_create_from_body_with_good_data(self):
data = {"send_email": '123'}
send_email_message = SendEmailMessage.try_create_from_body(pickle.dumps(data), self.config)
self.assertEqual(send_email_message.send_email_id, '123')
self.assertEqual(send_email_message.retry_count, 12345)
data = {"send_email": "123", "retry_count": 10}
send_email_message = SendEmailMessage.try_create_from_body(pickle.dumps(data), self.config)
self.assertEqual(send_email_message.send_email_id, '123')
self.assertEqual(send_email_message.retry_count, 10)
class MailSenderTests(TestCase):
@patch('mailsender.WorkQueueConnection')
def test_constructor(self, mock_work_queue_connection):
mail_sender = MailSender(config=Mock())
mock_channel = mail_sender.channel
# Declare and bind email and retry exchanges/queues
mock_channel.exchange_declare.assert_has_calls([
call('EmailExchange', 'direct'),
call('RetryExchange', 'direct'),
])
mock_channel.queue_declare.assert_has_calls([
call(queue='EmailQueue'),
call(queue='RetryQueue', arguments={'x-dead-letter-exchange': 'EmailExchange'},),
])
mock_channel.queue_bind.assert_has_calls([
call(exchange='EmailExchange', queue='EmailQueue', routing_key='SendEmail'),
call(exchange='RetryExchange', queue='RetryQueue', routing_key='SendEmail')
])
# call email_call when a message shows up in EmailQueue
mock_channel.basic_consume.assert_called_with(
mail_sender.email_callback,
queue='EmailQueue',
no_ack=True
)
@patch('mailsender.WorkQueueConnection')
@patch('mailsender.BespinApi')
def test_email_callback_works_first_time(self, mock_bespin_api, mock_work_queue_connection):
mail_sender = MailSender(config=Mock())
mail_sender.email_callback(None, None, None, pickle.dumps({
'send_email': '5'
}))
mock_bespin_api.return_value.email_message_send.assert_called_with('5')
@patch('mailsender.WorkQueueConnection')
@patch('mailsender.BespinApi')
def test_email_callback_with_one_retry(self, mock_bespin_api, mock_work_queue_connection):
mock_bespin_api.return_value.email_message_send.side_effect = [
requests.HTTPError()
]
mail_sender = MailSender(config=Mock(email_retry_count=1, retry_wait_ms=2000))
mail_sender.email_callback(None, None, None, pickle.dumps({
'send_email': '5'
}))
mock_bespin_api.return_value.email_message_send.assert_has_calls([
call('5')
])
args, kwargs = mail_sender.channel.basic_publish.call_args
sent_body = pickle.loads(kwargs['body'])
self.assertEqual(sent_body['send_email'], '5')
self.assertEqual(sent_body['retry_count'], 0) # retry count should be decremented
self.assertEqual(kwargs['properties'].expiration, 2000)
self.assertEqual(kwargs['routing_key'], 'SendEmail')