summaryrefslogtreecommitdiff
path: root/src/mailman/bin/tests/test_mailman.py
diff options
context:
space:
mode:
authorBarry Warsaw2016-04-12 13:10:39 -0400
committerBarry Warsaw2016-04-12 13:10:39 -0400
commitd9384158c3f6e01ea7a0a42a40dd47c0892eb266 (patch)
treef3f9410fdfcbc3d26c194ef93809e3f708320f52 /src/mailman/bin/tests/test_mailman.py
parent04dc2acf6c24a82db7a3de46c14a2b66d6ffc907 (diff)
downloadmailman-d9384158c3f6e01ea7a0a42a40dd47c0892eb266.tar.gz
mailman-d9384158c3f6e01ea7a0a42a40dd47c0892eb266.tar.zst
mailman-d9384158c3f6e01ea7a0a42a40dd47c0892eb266.zip
Diffstat (limited to 'src/mailman/bin/tests/test_mailman.py')
-rw-r--r--src/mailman/bin/tests/test_mailman.py57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/mailman/bin/tests/test_mailman.py b/src/mailman/bin/tests/test_mailman.py
index 7c9d2f2bc..c678ff560 100644
--- a/src/mailman/bin/tests/test_mailman.py
+++ b/src/mailman/bin/tests/test_mailman.py
@@ -19,12 +19,21 @@
import unittest
+from contextlib import ExitStack
+from datetime import timedelta
from io import StringIO
+from mailman.app.lifecycle import create_list
from mailman.bin.mailman import main
+from mailman.config import config
+from mailman.database.transaction import transaction
+from mailman.testing.layers import ConfigLayer
+from mailman.utilities.datetime import now
from unittest.mock import patch
class TestMailmanCommand(unittest.TestCase):
+ layer = ConfigLayer
+
def test_mailman_command_without_subcommand_prints_help(self):
# Issue #137: Running `mailman` without a subcommand raises an
# AttributeError.
@@ -34,3 +43,51 @@ class TestMailmanCommand(unittest.TestCase):
with self.assertRaises(SystemExit):
main()
self.assertIn('usage', output.getvalue())
+
+ def test_transaction_commit_after_successful_subcommand(self):
+ # Issue #223: Subcommands which change the database need to commit or
+ # abort the transaction.
+ with transaction():
+ mlist = create_list('ant@example.com')
+ mlist.volume = 5
+ mlist.next_digest_number = 3
+ mlist.digest_last_sent_at = now() - timedelta(days=60)
+ testargs = ['mailman', 'digests', '-b', '-l', 'ant@example.com']
+ output = StringIO()
+ with ExitStack() as resources:
+ enter = resources.enter_context
+ enter(patch('sys.argv', testargs))
+ enter(patch('sys.stdout', output))
+ # Everything is already initialized.
+ enter(patch('mailman.bin.mailman.initialize'))
+ main()
+ # Clear the current transaction to force a database reload.
+ config.db.abort()
+ self.assertEqual(mlist.volume, 6)
+ self.assertEqual(mlist.next_digest_number, 1)
+
+ def test_transaction_abort_after_failing_subcommand(self):
+ with transaction():
+ mlist = create_list('ant@example.com')
+ mlist.volume = 5
+ mlist.next_digest_number = 3
+ mlist.digest_last_sent_at = now() - timedelta(days=60)
+ testargs = ['mailman', 'digests', '-b', '-l', 'ant@example.com',
+ '--send']
+ output = StringIO()
+ with ExitStack() as resources:
+ enter = resources.enter_context
+ enter(patch('sys.argv', testargs))
+ enter(patch('sys.stdout', output))
+ # Force an exception in the subcommand.
+ enter(patch('mailman.commands.cli_digests.maybe_send_digest_now',
+ side_effect=RuntimeError))
+ # Everything is already initialized.
+ enter(patch('mailman.bin.mailman.initialize'))
+ with self.assertRaises(RuntimeError):
+ main()
+ # Clear the current transaction to force a database reload.
+ config.db.abort()
+ # The volume and number haven't changed.
+ self.assertEqual(mlist.volume, 5)
+ self.assertEqual(mlist.next_digest_number, 3)