PageRenderTime 44ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/src/mailman/model/tests/test_subscriptions.py

https://gitlab.com/jdfandino10/mailman
Python | 246 lines | 176 code | 20 blank | 50 comment | 2 complexity | 3d22e1b6a1aea43fc048fd7bec38036e MD5 | raw file
  1. # Copyright (C) 2016 by the Free Software Foundation, Inc.
  2. #
  3. # This file is part of GNU Mailman.
  4. #
  5. # GNU Mailman is free software: you can redistribute it and/or modify it under
  6. # the terms of the GNU General Public License as published by the Free
  7. # Software Foundation, either version 3 of the License, or (at your option)
  8. # any later version.
  9. #
  10. # GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
  11. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. # more details.
  14. #
  15. # You should have received a copy of the GNU General Public License along with
  16. # GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
  17. """Test the subscription service."""
  18. __all__ = [
  19. 'TestSubscriptionService',
  20. ]
  21. import unittest
  22. from mailman.app.lifecycle import create_list
  23. from mailman.interfaces.listmanager import NoSuchListError
  24. from mailman.interfaces.member import MemberRole
  25. from mailman.interfaces.subscriptions import (
  26. ISubscriptionService, TooManyMembersError)
  27. from mailman.interfaces.usermanager import IUserManager
  28. from mailman.testing.helpers import set_preferred, subscribe
  29. from mailman.testing.layers import ConfigLayer
  30. from mailman.utilities.datetime import now
  31. from zope.component import getUtility
  32. class TestSubscriptionService(unittest.TestCase):
  33. layer = ConfigLayer
  34. def setUp(self):
  35. self._mlist = create_list('test@example.com')
  36. self._mlist.admin_immed_notify = False
  37. self._user_manager = getUtility(IUserManager)
  38. self._service = getUtility(ISubscriptionService)
  39. def test_find_member_address_no_user(self):
  40. # Find address-based memberships when no user is linked to the address.
  41. address = self._user_manager.create_address(
  42. 'anne@example.com', 'Anne Address')
  43. self._mlist.subscribe(address)
  44. members = self._service.find_members('anne@example.com')
  45. self.assertEqual(len(members), 1)
  46. self.assertEqual(members[0].address, address)
  47. def test_find_member_address_with_user(self):
  48. # Find address-based memberships when a user is linked to the address.
  49. user = self._user_manager.create_user(
  50. 'anne@example.com', 'Anne User')
  51. address = set_preferred(user)
  52. # Subscribe the address.
  53. self._mlist.subscribe(address)
  54. members = self._service.find_members('anne@example.com')
  55. self.assertEqual(len(members), 1)
  56. self.assertEqual(members[0].user, user)
  57. def test_find_member_user(self):
  58. # Find user-based memberships by address.
  59. user = self._user_manager.create_user(
  60. 'anne@example.com', 'Anne User')
  61. set_preferred(user)
  62. # Subscribe the user.
  63. self._mlist.subscribe(user)
  64. members = self._service.find_members('anne@example.com')
  65. self.assertEqual(len(members), 1)
  66. self.assertEqual(members[0].user, user)
  67. def test_find_member_user_secondary_address(self):
  68. # Find user-based memberships using a secondary address.
  69. user = self._user_manager.create_user(
  70. 'anne@example.com', 'Anne User')
  71. set_preferred(user)
  72. # Create a secondary address.
  73. address_2 = self._user_manager.create_address(
  74. 'anne2@example.com', 'Anne User 2')
  75. address_2.user = user
  76. # Subscribe the user.
  77. self._mlist.subscribe(user)
  78. # Search for the secondary address.
  79. members = self._service.find_members('anne2@example.com')
  80. self.assertEqual(len(members), 1)
  81. self.assertEqual(members[0].user, user)
  82. def test_wont_find_member_secondary_address(self):
  83. # A user is subscribed with one of their address, and a search is
  84. # performed on another of their addresses. This is not supported; the
  85. # subscription is not returned.
  86. user = self._user_manager.create_user(
  87. 'anne@example.com', 'Anne User')
  88. set_preferred(user)
  89. # Create a secondary address.
  90. address_2 = self._user_manager.create_address(
  91. 'anne2@example.com', 'Anne User 2')
  92. address_2.verified_on = now()
  93. address_2.user = user
  94. # Subscribe the secondary address.
  95. self._mlist.subscribe(address_2)
  96. # Search for the primary address.
  97. members = self._service.find_members('anne@example.com')
  98. self.assertEqual(len(members), 0)
  99. def test_find_member_user_id(self):
  100. # Find user-based memberships by user_id.
  101. user = self._user_manager.create_user(
  102. 'anne@example.com', 'Anne User')
  103. set_preferred(user)
  104. # Subscribe the user.
  105. self._mlist.subscribe(user)
  106. members = self._service.find_members(user.user_id)
  107. self.assertEqual(len(members), 1)
  108. self.assertEqual(members[0].user, user)
  109. def test_find_member_user_id_controlled_addresses(self):
  110. # Find address-based memberships by user_id when a secondary address is
  111. # subscribed.
  112. user = self._user_manager.create_user(
  113. 'anne@example.com', 'Anne User')
  114. set_preferred(user)
  115. # Create a secondary address.
  116. address_2 = self._user_manager.create_address(
  117. 'anne2@example.com', 'Anne User 2')
  118. address_2.verified_on = now()
  119. address_2.user = user
  120. # Create a third address.
  121. address_3 = self._user_manager.create_address(
  122. 'anne3@example.com', 'Anne User 3')
  123. address_3.verified_on = now()
  124. address_3.user = user
  125. # Subscribe the secondary address only.
  126. self._mlist.subscribe(address_2)
  127. members = self._service.find_members(user.user_id)
  128. self.assertEqual(len(members), 1)
  129. self.assertEqual(members[0].address, address_2)
  130. def test_find_member_sorting(self):
  131. # Check that the memberships are properly sorted.
  132. user = self._user_manager.create_user(
  133. 'anne1@example.com', 'Anne User')
  134. address = set_preferred(user)
  135. # Create a secondary address.
  136. address_2 = self._user_manager.create_address(
  137. 'anne2@example.com', 'Anne User 2')
  138. address_2.verified_on = now()
  139. address_2.user = user
  140. # Create a third address.
  141. address_3 = self._user_manager.create_address(
  142. 'anne3@example.com', 'Anne User 3')
  143. address_3.verified_on = now()
  144. address_3.user = user
  145. # Create three lists.
  146. mlist1 = create_list('test1@example.com')
  147. mlist1.admin_immed_notify = False
  148. mlist2 = create_list('test2@example.com')
  149. mlist2.admin_immed_notify = False
  150. mlist3 = create_list('test3@example.com')
  151. mlist3.admin_immed_notify = False
  152. # Subscribe the addresses in random order
  153. # https://www.xkcd.com/221/
  154. mlist3.subscribe(address_3, MemberRole.moderator)
  155. mlist3.subscribe(address_3, MemberRole.owner)
  156. mlist3.subscribe(address_3, MemberRole.member)
  157. mlist3.subscribe(address_2, MemberRole.member)
  158. mlist3.subscribe(address_2, MemberRole.owner)
  159. mlist3.subscribe(address_2, MemberRole.moderator)
  160. mlist3.subscribe(address, MemberRole.owner)
  161. mlist3.subscribe(address, MemberRole.member)
  162. mlist3.subscribe(address, MemberRole.moderator)
  163. mlist2.subscribe(address_2, MemberRole.moderator)
  164. mlist2.subscribe(address_2, MemberRole.member)
  165. mlist2.subscribe(address_2, MemberRole.owner)
  166. mlist2.subscribe(address_3, MemberRole.moderator)
  167. mlist2.subscribe(address_3, MemberRole.member)
  168. mlist2.subscribe(address_3, MemberRole.owner)
  169. mlist2.subscribe(address, MemberRole.owner)
  170. mlist2.subscribe(address, MemberRole.moderator)
  171. mlist2.subscribe(address, MemberRole.member)
  172. mlist1.subscribe(address_2, MemberRole.moderator)
  173. mlist1.subscribe(address, MemberRole.member)
  174. mlist1.subscribe(address_3, MemberRole.owner)
  175. # The results should be sorted first by list id, then by address, then
  176. # by member role.
  177. members = self._service.find_members(user.user_id)
  178. self.assertEqual(len(members), 21)
  179. self.assertListEqual(
  180. [(m.list_id.partition('.')[0],
  181. m.address.email.partition('@')[0],
  182. m.role)
  183. for m in members],
  184. [('test1', 'anne1', MemberRole.member),
  185. ('test1', 'anne2', MemberRole.moderator),
  186. ('test1', 'anne3', MemberRole.owner),
  187. ('test2', 'anne1', MemberRole.member),
  188. ('test2', 'anne1', MemberRole.owner),
  189. ('test2', 'anne1', MemberRole.moderator),
  190. ('test2', 'anne2', MemberRole.member),
  191. ('test2', 'anne2', MemberRole.owner),
  192. ('test2', 'anne2', MemberRole.moderator),
  193. ('test2', 'anne3', MemberRole.member),
  194. ('test2', 'anne3', MemberRole.owner),
  195. ('test2', 'anne3', MemberRole.moderator),
  196. ('test3', 'anne1', MemberRole.member),
  197. ('test3', 'anne1', MemberRole.owner),
  198. ('test3', 'anne1', MemberRole.moderator),
  199. ('test3', 'anne2', MemberRole.member),
  200. ('test3', 'anne2', MemberRole.owner),
  201. ('test3', 'anne2', MemberRole.moderator),
  202. ('test3', 'anne3', MemberRole.member),
  203. ('test3', 'anne3', MemberRole.owner),
  204. ('test3', 'anne3', MemberRole.moderator),
  205. ])
  206. def test_find_no_members(self):
  207. members = self._service.find_members()
  208. self.assertEqual(len(members), 0)
  209. def test_find_members_no_results(self):
  210. members = self._service.find_members('zack@example.com')
  211. self.assertEqual(len(members), 0)
  212. self.assertEqual(list(members), [])
  213. def test_find_member_error(self):
  214. # .find_member() can only return zero or one memberships. Anything
  215. # else is an error.
  216. subscribe(self._mlist, 'Anne')
  217. subscribe(self._mlist, 'Anne', MemberRole.owner)
  218. with self.assertRaises(TooManyMembersError) as cm:
  219. self._service.find_member('aperson@example.com')
  220. self.assertEqual(cm.exception.subscriber, 'aperson@example.com')
  221. self.assertEqual(cm.exception.list_id, None)
  222. self.assertEqual(cm.exception.role, None)
  223. def test_leave_no_such_list(self):
  224. # Trying to leave a nonexistent list raises an exception.
  225. self.assertRaises(NoSuchListError, self._service.leave,
  226. 'bogus.example.com', 'anne@example.com')