~dcrodman/mailman/dcrodman-fix

« back to all changes in this revision

Viewing changes to src/mailman/app/tests/test_bounces.py

  • Committer: Barry Warsaw
  • Date: 2011-05-08 02:54:38 UTC
  • mfrom: (7002.1.3 bounces)
  • Revision ID: barry@list.org-20110508025438-3oyz48fnbyptmz22
Merge bounces branch (still incomplete, but tests pass).

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
 
28
28
import unittest
29
29
 
30
 
from mailman.app.bounces import get_verp
 
30
from zope.component import getUtility
 
31
 
 
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 (
 
38
    get_queue_messages,
33
39
    specialized_message_from_string as message_from_string)
34
40
from mailman.testing.layers import ConfigLayer
35
41
 
36
42
 
37
43
 
38
44
class TestVERP(unittest.TestCase):
 
45
    """Test header VERP detection."""
 
46
 
39
47
    layer = ConfigLayer
40
48
 
41
49
    def setUp(self):
42
50
        self._mlist = create_list('test@example.com')
 
51
        self._verper = StandardVERP()
43
52
 
44
53
    def test_no_verp(self):
45
54
        # The empty set is returned when there is no VERP headers.
48
57
To: mailman-bounces@example.com
49
58
 
50
59
""")
51
 
        self.assertEqual(get_verp(self._mlist, msg), set())
 
60
        self.assertEqual(self._verper.get_verp(self._mlist, msg), set())
52
61
 
53
62
    def test_verp_in_to(self):
54
63
        # A VERP address is found in the To header.
57
66
To: test-bounces+anne=example.org@example.com
58
67
 
59
68
""")
60
 
        self.assertEqual(get_verp(self._mlist, msg), set(['anne@example.org']))
 
69
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
 
70
                         set(['anne@example.org']))
61
71
 
62
72
    def test_verp_in_delivered_to(self):
63
73
        # A VERP address is found in the Delivered-To header.
66
76
Delivered-To: test-bounces+anne=example.org@example.com
67
77
 
68
78
""")
69
 
        self.assertEqual(get_verp(self._mlist, msg), set(['anne@example.org']))
 
79
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
 
80
                         set(['anne@example.org']))
70
81
 
71
82
    def test_verp_in_envelope_to(self):
72
83
        # A VERP address is found in the Envelope-To header.
75
86
Envelope-To: test-bounces+anne=example.org@example.com
76
87
 
77
88
""")
78
 
        self.assertEqual(get_verp(self._mlist, msg), set(['anne@example.org']))
 
89
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
 
90
                         set(['anne@example.org']))
79
91
 
80
92
    def test_verp_in_apparently_to(self):
81
93
        # A VERP address is found in the Apparently-To header.
84
96
Apparently-To: test-bounces+anne=example.org@example.com
85
97
 
86
98
""")
87
 
        self.assertEqual(get_verp(self._mlist, msg), set(['anne@example.org']))
 
99
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
 
100
                         set(['anne@example.org']))
88
101
 
89
102
    def test_verp_with_empty_header(self):
90
103
        # A VERP address is found, but there's an empty header.
94
107
To:
95
108
 
96
109
""")
97
 
        self.assertEqual(get_verp(self._mlist, msg), set(['anne@example.org']))
 
110
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
 
111
                         set(['anne@example.org']))
98
112
 
99
113
    def test_no_verp_with_empty_header(self):
100
114
        # There's an empty header, and no VERP address is found.
103
117
To:
104
118
 
105
119
""")
106
 
        self.assertEqual(get_verp(self._mlist, msg), set())
 
120
        self.assertEqual(self._verper.get_verp(self._mlist, msg), set())
107
121
 
108
122
    def test_verp_with_non_match(self):
109
123
        # A VERP address is found, but a header had a non-matching pattern.
113
127
To: test-bounces@example.com
114
128
 
115
129
""")
116
 
        self.assertEqual(get_verp(self._mlist, msg), set(['anne@example.org']))
 
130
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
 
131
                         set(['anne@example.org']))
117
132
 
118
133
    def test_no_verp_with_non_match(self):
119
134
        # No VERP address is found, and a header had a non-matching pattern.
122
137
To: test-bounces@example.com
123
138
 
124
139
""")
125
 
        self.assertEqual(get_verp(self._mlist, msg), set())
 
140
        self.assertEqual(self._verper.get_verp(self._mlist, msg), set())
126
141
 
127
142
    def test_multiple_verps(self):
128
143
        # More than one VERP address was found in the same header.
132
147
To: test-bounces+anne=example.org@example.com
133
148
 
134
149
""")
135
 
        self.assertEqual(get_verp(self._mlist, msg), set(['anne@example.org']))
 
150
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
 
151
                         set(['anne@example.org']))
136
152
 
137
153
    def test_multiple_verps_different_values(self):
138
154
        # More than one VERP address was found in the same header with
143
159
To: test-bounces+bart=example.org@example.com
144
160
 
145
161
""")
146
 
        self.assertEqual(get_verp(self._mlist, msg),
 
162
        self.assertEqual(self._verper.get_verp(self._mlist, msg),
147
163
                         set(['anne@example.org', 'bart@example.org']))
148
164
 
149
165
    def test_multiple_verps_different_values_different_headers(self):
155
171
Apparently-To: test-bounces+bart=example.org@example.com
156
172
 
157
173
""")
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']))
160
176
 
161
177
 
162
178
 
 
179
class TestSendProbe(unittest.TestCase):
 
180
    """Test sending of the probe message."""
 
181
 
 
182
    layer = ConfigLayer
 
183
 
 
184
    def setUp(self):
 
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
 
191
To: anne@example.com
 
192
Subject: You bounced
 
193
Message-ID: <first>
 
194
 
 
195
""")
 
196
 
 
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>')
 
207
 
 
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)
 
215
 
 
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)
 
223
 
 
224
    def test_probe_contains_original(self):
 
225
        # Show that send_probe() places a properly formatted message in the
 
226
        # virgin queue.
 
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())
 
235
 
 
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)
 
251
 
 
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')
 
260
 
 
261
 
 
262
 
 
263
class TestProbe(unittest.TestCase):
 
264
    """Test VERP probing."""
 
265
 
 
266
    layer = ConfigLayer
 
267
 
 
268
    def setUp(self):
 
269
        self._mlist = create_list('test@example.com')
 
270
 
 
271
    
 
272
 
 
273
 
 
274
 
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))
166
280
    return suite