# Copyright (C) 2012-2016 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 . """Test the `confirm` command.""" __all__ = [ 'TestConfirm', 'TestEmailResponses', ] 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.registrar import IRegistrar from mailman.interfaces.usermanager import IUserManager from mailman.runners.command import CommandRunner, Results from mailman.testing.helpers import get_queue_messages, make_testable_runner from mailman.testing.layers import ConfigLayer from zope.component import getUtility class TestConfirm(unittest.TestCase): """Test the `confirm` command.""" 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 = IRegistrar(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. messages = get_queue_messages('virgin') self.assertEqual(len(messages), 1) # Grab the welcome message. welcome = messages[0].msg self.assertEqual(welcome['subject'], 'Welcome to the "Test" mailing list') self.assertEqual(welcome['to'], 'Anne Person ') 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. messages = get_queue_messages('virgin') self.assertEqual(len(messages), 0) 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 = IRegistrar(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') self.assertEqual(len(items), 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') self.assertEqual(len(items), 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 ') 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))