summaryrefslogtreecommitdiff
path: root/src/mailman/runners/tests/test_digest.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/runners/tests/test_digest.py')
-rw-r--r--src/mailman/runners/tests/test_digest.py103
1 files changed, 67 insertions, 36 deletions
diff --git a/src/mailman/runners/tests/test_digest.py b/src/mailman/runners/tests/test_digest.py
index bd32050fb..8b19188df 100644
--- a/src/mailman/runners/tests/test_digest.py
+++ b/src/mailman/runners/tests/test_digest.py
@@ -26,18 +26,21 @@ __all__ = [
]
-import os
import unittest
+from email.iterators import _structure as structure
from email.mime.text import MIMEText
+from io import StringIO
from mailman.app.lifecycle import create_list
from mailman.config import config
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,
+ LogFileMark, digest_mbox, get_queue_messages, make_digest_messages,
+ make_testable_runner, message_from_string,
specialized_message_from_string as mfs)
from mailman.testing.layers import ConfigLayer
+from string import Template
@@ -45,6 +48,7 @@ class TestDigest(unittest.TestCase):
"""Test the digest runner."""
layer = ConfigLayer
+ maxDiff = None
def setUp(self):
self._mlist = create_list('test@example.com')
@@ -55,23 +59,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,
- listid=self._mlist.list_id,
- 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(
@@ -81,6 +71,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'
@@ -89,28 +83,65 @@ 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,
- listid=self._mlist.list_id,
- 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()
+
+ def test_mime_digest_format(self):
+ # Make sure that the format of the MIME digest is as expected.
+ self._mlist.digest_size_threshold = 0.6
+ self._mlist.volume = 1
+ self._mlist.next_digest_number = 1
+ self._mlist.send_welcome_message = False
+ # Fill the digest.
+ process = config.handlers['to-digest'].process
+ size = 0
+ for i in range(1, 5):
+ text = Template("""\
+From: aperson@example.com
+To: xtest@example.com
+Subject: Test message $i
+List-Post: <test@example.com>
+
+Here is message $i
+""").substitute(i=i)
+ msg = message_from_string(text)
+ process(self._mlist, msg, {})
+ size += len(text)
+ if size >= self._mlist.digest_size_threshold * 1024:
+ break
+ # Run the digest runner to create the MIME and RFC 1153 digests.
+ runner = make_testable_runner(DigestRunner)
+ runner.run()
+ items = get_queue_messages('virgin')
+ self.assertEqual(len(items), 2)
+ # Find the MIME one.
+ mime_digest = None
+ for item in items:
+ if item.msg.is_multipart():
+ assert mime_digest is None, 'We got two MIME digests'
+ mime_digest = item.msg
+ fp = StringIO()
+ # Verify the structure is what we expect.
+ structure(mime_digest, fp)
+ self.assertMultiLineEqual(fp.getvalue(), """\
+multipart/mixed
+ text/plain
+ text/plain
+ message/rfc822
+ text/plain
+ message/rfc822
+ text/plain
+ message/rfc822
+ text/plain
+ message/rfc822
+ text/plain
+ text/plain
+""")