# Copyright (C) 2001-2018 by the Free Software Foundation, Inc. # # This program 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 2 # of the License, or (at your option) any later version. # # This program 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 this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. """Unit tests for OldStyleMemberships. """ import os import time import unittest try: from Mailman import __init__ except ImportError: import paths from Mailman import mm_cfg from Mailman import Utils from Mailman import MailList from Mailman import MemberAdaptor from Mailman.Errors import NotAMemberError from Mailman.UserDesc import UserDesc from TestBase import TestBase class TestNoMembers(TestBase): def test_no_member(self): eq = self.assertEqual raises = self.assertRaises mlist = self._mlist eq(mlist.getMembers(), []) eq(mlist.getRegularMemberKeys(), []) eq(mlist.getDigestMemberKeys(), []) self.failIf(mlist.isMember('nobody@dom.ain')) raises(NotAMemberError, mlist.getMemberKey, 'nobody@dom.ain') raises(NotAMemberError, mlist.getMemberCPAddress, 'nobody@dom.ain') eq(mlist.getMemberCPAddresses(('nobody@dom.ain', 'noperson@dom.ain')), [None, None]) raises(NotAMemberError, mlist.getMemberPassword, 'nobody@dom.ain') raises(NotAMemberError, mlist.authenticateMember, 'nobody@dom.ain', 'blarg') eq(mlist.getMemberLanguage('nobody@dom.ain'), mlist.preferred_language) raises(NotAMemberError, mlist.getMemberOption, 'nobody@dom.ain', mm_cfg.AcknowledgePosts) raises(NotAMemberError, mlist.getMemberName, 'nobody@dom.ain') raises(NotAMemberError, mlist.getMemberTopics, 'nobody@dom.ain') raises(NotAMemberError, mlist.removeMember, 'nobody@dom.ain') def test_add_member_mixed_case(self): eq = self.assertEqual mlist = self._mlist mlist.addNewMember('APerson@dom.AIN') eq(mlist.getMembers(), ['aperson@dom.ain']) eq(mlist.getRegularMemberKeys(), ['aperson@dom.ain']) self.failUnless(mlist.isMember('APerson@dom.AIN')) self.failUnless(mlist.isMember('aperson@dom.ain')) self.failUnless(mlist.isMember('APERSON@DOM.AIN')) eq(mlist.getMemberCPAddress('aperson@dom.ain'), 'APerson@dom.AIN') eq(mlist.getMemberCPAddress('APerson@dom.ain'), 'APerson@dom.AIN') eq(mlist.getMemberCPAddress('APERSON@DOM.AIN'), 'APerson@dom.AIN') eq(mlist.getMemberCPAddresses(('aperson@dom.ain',)), ['APerson@dom.AIN']) eq(mlist.getMemberCPAddresses(('APerson@dom.ain',)), ['APerson@dom.AIN']) eq(mlist.getMemberCPAddresses(('APERSON@DOM.AIN',)), ['APerson@dom.AIN']) class TestMembers(TestBase): def setUp(self): TestBase.setUp(self) self._mlist.addNewMember('person@dom.ain', digest=0, password='xxXXxx', language='xx', realname='A. Nice Person') def test_add_member(self): eq = self.assertEqual mlist = self._mlist eq(mlist.getMembers(), ['person@dom.ain']) eq(mlist.getRegularMemberKeys(), ['person@dom.ain']) eq(mlist.getDigestMemberKeys(), []) self.failUnless(mlist.isMember('person@dom.ain')) eq(mlist.getMemberKey('person@dom.ain'), 'person@dom.ain') eq(mlist.getMemberCPAddress('person@dom.ain'), 'person@dom.ain') eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')), ['person@dom.ain', None]) eq(mlist.getMemberPassword('person@dom.ain'), 'xxXXxx') eq(mlist.getMemberLanguage('person@dom.ain'), 'en') eq(mlist.getMemberOption('person@dom.ain', mm_cfg.Digests), 0) eq(mlist.getMemberOption('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(mlist.getMemberName('person@dom.ain'), 'A. Nice Person') eq(mlist.getMemberTopics('person@dom.ain'), []) def test_authentication(self): mlist = self._mlist self.failIf(mlist.authenticateMember('person@dom.ain', 'xxx')) self.assertEqual(mlist.authenticateMember('person@dom.ain', 'xxXXxx'), 'xxXXxx') def test_remove_member(self): eq = self.assertEqual raises = self.assertRaises mlist = self._mlist mlist.removeMember('person@dom.ain') eq(mlist.getMembers(), []) eq(mlist.getRegularMemberKeys(), []) eq(mlist.getDigestMemberKeys(), []) self.failIf(mlist.isMember('person@dom.ain')) raises(NotAMemberError, mlist.getMemberKey, 'person@dom.ain') raises(NotAMemberError, mlist.getMemberCPAddress, 'person@dom.ain') eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')), [None, None]) raises(NotAMemberError, mlist.getMemberPassword, 'person@dom.ain') raises(NotAMemberError, mlist.authenticateMember, 'person@dom.ain', 'blarg') eq(mlist.getMemberLanguage('person@dom.ain'), mlist.preferred_language) raises(NotAMemberError, mlist.getMemberOption, 'person@dom.ain', mm_cfg.AcknowledgePosts) raises(NotAMemberError, mlist.getMemberName, 'person@dom.ain') raises(NotAMemberError, mlist.getMemberTopics, 'person@dom.ain') def test_remove_member_clears(self): eq = self.assertEqual raises = self.assertRaises # We don't really care what the bounce info is class Info: pass info = Info() mlist = self._mlist mlist.setBounceInfo('person@dom.ain', info) mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYADMIN) mlist.removeMember('person@dom.ain') raises(NotAMemberError, mlist.getDeliveryStatus, 'person@dom.ain') raises(NotAMemberError, mlist.getDeliveryStatusChangeTime, 'person@dom.ain') raises(NotAMemberError, mlist.getBounceInfo, 'person@dom.ain') eq(mlist.getDeliveryStatusMembers(), []) eq(mlist.getBouncingMembers(), []) def test_change_address(self): eq = self.assertEqual raises = self.assertRaises mlist = self._mlist mlist.changeMemberAddress('person@dom.ain', 'nice@dom.ain') # Check the new address eq(mlist.getMembers(), ['nice@dom.ain']) eq(mlist.getRegularMemberKeys(), ['nice@dom.ain']) eq(mlist.getDigestMemberKeys(), []) self.failUnless(mlist.isMember('nice@dom.ain')) eq(mlist.getMemberKey('nice@dom.ain'), 'nice@dom.ain') eq(mlist.getMemberCPAddress('nice@dom.ain'), 'nice@dom.ain') eq(mlist.getMemberCPAddresses(('nice@dom.ain', 'nonice@dom.ain')), ['nice@dom.ain', None]) eq(mlist.getMemberPassword('nice@dom.ain'), 'xxXXxx') eq(mlist.getMemberLanguage('nice@dom.ain'), 'en') eq(mlist.getMemberOption('nice@dom.ain', mm_cfg.Digests), 0) eq(mlist.getMemberOption('nice@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(mlist.getMemberName('nice@dom.ain'), 'A. Nice Person') eq(mlist.getMemberTopics('nice@dom.ain'), []) # Check the old address eq(mlist.getMembers(), ['nice@dom.ain']) eq(mlist.getRegularMemberKeys(), ['nice@dom.ain']) eq(mlist.getDigestMemberKeys(), []) self.failIf(mlist.isMember('person@dom.ain')) raises(NotAMemberError, mlist.getMemberKey, 'person@dom.ain') raises(NotAMemberError, mlist.getMemberCPAddress, 'person@dom.ain') eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')), [None, None]) raises(NotAMemberError, mlist.getMemberPassword, 'person@dom.ain') raises(NotAMemberError, mlist.authenticateMember, 'person@dom.ain', 'blarg') eq(mlist.getMemberLanguage('person@dom.ain'), mlist.preferred_language) raises(NotAMemberError, mlist.getMemberOption, 'person@dom.ain', mm_cfg.AcknowledgePosts) raises(NotAMemberError, mlist.getMemberName, 'person@dom.ain') raises(NotAMemberError, mlist.getMemberTopics, 'person@dom.ain') def test_set_password(self): eq = self.assertEqual mlist = self._mlist mlist.setMemberPassword('person@dom.ain', 'yyYYyy') eq(mlist.getMemberPassword('person@dom.ain'), 'yyYYyy') eq(mlist.authenticateMember('person@dom.ain', 'yyYYyy'), 'yyYYyy') self.failIf(mlist.authenticateMember('person@dom.ain', 'xxXXxx')) def test_set_language(self): self._mlist.available_languages.append('xx') mm_cfg.LC_DESCRIPTIONS.setdefault('xx', 0) self._mlist.setMemberLanguage('person@dom.ain', 'xx') self.assertEqual(self._mlist.getMemberLanguage('person@dom.ain'), 'xx') def test_basic_option(self): eq = self.assertEqual gmo = self._mlist.getMemberOption # First test the current option values eq(gmo('person@dom.ain', mm_cfg.Digests), 0) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0) def test_set_digests(self): eq = self.assertEqual gmo = self._mlist.getMemberOption self._mlist.setMemberOption('person@dom.ain', mm_cfg.Digests, 1) eq(gmo('person@dom.ain', mm_cfg.Digests), 1) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0) def test_set_disable_delivery(self): eq = self.assertEqual gds = self._mlist.getDeliveryStatus eq(gds('person@dom.ain'), MemberAdaptor.ENABLED) self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.UNKNOWN) eq(gds('person@dom.ain'), MemberAdaptor.UNKNOWN) self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYUSER) eq(gds('person@dom.ain'), MemberAdaptor.BYUSER) self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYBOUNCE) eq(gds('person@dom.ain'), MemberAdaptor.BYBOUNCE) self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYADMIN) eq(gds('person@dom.ain'), MemberAdaptor.BYADMIN) def test_delivery_status_time(self): now = time.time() time.sleep(1) self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.BYUSER) self.failUnless( self._mlist.getDeliveryStatusChangeTime('person@dom.ain') > now) self._mlist.setDeliveryStatus('person@dom.ain', MemberAdaptor.ENABLED) self.assertEqual( self._mlist.getDeliveryStatusChangeTime('person@dom.ain'), 0) def test_set_dont_receive_own_posts(self): eq = self.assertEqual gmo = self._mlist.getMemberOption self._mlist.setMemberOption('person@dom.ain', mm_cfg.DontReceiveOwnPosts, 1) eq(gmo('person@dom.ain', mm_cfg.Digests), 0) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 1) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0) def test_set_acknowledge_posts(self): eq = self.assertEqual gmo = self._mlist.getMemberOption self._mlist.setMemberOption('person@dom.ain', mm_cfg.AcknowledgePosts, 1) eq(gmo('person@dom.ain', mm_cfg.Digests), 0) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 1) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0) def test_disable_mime(self): eq = self.assertEqual gmo = self._mlist.getMemberOption self._mlist.setMemberOption('person@dom.ain', mm_cfg.DisableMime, 1) eq(gmo('person@dom.ain', mm_cfg.Digests), 0) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 1) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0) def test_conceal_subscription(self): eq = self.assertEqual gmo = self._mlist.getMemberOption self._mlist.setMemberOption('person@dom.ain', mm_cfg.ConcealSubscription, 1) eq(gmo('person@dom.ain', mm_cfg.Digests), 0) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 1) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0) def test_suppress_password_reminder(self): eq = self.assertEqual gmo = self._mlist.getMemberOption self._mlist.setMemberOption('person@dom.ain', mm_cfg.SuppressPasswordReminder, 1) eq(gmo('person@dom.ain', mm_cfg.Digests), 0) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 1) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 0) def test_receive_nonmatching_topics(self): eq = self.assertEqual gmo = self._mlist.getMemberOption self._mlist.setMemberOption('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics, 1) eq(gmo('person@dom.ain', mm_cfg.Digests), 0) eq(gmo('person@dom.ain', mm_cfg.DontReceiveOwnPosts), 0) eq(gmo('person@dom.ain', mm_cfg.AcknowledgePosts), 0) eq(gmo('person@dom.ain', mm_cfg.DisableMime), 0) eq(gmo('person@dom.ain', mm_cfg.ConcealSubscription), 0) eq(gmo('person@dom.ain', mm_cfg.SuppressPasswordReminder), 0) eq(gmo('person@dom.ain', mm_cfg.ReceiveNonmatchingTopics), 1) def test_member_name(self): self._mlist.setMemberName('person@dom.ain', 'A. Good Person') self.assertEqual(self._mlist.getMemberName('person@dom.ain'), 'A. Good Person') def test_member_topics(self): eq = self.assertEqual mlist = self._mlist mlist.setMemberTopics('person@dom.ain', ['topic1', 'topic2', 'topic3']) eq(mlist.getMemberTopics('person@dom.ain'), ['topic1', 'topic2', 'topic3']) mlist.setMemberTopics('person@dom.ain', None) eq(mlist.getMemberTopics('person@dom.ain'), []) def test_bounce_info(self): eq = self.assertEqual mlist = self._mlist # We don't really care what info is stored class Info: pass info = Info() # Test setting and getting mlist.setBounceInfo('person@dom.ain', info) eq(mlist.getBounceInfo('person@dom.ain'), info) # Test case sensitivity eq(mlist.getBounceInfo('PERSON@dom.ain'), info) info2 = Info() mlist.setBounceInfo('PeRsOn@dom.ain', info2) eq(mlist.getBounceInfo('person@dom.ain'), info2) eq(mlist.getBounceInfo('PeRsOn@dom.ain'), info2) eq(mlist.getBounceInfo('PERSON@DOM.AIN'), info2) # Test getBouncingMembers... eq(mlist.getBouncingMembers(), ['person@dom.ain']) # Test clearing bounce information... mlist.setBounceInfo('person@dom.ain', None) eq(mlist.getBouncingMembers(), []) eq(mlist.getBounceInfo('person@dom.ain'), None) # Make sure that you can clear the attributes case insensitively mlist.setBounceInfo('person@dom.ain', info) mlist.setBounceInfo('PERSON@dom.ain', None) eq(mlist.getBouncingMembers(), []) def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(TestNoMembers)) suite.addTest(unittest.makeSuite(TestMembers)) return suite if __name__ == '__main__': unittest.main(defaultTest='suite')