30
from mailman.app.bounces import get_verp
30
from zope.component import getUtility
32
from mailman.app.bounces import StandardVERP, send_probe
31
33
from mailman.app.lifecycle import create_list
34
from mailman.app.membership import add_member
35
from mailman.interfaces.member import DeliveryMode
36
from mailman.interfaces.pending import IPendings
32
37
from mailman.testing.helpers import (
33
39
specialized_message_from_string as message_from_string)
34
40
from mailman.testing.layers import ConfigLayer
38
44
class TestVERP(unittest.TestCase):
45
"""Test header VERP detection."""
39
47
layer = ConfigLayer
42
50
self._mlist = create_list('test@example.com')
51
self._verper = StandardVERP()
44
53
def test_no_verp(self):
45
54
# The empty set is returned when there is no VERP headers.
155
171
Apparently-To: test-bounces+bart=example.org@example.com
158
self.assertEqual(get_verp(self._mlist, msg),
174
self.assertEqual(self._verper.get_verp(self._mlist, msg),
159
175
set(['anne@example.org', 'bart@example.org']))
179
class TestSendProbe(unittest.TestCase):
180
"""Test sending of the probe message."""
185
self._mlist = create_list('test@example.com')
186
self._member = add_member(self._mlist, 'anne@example.com',
187
'Anne Person', 'xxx',
188
DeliveryMode.regular, 'en')
189
self._msg = message_from_string("""\
190
From: bouncer@example.com
197
def test_token(self):
198
# Show that send_probe() returns a proper token, and that the token
199
# corresponds to a record in the pending database.
200
token = send_probe(self._member, self._msg)
201
pendable = getUtility(IPendings).confirm(token)
202
self.assertEqual(len(pendable.items()), 2)
203
self.assertEqual(set(pendable.keys()),
204
set(['member_id', 'message_id']))
205
self.assertEqual(pendable['member_id'], self._member.member_id)
206
self.assertEqual(pendable['message_id'], '<first>')
208
def test_probe_is_multipart(self):
209
# The probe is a multipart/mixed with two subparts.
210
send_probe(self._member, self._msg)
211
message = get_queue_messages('virgin')[0].msg
212
self.assertEqual(message.get_content_type(), 'multipart/mixed')
213
self.assertTrue(message.is_multipart())
214
self.assertEqual(len(message.get_payload()), 2)
216
def test_probe_sends_one_message(self):
217
# send_probe() places one message in the virgin queue.
218
items = get_queue_messages('virgin')
219
self.assertEqual(len(items), 0)
220
send_probe(self._member, self._msg)
221
items = get_queue_messages('virgin')
222
self.assertEqual(len(items), 1)
224
def test_probe_contains_original(self):
225
# Show that send_probe() places a properly formatted message in the
227
send_probe(self._member, self._msg)
228
message = get_queue_messages('virgin')[0].msg
229
rfc822 = message.get_payload(1)
230
self.assertEqual(rfc822.get_content_type(), 'message/rfc822')
231
self.assertTrue(rfc822.is_multipart())
232
self.assertEqual(len(rfc822.get_payload()), 1)
233
self.assertEqual(rfc822.get_payload(0).as_string(),
234
self._msg.as_string())
236
def test_notice(self):
237
# Test that the notice in the first subpart is correct.
238
send_probe(self._member, self._msg)
239
message = get_queue_messages('virgin')[0].msg
240
notice = message.get_payload(0)
241
self.assertEqual(notice.get_content_type(), 'text/plain')
242
# The interesting bits are the parts that have been interpolated into
243
# the message. For now the best we can do is know that the
244
# interpolation values appear in the message. When Python 2.7 is our
245
# minimum requirement, we can use assertRegexpMatches().
246
body = notice.get_payload()
247
self.assertTrue('test@example.com' in body)
248
self.assertTrue('anne@example.com' in body)
249
self.assertTrue('http://example.com/anne@example.com' in body)
250
self.assertTrue('test-owner@example.com' in body)
252
def test_headers(self):
253
# Check the headers of the outer message.
254
token = send_probe(self._member, self._msg)
255
message = get_queue_messages('virgin')[0].msg
256
self.assertEqual(message['From'],
257
'test-bounces+{0}@example.com'.format(token))
258
self.assertEqual(message['To'], 'anne@example.com')
259
self.assertEqual(message['Subject'], 'Test mailing list probe message')
263
class TestProbe(unittest.TestCase):
264
"""Test VERP probing."""
269
self._mlist = create_list('test@example.com')
163
275
def test_suite():
164
276
suite = unittest.TestSuite()
277
suite.addTest(unittest.makeSuite(TestProbe))
278
suite.addTest(unittest.makeSuite(TestSendProbe))
165
279
suite.addTest(unittest.makeSuite(TestVERP))