diff options
| -rw-r--r-- | src/mailman/core/runner.py | 2 | ||||
| -rw-r--r-- | src/mailman/core/tests/test_runner.py | 22 | ||||
| -rw-r--r-- | src/mailman/email/message.py | 6 | ||||
| -rw-r--r-- | src/mailman/handlers/cook_headers.py | 3 | ||||
| -rw-r--r-- | src/mailman/handlers/tests/test_cook_headers.py | 21 | ||||
| -rw-r--r-- | src/mailman/runners/digest.py | 4 | ||||
| -rw-r--r-- | src/mailman/runners/tests/test_digest.py | 45 | ||||
| -rw-r--r-- | src/mailman/testing/helpers.py | 22 |
8 files changed, 65 insertions, 60 deletions
diff --git a/src/mailman/core/runner.py b/src/mailman/core/runner.py index de7acdd1c..81a2ea3d1 100644 --- a/src/mailman/core/runner.py +++ b/src/mailman/core/runner.py @@ -239,7 +239,7 @@ class Runner: if mlist is None: language_manager = getUtility(ILanguageManager) language = language_manager[config.mailman.default_language] - elif hasattr(msg, "sender") and msg.sender: + elif msg.sender: member = mlist.members.get_member(msg.sender) language = (member.preferred_language if member is not None diff --git a/src/mailman/core/tests/test_runner.py b/src/mailman/core/tests/test_runner.py index 06c360fa0..2fd4ae7d6 100644 --- a/src/mailman/core/tests/test_runner.py +++ b/src/mailman/core/tests/test_runner.py @@ -27,7 +27,6 @@ __all__ = [ import os import unittest -from email.mime.multipart import MIMEMultipart from mailman.app.lifecycle import create_list from mailman.config import config @@ -35,7 +34,8 @@ from mailman.core.runner import Runner from mailman.interfaces.runner import RunnerCrashEvent from mailman.testing.helpers import ( configuration, event_subscribers, get_queue_messages, LogFileMark, - make_testable_runner, specialized_message_from_string as mfs) + make_testable_runner, specialized_message_from_string as mfs, + make_digest_messages) from mailman.testing.layers import ConfigLayer @@ -95,14 +95,16 @@ Message-ID: <ant> self.assertEqual(len(shunted), 1) self.assertEqual(shunted[0].msg['message-id'], '<ant>') - def test_multipart_message(self): + def test_digest_messages(self): + # Digest messages can be MIMEMultipart (LP#1130696) runner = make_testable_runner(StoringRunner, 'in') - msg = MIMEMultipart() - msg["Message-ID"] = "<ant>" - config.switchboards['in'].enqueue(msg, listname='test@example.com') + make_digest_messages(self._mlist) + for bag in get_queue_messages("virgin"): + config.switchboards['in'].enqueue(bag.msg, listname='test@example.com') + error_log = LogFileMark('mailman.error') with event_subscribers(self._got_event): runner.run() - error_log = LogFileMark('mailman.error') - self.assertEqual(len(self._events), 0, error_log.read()) - self.assertEqual(len(runner._disposed), 1) - self.assertEqual(runner._disposed[0][1]["Message-ID"], "<ant>") + errors = error_log.read() + self.assertEqual(len(self._events), 0, errors) + self.assertEqual(len(get_queue_messages("shunt")), 0, errors) + self.assertEqual(len(runner._disposed), 2) diff --git a/src/mailman/email/message.py b/src/mailman/email/message.py index f3a44e63c..1fca952c7 100644 --- a/src/mailman/email/message.py +++ b/src/mailman/email/message.py @@ -36,6 +36,7 @@ __all__ = [ import email import email.message import email.utils +import email.mime.multipart from email.header import Header @@ -159,6 +160,11 @@ class Message(email.message.Message): +class MultipartMessage(email.mime.multipart.MIMEMultipart, Message): + """Class for MIME digest messages""" + + + class UserNotification(Message): """Class for internally crafted messages.""" diff --git a/src/mailman/handlers/cook_headers.py b/src/mailman/handlers/cook_headers.py index 20ffc390c..d5d096448 100644 --- a/src/mailman/handlers/cook_headers.py +++ b/src/mailman/handlers/cook_headers.py @@ -75,8 +75,7 @@ def process(mlist, msg, msgdata): # message, we want to save some of the information in the msgdata # dictionary for later. Specifically, the sender header will get waxed, # but we need it for the Acknowledge module later. - if hasattr(msg, "sender"): - msgdata['original_sender'] = msg.sender + msgdata['original_sender'] = msg.sender # VirginRunner sets _fasttrack for internally crafted messages. fasttrack = msgdata.get('_fasttrack') if not msgdata.get('isdigest') and not fasttrack: diff --git a/src/mailman/handlers/tests/test_cook_headers.py b/src/mailman/handlers/tests/test_cook_headers.py index 1a8fa6cdc..a7121da6d 100644 --- a/src/mailman/handlers/tests/test_cook_headers.py +++ b/src/mailman/handlers/tests/test_cook_headers.py @@ -26,10 +26,10 @@ __all__ = [ import unittest -from email.mime.multipart import MIMEMultipart from mailman.app.lifecycle import create_list from mailman.handlers import cook_headers +from mailman.testing.helpers import get_queue_messages, make_digest_messages from mailman.testing.layers import ConfigLayer @@ -42,12 +42,13 @@ class TestCookHeaders(unittest.TestCase): def setUp(self): self._mlist = create_list('test@example.com') - def test_process_multipart(self): - # The digest runner creates MIMEMultipart message instances which have - # no sender property. - msg = MIMEMultipart() - msg["message-id"] = "<test>" - try: - cook_headers.process(self._mlist, msg, {}) - except AttributeError as e: - self.fail(e) + def test_process_digest(self): + # Digest messages can be MIMEMultipart (LP#1130696) + make_digest_messages(self._mlist) + messages = [ bag.msg for bag in get_queue_messages("virgin") ] + self.assertEqual(len(messages), 2) + for msg in messages: + try: + cook_headers.process(self._mlist, msg, {}) + except AttributeError as e: + self.fail(e) diff --git a/src/mailman/runners/digest.py b/src/mailman/runners/digest.py index 98fe82f39..4ccfe0bde 100644 --- a/src/mailman/runners/digest.py +++ b/src/mailman/runners/digest.py @@ -32,7 +32,6 @@ import logging from StringIO import StringIO from copy import deepcopy from email.header import Header -from email.message import Message from email.mime.message import MIMEMessage from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText @@ -42,6 +41,7 @@ from urllib2 import URLError from mailman.config import config from mailman.core.i18n import _ from mailman.core.runner import Runner +from mailman.email.message import Message, MultipartMessage from mailman.handlers.decorate import decorate from mailman.interfaces.member import DeliveryMode, DeliveryStatus from mailman.utilities.i18n import make @@ -172,7 +172,7 @@ class MIMEDigester(Digester): self._keepers = set(config.digests.mime_digest_keep_headers.split()) def _make_message(self): - return MIMEMultipart('mixed') + return MultipartMessage('mixed') def add_toc(self, count): """Add the table of contents.""" diff --git a/src/mailman/runners/tests/test_digest.py b/src/mailman/runners/tests/test_digest.py index 80cf253bc..74508bd7d 100644 --- a/src/mailman/runners/tests/test_digest.py +++ b/src/mailman/runners/tests/test_digest.py @@ -35,7 +35,7 @@ from mailman.email.message import Message from mailman.runners.digest import DigestRunner from mailman.testing.helpers import ( LogFileMark, digest_mbox, get_queue_messages, make_testable_runner, - specialized_message_from_string as mfs) + specialized_message_from_string as mfs, make_digest_messages) from mailman.testing.layers import ConfigLayer @@ -54,23 +54,9 @@ class TestDigest(unittest.TestCase): self._runner = make_testable_runner(DigestRunner, 'digest') self._process = config.handlers['to-digest'].process - def test_simple_message(self): - msg = mfs("""\ -From: anne@example.org -To: test@example.com - -message triggering a digest -""") - mbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf') - self._process(self._mlist, msg, {}) - self._digestq.enqueue( - msg, - listname=self._mlist.fqdn_listname, - digest_path=mbox_path, - volume=1, digest_number=1) - self._runner.run() - # There are two messages in the virgin queue: the digest as plain-text - # and as multipart. + def _check_virgin_queue(self): + # There should be two messages in the virgin queue: the digest as + # plain-text and as multipart. messages = get_queue_messages('virgin') self.assertEqual(len(messages), 2) self.assertEqual( @@ -80,6 +66,10 @@ message triggering a digest self.assertEqual(item.msg['subject'], 'Test Digest, Vol 1, Issue 1') + def test_simple_message(self): + make_digest_messages(self._mlist) + self._check_virgin_queue() + def test_non_ascii_message(self): msg = Message() msg['From'] = 'anne@example.org' @@ -88,25 +78,10 @@ message triggering a digest msg.attach(MIMEText('message with non-ascii chars: \xc3\xa9', 'plain', 'utf-8')) mbox = digest_mbox(self._mlist) - mbox_path = os.path.join(self._mlist.data_path, 'digest.mmdf') mbox.add(msg.as_string()) - self._digestq.enqueue( - msg, - listname=self._mlist.fqdn_listname, - digest_path=mbox_path, - volume=1, digest_number=1) # Use any error logs as the error message if the test fails. error_log = LogFileMark('mailman.error') - self._runner.run() + make_digest_messages(self._mlist, msg) # The runner will send the file to the shunt queue on exception. self.assertEqual(len(self._shuntq.files), 0, error_log.read()) - # There are two messages in the virgin queue: the digest as plain-text - # and as multipart. - messages = get_queue_messages('virgin') - self.assertEqual(len(messages), 2) - self.assertEqual( - sorted(item.msg.get_content_type() for item in messages), - ['multipart/mixed', 'text/plain']) - for item in messages: - self.assertEqual(item.msg['subject'], - 'Test Digest, Vol 1, Issue 1') + self._check_virgin_queue() diff --git a/src/mailman/testing/helpers.py b/src/mailman/testing/helpers.py index b0fe14a0d..5a9dee0e0 100644 --- a/src/mailman/testing/helpers.py +++ b/src/mailman/testing/helpers.py @@ -72,6 +72,7 @@ from mailman.interfaces.member import MemberRole from mailman.interfaces.messages import IMessageStore from mailman.interfaces.styles import IStyleManager from mailman.interfaces.usermanager import IUserManager +from mailman.runners.digest import DigestRunner from mailman.utilities.mailbox import Mailbox @@ -529,3 +530,24 @@ class LogFileMark: with open(self._filename) as fp: fp.seek(self._filepos) return fp.read() + + + +def make_digest_messages(mlist, msg=None): + if msg is None: + msg = specialized_message_from_string("""\ +From: anne@example.org +To: {listname} +Message-ID: <testing> + +message triggering a digest +""".format(listname=mlist.fqdn_listname)) + mbox_path = os.path.join(mlist.data_path, 'digest.mmdf') + config.handlers['to-digest'].process(mlist, msg, {}) + config.switchboards['digest'].enqueue( + msg, + listname=mlist.fqdn_listname, + digest_path=mbox_path, + volume=1, digest_number=1) + runner = make_testable_runner(DigestRunner, 'digest') + runner.run() |
