summaryrefslogtreecommitdiff
path: root/src/mailman/commands/tests/test_eml_confirm.py
diff options
context:
space:
mode:
authorBarry Warsaw2017-07-22 03:02:05 +0000
committerBarry Warsaw2017-07-22 03:02:05 +0000
commitf00b94f18e1d82d1488cbcee6053f03423bc2f49 (patch)
tree1a8e56dff0eab71e58e5fc9ecc5f3c614d7edca7 /src/mailman/commands/tests/test_eml_confirm.py
parentf54c045519300f6f70947d1114f46c2b8ae0d368 (diff)
downloadmailman-f00b94f18e1d82d1488cbcee6053f03423bc2f49.tar.gz
mailman-f00b94f18e1d82d1488cbcee6053f03423bc2f49.tar.zst
mailman-f00b94f18e1d82d1488cbcee6053f03423bc2f49.zip
Diffstat (limited to 'src/mailman/commands/tests/test_eml_confirm.py')
-rw-r--r--src/mailman/commands/tests/test_eml_confirm.py175
1 files changed, 175 insertions, 0 deletions
diff --git a/src/mailman/commands/tests/test_eml_confirm.py b/src/mailman/commands/tests/test_eml_confirm.py
new file mode 100644
index 000000000..1ef392b76
--- /dev/null
+++ b/src/mailman/commands/tests/test_eml_confirm.py
@@ -0,0 +1,175 @@
+# Copyright (C) 2012-2017 by the Free Software Foundation, Inc.
+#
+# This file is part of GNU Mailman.
+#
+# GNU Mailman is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
+
+"""Test the `confirm` command."""
+
+import unittest
+
+from mailman.app.lifecycle import create_list
+from mailman.commands.eml_confirm import Confirm
+from mailman.config import config
+from mailman.email.message import Message
+from mailman.interfaces.command import ContinueProcessing
+from mailman.interfaces.mailinglist import SubscriptionPolicy
+from mailman.interfaces.subscriptions import ISubscriptionManager
+from mailman.interfaces.usermanager import IUserManager
+from mailman.runners.command import CommandRunner, Results
+from mailman.testing.helpers import (
+ get_queue_messages, make_testable_runner,
+ specialized_message_from_string as mfs, subscribe)
+from mailman.testing.layers import ConfigLayer
+from zope.component import getUtility
+
+
+class TestConfirmJoin(unittest.TestCase):
+ """Test the `confirm` command when joining a mailing list."""
+
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('test@example.com')
+ anne = getUtility(IUserManager).create_address(
+ 'anne@example.com', 'Anne Person')
+ self._token, token_owner, member = ISubscriptionManager(
+ self._mlist).register(anne)
+ self._command = Confirm()
+ # Clear the virgin queue.
+ get_queue_messages('virgin')
+
+ def test_welcome_message(self):
+ # A confirmation causes a welcome message to be sent to the member, if
+ # enabled by the mailing list.
+ status = self._command.process(
+ self._mlist, Message(), {}, (self._token,), Results())
+ self.assertEqual(status, ContinueProcessing.yes)
+ # There should be one messages in the queue; the welcome message.
+ items = get_queue_messages('virgin', expected_count=1)
+ # Grab the welcome message.
+ welcome = items[0].msg
+ self.assertEqual(welcome['subject'],
+ 'Welcome to the "Test" mailing list')
+ self.assertEqual(welcome['to'], 'Anne Person <anne@example.com>')
+
+ def test_no_welcome_message(self):
+ # When configured not to send a welcome message, none is sent.
+ self._mlist.send_welcome_message = False
+ status = self._command.process(
+ self._mlist, Message(), {}, (self._token,), Results())
+ self.assertEqual(status, ContinueProcessing.yes)
+ # There will be no messages in the queue.
+ get_queue_messages('virgin', expected_count=0)
+
+
+class TestConfirmLeave(unittest.TestCase):
+ """Test the `confirm` command when leaving a mailing list."""
+
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('test@example.com')
+ anne = subscribe(self._mlist, 'Anne', email='anne@example.com')
+ self._token, token_owner, member = ISubscriptionManager(
+ self._mlist).unregister(anne.address)
+
+ def test_confirm_leave(self):
+ msg = mfs("""\
+From: Anne Person <anne@example.com>
+To: test-confirm+{token}@example.com
+Subject: Re: confirm {token}
+
+""".format(token=self._token))
+ Confirm().process(self._mlist, msg, {}, (self._token,), Results())
+ # Anne is no longer a member of the mailing list.
+ member = self._mlist.members.get_member('anne@example.com')
+ self.assertIsNone(member)
+
+
+class TestEmailResponses(unittest.TestCase):
+ """Test the `confirm` command through the command runner."""
+
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('test@example.com')
+
+ def test_confirm_then_moderate_workflow(self):
+ # Issue #114 describes a problem when confirming the moderation email.
+ self._mlist.subscription_policy = (
+ SubscriptionPolicy.confirm_then_moderate)
+ bart = getUtility(IUserManager).create_address(
+ 'bart@example.com', 'Bart Person')
+ # Clear any previously queued confirmation messages.
+ get_queue_messages('virgin')
+ self._token, token_owner, member = ISubscriptionManager(
+ self._mlist).register(bart)
+ # There should now be one email message in the virgin queue, i.e. the
+ # confirmation message sent to Bart.
+ items = get_queue_messages('virgin', expected_count=1)
+ msg = items[0].msg
+ # Confirmations come first, so this one goes to the subscriber.
+ self.assertEqual(msg['to'], 'bart@example.com')
+ confirm, token = str(msg['subject']).split()
+ self.assertEqual(confirm, 'confirm')
+ self.assertEqual(token, self._token)
+ # Craft a confirmation response with the expected tokens.
+ user_response = Message()
+ user_response['From'] = 'bart@example.com'
+ user_response['To'] = 'test-confirm+{}@example.com'.format(token)
+ user_response['Subject'] = 'Re: confirm {}'.format(token)
+ user_response.set_payload('')
+ # Process the message through the command runner.
+ config.switchboards['command'].enqueue(
+ user_response, listid='test.example.com')
+ make_testable_runner(CommandRunner, 'command').run()
+ # There are now two messages in the virgin queue. One is going to the
+ # subscriber containing the results of their confirmation message, and
+ # the other is to the moderators informing them that they need to
+ # handle the moderation queue.
+ items = get_queue_messages('virgin', expected_count=2)
+ if items[0].msg['to'] == 'bart@example.com':
+ results = items[0].msg
+ moderator_msg = items[1].msg
+ else:
+ results = items[1].msg
+ moderator_msg = items[0].msg
+ # Check the moderator message first.
+ self.assertEqual(moderator_msg['to'], 'test-owner@example.com')
+ self.assertEqual(
+ moderator_msg['subject'],
+ 'New subscription request to Test from bart@example.com')
+ lines = moderator_msg.get_payload().splitlines()
+ self.assertEqual(
+ lines[-2].strip(),
+ 'For: Bart Person <bart@example.com>')
+ self.assertEqual(lines[-1].strip(), 'List: test@example.com')
+ # Now check the results message.
+ self.assertEqual(
+ str(results['subject']), 'The results of your email commands')
+ self.assertMultiLineEqual(results.get_payload(), """\
+The results of your email command are provided below.
+
+- Original message details:
+From: bart@example.com
+Subject: Re: confirm {}
+Date: n/a
+Message-ID: n/a
+
+- Results:
+Confirmed
+
+- Done.
+""".format(token))