summaryrefslogtreecommitdiff
path: root/src/mailman/app/tests/test_bounces.py
diff options
context:
space:
mode:
authorBarry Warsaw2011-05-25 21:30:56 -0400
committerBarry Warsaw2011-05-25 21:30:56 -0400
commit0795e34d56a8f627348730843210cdba4071b26b (patch)
treee0eb6db1731e849d07c96c9deb00094f2b90f437 /src/mailman/app/tests/test_bounces.py
parent9887ba03016bbbd3a52d4a7df4f07906e984f431 (diff)
downloadmailman-0795e34d56a8f627348730843210cdba4071b26b.tar.gz
mailman-0795e34d56a8f627348730843210cdba4071b26b.tar.zst
mailman-0795e34d56a8f627348730843210cdba4071b26b.zip
* bounce_unrecognized_goes_to_list_owner -> forward_unrecognized_bounces_to
* Add an additional option for unrecognized bounce disposition: send it to the site administrators. * Move maybe_forward() from src/mailman/queue/bounce.py to src/mailman/app/bounces.py, refactor and add tests. * Add a LogFileMark class to help with tests that want to check the output to a log file. * OwnerNotification gets a better signature. Instead of tomoderators, the last argument is a roster to send the notification to. If roster is None, then the notification goes to the site administrators.
Diffstat (limited to 'src/mailman/app/tests/test_bounces.py')
-rw-r--r--src/mailman/app/tests/test_bounces.py139
1 files changed, 137 insertions, 2 deletions
diff --git a/src/mailman/app/tests/test_bounces.py b/src/mailman/app/tests/test_bounces.py
index a79b1524c..954b5fc05 100644
--- a/src/mailman/app/tests/test_bounces.py
+++ b/src/mailman/app/tests/test_bounces.py
@@ -32,14 +32,18 @@ import unittest
from zope.component import getUtility
-from mailman.app.bounces import StandardVERP, ProbeVERP, send_probe
+from mailman.app.bounces import (
+ ProbeVERP, StandardVERP, maybe_forward, send_probe)
from mailman.app.lifecycle import create_list
from mailman.app.membership import add_member
from mailman.config import config
+from mailman.interfaces.bounce import UnrecognizedBounceDisposition
from mailman.interfaces.languages import ILanguageManager
-from mailman.interfaces.member import DeliveryMode
+from mailman.interfaces.member import DeliveryMode, MemberRole
from mailman.interfaces.pending import IPendings
+from mailman.interfaces.usermanager import IUserManager
from mailman.testing.helpers import (
+ LogFileMark,
get_queue_messages,
specialized_message_from_string as message_from_string)
from mailman.testing.layers import ConfigLayer
@@ -365,8 +369,139 @@ From: mail-daemon@example.com
+class TestMaybeForward(unittest.TestCase):
+ """Test forwarding of unrecognized bounces."""
+
+ layer = ConfigLayer
+
+ def setUp(self):
+ config.push('test config', """
+ [mailman]
+ site_owner: postmaster@example.com
+ """)
+ self._mlist = create_list('test@example.com')
+ self._msg = message_from_string("""\
+From: bouncer@example.com
+To: test-bounces@example.com
+Subject: You bounced
+Message-ID: <first>
+
+""")
+
+ def tearDown(self):
+ config.pop('test config')
+
+ def test_maybe_forward_discard(self):
+ # When forward_unrecognized_bounces_to is set to discard, no bounce
+ # messages are forwarded.
+ self._mlist.forward_unrecognized_bounces_to = (
+ UnrecognizedBounceDisposition.discard)
+ # The only artifact of this call is a log file entry.
+ mark = LogFileMark('mailman.bounce')
+ maybe_forward(self._mlist, self._msg)
+ items = get_queue_messages('virgin')
+ self.assertEqual(len(items), 0)
+ line = mark.readline()
+ self.assertEqual(
+ line[-40:-1],
+ 'Discarding unrecognized bounce: <first>')
+
+ def test_maybe_forward_list_owner(self):
+ # Set up some owner and moderator addresses.
+ user_manager = getUtility(IUserManager)
+ anne = user_manager.create_address('anne@example.com')
+ bart = user_manager.create_address('bart@example.com')
+ cris = user_manager.create_address('cris@example.com')
+ dave = user_manager.create_address('dave@example.com')
+ # Regular members.
+ elle = user_manager.create_address('elle@example.com')
+ fred = user_manager.create_address('fred@example.com')
+ self._mlist.subscribe(anne, MemberRole.owner)
+ self._mlist.subscribe(bart, MemberRole.owner)
+ self._mlist.subscribe(cris, MemberRole.moderator)
+ self._mlist.subscribe(dave, MemberRole.moderator)
+ self._mlist.subscribe(elle, MemberRole.member)
+ self._mlist.subscribe(fred, MemberRole.member)
+ # When forward_unrecognized_bounces_to is set to owners, the
+ # bounce is forwarded to the list owners and moderators.
+ self._mlist.forward_unrecognized_bounces_to = (
+ UnrecognizedBounceDisposition.administrators)
+ maybe_forward(self._mlist, self._msg)
+ items = get_queue_messages('virgin')
+ self.assertEqual(len(items), 1)
+ msg = items[0].msg
+ self.assertEqual(msg['subject'], 'Uncaught bounce notification')
+ self.assertEqual(msg['from'], 'postmaster@example.com')
+ self.assertEqual(msg['to'], 'test-owner@example.com')
+ # The first attachment is a notification message with a url.
+ payload = msg.get_payload(0)
+ self.assertEqual(payload.get_content_type(), 'text/plain')
+ body = payload.get_payload()
+ self.assertEqual(
+ body.splitlines()[-1],
+ 'http://lists.example.com/admin/test@example.com/bounce')
+ # The second attachment should be a message/rfc822 containing the
+ # original bounce message.
+ payload = msg.get_payload(1)
+ self.assertEqual(payload.get_content_type(), 'message/rfc822')
+ bounce = payload.get_payload(0)
+ self.assertEqual(bounce.as_string(), self._msg.as_string())
+ # All of the owners and moderators, but none of the members, should be
+ # recipients of this message.
+ self.assertEqual(items[0].msgdata['recipients'],
+ set(['anne@example.com', 'bart@example.com',
+ 'cris@example.com', 'dave@example.com']))
+
+ def test_maybe_forward_site_owner(self):
+ # Set up some owner and moderator addresses.
+ user_manager = getUtility(IUserManager)
+ anne = user_manager.create_address('anne@example.com')
+ bart = user_manager.create_address('bart@example.com')
+ cris = user_manager.create_address('cris@example.com')
+ dave = user_manager.create_address('dave@example.com')
+ # Regular members.
+ elle = user_manager.create_address('elle@example.com')
+ fred = user_manager.create_address('fred@example.com')
+ self._mlist.subscribe(anne, MemberRole.owner)
+ self._mlist.subscribe(bart, MemberRole.owner)
+ self._mlist.subscribe(cris, MemberRole.moderator)
+ self._mlist.subscribe(dave, MemberRole.moderator)
+ self._mlist.subscribe(elle, MemberRole.member)
+ self._mlist.subscribe(fred, MemberRole.member)
+ # When forward_unrecognized_bounces_to is set to owners, the
+ # bounce is forwarded to the list owners and moderators.
+ self._mlist.forward_unrecognized_bounces_to = (
+ UnrecognizedBounceDisposition.site_owner)
+ maybe_forward(self._mlist, self._msg)
+ items = get_queue_messages('virgin')
+ self.assertEqual(len(items), 1)
+ msg = items[0].msg
+ self.assertEqual(msg['subject'], 'Uncaught bounce notification')
+ self.assertEqual(msg['from'], 'postmaster@example.com')
+ self.assertEqual(msg['to'], 'postmaster@example.com')
+ # The first attachment is a notification message with a url.
+ payload = msg.get_payload(0)
+ self.assertEqual(payload.get_content_type(), 'text/plain')
+ body = payload.get_payload()
+ self.assertEqual(
+ body.splitlines()[-1],
+ 'http://lists.example.com/admin/test@example.com/bounce')
+ # The second attachment should be a message/rfc822 containing the
+ # original bounce message.
+ payload = msg.get_payload(1)
+ self.assertEqual(payload.get_content_type(), 'message/rfc822')
+ bounce = payload.get_payload(0)
+ self.assertEqual(bounce.as_string(), self._msg.as_string())
+ # All of the owners and moderators, but none of the members, should be
+ # recipients of this message.
+ self.assertEqual(items[0].msgdata['recipients'],
+ set(['postmaster@example.com',]))
+
+
+
def test_suite():
suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestMaybeForward))
suite.addTest(unittest.makeSuite(TestProbe))
suite.addTest(unittest.makeSuite(TestSendProbe))
suite.addTest(unittest.makeSuite(TestSendProbeNonEnglish))