summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBarry Warsaw2011-04-17 18:52:15 -0400
committerBarry Warsaw2011-04-17 18:52:15 -0400
commitc0c2ae64dd48f95a57669395c315e84c992fc332 (patch)
tree1f8fd1dbb07c324ea3fb5718e4bb5efa08cd90a7 /src
parentc2130f46808b3cf3cc27311d6d6f6b608e76b267 (diff)
downloadmailman-c0c2ae64dd48f95a57669395c315e84c992fc332.tar.gz
mailman-c0c2ae64dd48f95a57669395c315e84c992fc332.tar.zst
mailman-c0c2ae64dd48f95a57669395c315e84c992fc332.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/model/roster.py7
-rw-r--r--src/mailman/model/tests/__init__.py0
-rw-r--r--src/mailman/model/tests/test_user.py82
3 files changed, 86 insertions, 3 deletions
diff --git a/src/mailman/model/roster.py b/src/mailman/model/roster.py
index f3a71ee5e..c36af108f 100644
--- a/src/mailman/model/roster.py
+++ b/src/mailman/model/roster.py
@@ -259,9 +259,10 @@ class Memberships:
"""See `IRoster`."""
results = config.db.store.find(
Member,
- Address.user_id == self._user.id,
- Member.address_id == Address.id)
- for member in results:
+ Or(Member.user_id == self._user.id,
+ And(Address.user_id == self._user.id,
+ Member.address_id == Address.id)))
+ for member in results.config(distinct=True):
yield member
@property
diff --git a/src/mailman/model/tests/__init__.py b/src/mailman/model/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/src/mailman/model/tests/__init__.py
diff --git a/src/mailman/model/tests/test_user.py b/src/mailman/model/tests/test_user.py
new file mode 100644
index 000000000..6bac37e41
--- /dev/null
+++ b/src/mailman/model/tests/test_user.py
@@ -0,0 +1,82 @@
+# Copyright (C) 2011 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 users."""
+
+from __future__ import absolute_import, unicode_literals
+
+__metaclass__ = type
+__all__ = [
+ 'test_suite',
+ ]
+
+
+import unittest
+
+from mailman.app.lifecycle import create_list
+from mailman.interfaces.usermanager import IUserManager
+from mailman.testing.layers import ConfigLayer
+from mailman.utilities.datetime import now
+
+from zope.component import getUtility
+
+
+
+class TestUser(unittest.TestCase):
+ layer = ConfigLayer
+
+ def setUp(self):
+ self._mlist = create_list('test@example.com')
+ self._anne = getUtility(IUserManager).create_user(
+ 'anne@example.com', 'Anne Person')
+ preferred = list(self._anne.addresses)[0]
+ preferred.verified_on = now()
+ self._anne.preferred_address = preferred
+
+ def test_preferred_address_memberships(self):
+ self._mlist.subscribe(self._anne)
+ memberships = list(self._anne.memberships.members)
+ self.assertEqual(len(memberships), 1)
+ self.assertEqual(memberships[0].address.email, 'anne@example.com')
+ self.assertEqual(memberships[0].user, self._anne)
+ addresses = list(self._anne.memberships.addresses)
+ self.assertEqual(len(addresses), 1)
+ self.assertEqual(addresses[0].email, 'anne@example.com')
+
+ def test_preferred_and_address_memberships(self):
+ self._mlist.subscribe(self._anne)
+ aperson = self._anne.register('aperson@example.com')
+ self._mlist.subscribe(aperson)
+ memberships = list(self._anne.memberships.members)
+ self.assertEqual(len(memberships), 2)
+ self.assertEqual(set(member.address.email for member in memberships),
+ set(['anne@example.com', 'aperson@example.com']))
+ self.assertEqual(memberships[0].user, memberships[1].user)
+ self.assertEqual(memberships[0].user, self._anne)
+ emails = set(address.email
+ for address in self._anne.memberships.addresses)
+ self.assertEqual(len(emails), 2)
+ self.assertEqual(emails,
+ set(['anne@example.com', 'aperson@example.com']))
+
+
+
+def test_suite():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(TestUser))
+ return suite
+