summaryrefslogtreecommitdiff
path: root/src/mailman/model/tests
diff options
context:
space:
mode:
authorBarry Warsaw2015-04-15 10:05:35 -0400
committerBarry Warsaw2015-04-15 10:05:35 -0400
commit67fd8d6dbcf8849b3c2f8cb42a10aed465ace76c (patch)
tree97eca0ae33c97015e4d2fca31e7792e2a929fa8d /src/mailman/model/tests
parent7317b94a0b746f0287ecbc5654ec544ce0112adb (diff)
parent3e7dffa750a3e7bb15ac10b711832696554ba03a (diff)
downloadmailman-67fd8d6dbcf8849b3c2f8cb42a10aed465ace76c.tar.gz
mailman-67fd8d6dbcf8849b3c2f8cb42a10aed465ace76c.tar.zst
mailman-67fd8d6dbcf8849b3c2f8cb42a10aed465ace76c.zip
Diffstat (limited to 'src/mailman/model/tests')
-rw-r--r--src/mailman/model/tests/test_registrar.py64
-rw-r--r--src/mailman/model/tests/test_roster.py52
-rw-r--r--src/mailman/model/tests/test_usermanager.py6
-rw-r--r--src/mailman/model/tests/test_workflow.py148
4 files changed, 205 insertions, 65 deletions
diff --git a/src/mailman/model/tests/test_registrar.py b/src/mailman/model/tests/test_registrar.py
deleted file mode 100644
index e6df7f0d1..000000000
--- a/src/mailman/model/tests/test_registrar.py
+++ /dev/null
@@ -1,64 +0,0 @@
-# Copyright (C) 2014-2015 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 `IRegistrar`."""
-
-__all__ = [
- 'TestRegistrar',
- ]
-
-
-import unittest
-
-from functools import partial
-from mailman.app.lifecycle import create_list
-from mailman.interfaces.address import InvalidEmailAddressError
-from mailman.interfaces.registrar import IRegistrar
-from mailman.testing.layers import ConfigLayer
-from zope.component import getUtility
-
-
-
-class TestRegistrar(unittest.TestCase):
- layer = ConfigLayer
-
- def setUp(self):
- mlist = create_list('test@example.com')
- self._register = partial(getUtility(IRegistrar).register, mlist)
-
- def test_invalid_empty_string(self):
- self.assertRaises(InvalidEmailAddressError, self._register, '')
-
- def test_invalid_space_in_name(self):
- self.assertRaises(InvalidEmailAddressError, self._register,
- 'some name@example.com')
-
- def test_invalid_funky_characters(self):
- self.assertRaises(InvalidEmailAddressError, self._register,
- '<script>@example.com')
-
- def test_invalid_nonascii(self):
- self.assertRaises(InvalidEmailAddressError, self._register,
- '\xa0@example.com')
-
- def test_invalid_no_at_sign(self):
- self.assertRaises(InvalidEmailAddressError, self._register,
- 'noatsign')
-
- def test_invalid_no_domain(self):
- self.assertRaises(InvalidEmailAddressError, self._register,
- 'nodom@ain')
diff --git a/src/mailman/model/tests/test_roster.py b/src/mailman/model/tests/test_roster.py
index 44735cf4b..ca950cfc5 100644
--- a/src/mailman/model/tests/test_roster.py
+++ b/src/mailman/model/tests/test_roster.py
@@ -26,7 +26,9 @@ __all__ = [
import unittest
from mailman.app.lifecycle import create_list
+from mailman.interfaces.address import IAddress
from mailman.interfaces.member import DeliveryMode, MemberRole
+from mailman.interfaces.user import IUser
from mailman.interfaces.usermanager import IUserManager
from mailman.testing.layers import ConfigLayer
from mailman.utilities.datetime import now
@@ -136,7 +138,8 @@ class TestMembershipsRoster(unittest.TestCase):
self._ant = create_list('ant@example.com')
self._bee = create_list('bee@example.com')
user_manager = getUtility(IUserManager)
- self._anne = user_manager.create_user('anne@example.com')
+ self._anne = user_manager.make_user(
+ 'anne@example.com', 'Anne Person')
preferred = list(self._anne.addresses)[0]
preferred.verified_on = now()
self._anne.preferred_address = preferred
@@ -144,9 +147,56 @@ class TestMembershipsRoster(unittest.TestCase):
def test_no_memberships(self):
# An unsubscribed user has no memberships.
self.assertEqual(self._anne.memberships.member_count, 0)
+ self.assertIsNone(self._ant.members.get_member('anne@example.com'))
+ self.assertEqual(
+ self._ant.members.get_memberships('anne@example.com'),
+ [])
def test_subscriptions(self):
# Anne subscribes to a couple of mailing lists.
self._ant.subscribe(self._anne)
self._bee.subscribe(self._anne)
self.assertEqual(self._anne.memberships.member_count, 2)
+
+ def test_subscribed_as_user(self):
+ # Anne subscribes to a mailing list as a user and the member roster
+ # contains her membership.
+ self._ant.subscribe(self._anne)
+ self.assertEqual(
+ self._ant.members.get_member('anne@example.com').user,
+ self._anne)
+ memberships = self._ant.members.get_memberships('anne@example.com')
+ self.assertEqual(
+ [member.address.email for member in memberships],
+ ['anne@example.com'])
+
+ def test_subscribed_as_user_and_address(self):
+ # Anne subscribes to a mailing list twice, once as a user and once
+ # with an explicit address. She has two memberships.
+ self._ant.subscribe(self._anne)
+ self._ant.subscribe(self._anne.preferred_address)
+ self.assertEqual(self._anne.memberships.member_count, 2)
+ self.assertEqual(self._ant.members.member_count, 2)
+ self.assertEqual(
+ [member.address.email for member in self._ant.members.members],
+ ['anne@example.com', 'anne@example.com'])
+ # get_member() is defined to return the explicit address.
+ member = self._ant.members.get_member('anne@example.com')
+ subscriber = member.subscriber
+ self.assertTrue(IAddress.providedBy(subscriber))
+ self.assertFalse(IUser.providedBy(subscriber))
+ # get_memberships() returns them all.
+ memberships = self._ant.members.get_memberships('anne@example.com')
+ self.assertEqual(len(memberships), 2)
+ as_address = (memberships[0]
+ if IAddress.providedBy(memberships[0].subscriber)
+ else memberships[1])
+ as_user = (memberships[1]
+ if IUser.providedBy(memberships[1].subscriber)
+ else memberships[0])
+ self.assertEqual(as_address.subscriber, self._anne.preferred_address)
+ self.assertEqual(as_user.subscriber, self._anne)
+ # All the email addresses match.
+ self.assertEqual(
+ [record.address.email for record in memberships],
+ ['anne@example.com', 'anne@example.com'])
diff --git a/src/mailman/model/tests/test_usermanager.py b/src/mailman/model/tests/test_usermanager.py
index 31f1a7275..f4643f031 100644
--- a/src/mailman/model/tests/test_usermanager.py
+++ b/src/mailman/model/tests/test_usermanager.py
@@ -30,6 +30,7 @@ from mailman.testing.layers import ConfigLayer
from zope.component import getUtility
+
class TestUserManager(unittest.TestCase):
layer = ConfigLayer
@@ -80,3 +81,8 @@ class TestUserManager(unittest.TestCase):
user = self._usermanager.create_user('anne@example.com', 'Anne Person')
other_user = self._usermanager.make_user('anne@example.com')
self.assertIs(user, other_user)
+
+ def test_get_user_by_id(self):
+ original = self._usermanager.make_user('anne@example.com')
+ copy = self._usermanager.get_user_by_id(original.user_id)
+ self.assertEqual(original, copy)
diff --git a/src/mailman/model/tests/test_workflow.py b/src/mailman/model/tests/test_workflow.py
new file mode 100644
index 000000000..88ed506bd
--- /dev/null
+++ b/src/mailman/model/tests/test_workflow.py
@@ -0,0 +1,148 @@
+# Copyright (C) 2015 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 workflow model."""
+
+__all__ = [
+ 'TestWorkflow',
+ ]
+
+
+import unittest
+
+from mailman.interfaces.workflow import IWorkflowStateManager
+from mailman.testing.layers import ConfigLayer
+from zope.component import getUtility
+
+
+
+class TestWorkflow(unittest.TestCase):
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._manager = getUtility(IWorkflowStateManager)
+
+ def test_save_restore_workflow(self):
+ # Save and restore a workflow.
+ name = 'ant'
+ token = 'bee'
+ step = 'cat'
+ data = 'dog'
+ self._manager.save(name, token, step, data)
+ state = self._manager.restore(name, token)
+ self.assertEqual(state.name, name)
+ self.assertEqual(state.token, token)
+ self.assertEqual(state.step, step)
+ self.assertEqual(state.data, data)
+
+ def test_save_restore_workflow_without_step(self):
+ # Save and restore a workflow that contains no step.
+ name = 'ant'
+ token = 'bee'
+ data = 'dog'
+ self._manager.save(name, token, data=data)
+ state = self._manager.restore(name, token)
+ self.assertEqual(state.name, name)
+ self.assertEqual(state.token, token)
+ self.assertIsNone(state.step)
+ self.assertEqual(state.data, data)
+
+ def test_save_restore_workflow_without_data(self):
+ # Save and restore a workflow that contains no data.
+ name = 'ant'
+ token = 'bee'
+ step = 'cat'
+ self._manager.save(name, token, step)
+ state = self._manager.restore(name, token)
+ self.assertEqual(state.name, name)
+ self.assertEqual(state.token, token)
+ self.assertEqual(state.step, step)
+ self.assertIsNone(state.data)
+
+ def test_save_restore_workflow_without_step_or_data(self):
+ # Save and restore a workflow that contains no step or data.
+ name = 'ant'
+ token = 'bee'
+ self._manager.save(name, token)
+ state = self._manager.restore(name, token)
+ self.assertEqual(state.name, name)
+ self.assertEqual(state.token, token)
+ self.assertIsNone(state.step)
+ self.assertIsNone(state.data)
+
+ def test_restore_workflow_with_no_matching_name(self):
+ # Try to restore a workflow that has no matching name in the database.
+ name = 'ant'
+ token = 'bee'
+ self._manager.save(name, token)
+ state = self._manager.restore('ewe', token)
+ self.assertIsNone(state)
+
+ def test_restore_workflow_with_no_matching_token(self):
+ # Try to restore a workflow that has no matching token in the database.
+ name = 'ant'
+ token = 'bee'
+ self._manager.save(name, token)
+ state = self._manager.restore(name, 'fly')
+ self.assertIsNone(state)
+
+ def test_restore_workflow_with_no_matching_token_or_name(self):
+ # Try to restore a workflow that has no matching token or name in the
+ # database.
+ name = 'ant'
+ token = 'bee'
+ self._manager.save(name, token)
+ state = self._manager.restore('ewe', 'fly')
+ self.assertIsNone(state)
+
+ def test_restore_removes_record(self):
+ name = 'ant'
+ token = 'bee'
+ self.assertEqual(self._manager.count, 0)
+ self._manager.save(name, token)
+ self.assertEqual(self._manager.count, 1)
+ self._manager.restore(name, token)
+ self.assertEqual(self._manager.count, 0)
+
+ def test_save_after_restore(self):
+ name = 'ant'
+ token = 'bee'
+ self.assertEqual(self._manager.count, 0)
+ self._manager.save(name, token)
+ self.assertEqual(self._manager.count, 1)
+ self._manager.restore(name, token)
+ self.assertEqual(self._manager.count, 0)
+ self._manager.save(name, token)
+ self.assertEqual(self._manager.count, 1)
+
+ def test_discard(self):
+ # Discard some workflow state. This is use by IRegistrar.discard().
+ self._manager.save('ant', 'token', 'one')
+ self._manager.save('bee', 'token', 'two')
+ self._manager.save('ant', 'nekot', 'three')
+ self._manager.save('bee', 'nekot', 'four')
+ self.assertEqual(self._manager.count, 4)
+ self._manager.discard('bee', 'token')
+ self.assertEqual(self._manager.count, 3)
+ state = self._manager.restore('ant', 'token')
+ self.assertEqual(state.step, 'one')
+ state = self._manager.restore('bee', 'token')
+ self.assertIsNone(state)
+ state = self._manager.restore('ant', 'nekot')
+ self.assertEqual(state.step, 'three')
+ state = self._manager.restore('bee', 'nekot')
+ self.assertEqual(state.step, 'four')