diff options
| author | Barry Warsaw | 2016-04-12 13:10:39 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2016-04-12 13:10:39 -0400 |
| commit | d9384158c3f6e01ea7a0a42a40dd47c0892eb266 (patch) | |
| tree | f3f9410fdfcbc3d26c194ef93809e3f708320f52 /src/mailman/bin/tests/test_mailman.py | |
| parent | 04dc2acf6c24a82db7a3de46c14a2b66d6ffc907 (diff) | |
| download | mailman-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.py | 57 |
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) |
