PageRenderTime 52ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/postorius/tests/mailman_api_tests/test_subscriptions.py

https://gitlab.com/mmhat/postorius
Python | 238 lines | 211 code | 6 blank | 21 comment | 0 complexity | 59172bb2329a46eea334a6e6916a57ff MD5 | raw file
  1. # -*- coding: utf-8 -*-
  2. # Copyright (C) 2012-2019 by the Free Software Foundation, Inc.
  3. #
  4. # This file is part of Postorius.
  5. #
  6. # Postorius is free software: you can redistribute it and/or modify it under
  7. # the terms of the GNU General Public License as published by the Free
  8. # Software Foundation, either version 3 of the License, or (at your option)
  9. # any later version.
  10. # Postorius 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. # Postorius. If not, see <http://www.gnu.org/licenses/>.
  17. from allauth.account.models import EmailAddress
  18. from django.contrib.auth.models import User
  19. from django.urls import reverse
  20. from mock import patch
  21. from postorius.tests.utils import ViewTestCase
  22. class TestSubscription(ViewTestCase):
  23. """Tests subscription to lists"""
  24. def setUp(self):
  25. super(TestSubscription, self).setUp()
  26. self.domain = self.mm_client.create_domain('example.com')
  27. self.open_list = self.domain.create_list('open_list')
  28. # Set subscription policy to open
  29. settings = self.open_list.settings
  30. settings['subscription_policy'] = 'open'
  31. settings.save()
  32. self.mod_list = self.domain.create_list('moderate_subs')
  33. # Set subscription policy to moderate
  34. settings = self.mod_list.settings
  35. settings['subscription_policy'] = 'moderate'
  36. settings.save()
  37. # Create django user.
  38. self.user = User.objects.create_user(
  39. 'testuser', 'test@example.com', 'pwd')
  40. EmailAddress.objects.create(
  41. user=self.user, email=self.user.email, verified=True)
  42. EmailAddress.objects.create(
  43. user=self.user, email='fritz@example.org', verified=True)
  44. # Create Mailman user
  45. self.mm_user = self.mm_client.create_user('test@example.com', '')
  46. self.mm_user.add_address('fritz@example.org')
  47. for address in self.mm_user.addresses:
  48. address.verify()
  49. @patch('mailmanclient.MailingList.subscribe')
  50. def test_anonymous_subscribe(self, mock_subscribe):
  51. response = self.client.post(
  52. reverse('list_anonymous_subscribe',
  53. args=('open_list.example.com', )),
  54. {'email': 'test@example.com'})
  55. mock_subscribe.assert_called_once()
  56. mock_subscribe.assert_called_with(
  57. 'test@example.com', pre_verified=False, pre_confirmed=False)
  58. self.assertRedirects(
  59. response, reverse('list_summary',
  60. args=('open_list.example.com', )))
  61. self.assertHasSuccessMessage(response)
  62. def test_subscribe_open(self):
  63. # The subscription goes straight through.
  64. self.client.login(username='testuser', password='pwd')
  65. response = self.client.post(
  66. reverse('list_subscribe', args=('open_list.example.com', )),
  67. {'email': 'test@example.com'})
  68. self.assertEqual(len(self.open_list.members), 1)
  69. self.assertEqual(len(self.open_list.requests), 0)
  70. self.assertRedirects(
  71. response, reverse('list_summary',
  72. args=('open_list.example.com', )))
  73. self.assertHasSuccessMessage(response)
  74. def test_secondary_open(self):
  75. # Subscribe with a secondary email address
  76. self.client.login(username='testuser', password='pwd')
  77. response = self.client.post(
  78. reverse('list_subscribe', args=('open_list.example.com', )),
  79. {'email': 'fritz@example.org'})
  80. self.assertEqual(len(self.open_list.members), 1)
  81. self.assertEqual(len(self.open_list.requests), 0)
  82. self.assertRedirects(
  83. response, reverse('list_summary',
  84. args=('open_list.example.com', )))
  85. self.assertHasSuccessMessage(response)
  86. def test_unknown_address(self):
  87. # Impossible to register with an unknown address
  88. self.client.login(username='testuser', password='pwd')
  89. response = self.client.post(
  90. reverse('list_subscribe', args=('open_list.example.com', )),
  91. {'email': 'unknown@example.org'})
  92. self.assertEqual(len(self.open_list.members), 0)
  93. self.assertEqual(len(self.open_list.requests), 0)
  94. self.assertRedirects(
  95. response, reverse('list_summary',
  96. args=('open_list.example.com', )))
  97. self.assertHasErrorMessage(response)
  98. def test_banned_address(self):
  99. # Impossible to register with a banned address
  100. self.client.login(username='testuser', password='pwd')
  101. self.open_list.bans.add('test@example.com')
  102. response = self.client.post(
  103. reverse('list_subscribe', args=('open_list.example.com', )),
  104. {'email': 'test@example.com'})
  105. self.assertEqual(len(self.open_list.members), 0)
  106. self.assertEqual(len(self.open_list.requests), 0)
  107. self.assertRedirects(
  108. response, reverse('list_summary',
  109. args=('open_list.example.com', )))
  110. self.assertHasErrorMessage(response)
  111. def test_subscribe_mod(self):
  112. # The subscription is held for approval.
  113. self.client.login(username='testuser', password='pwd')
  114. response = self.client.post(
  115. reverse('list_subscribe', args=('moderate_subs.example.com', )),
  116. {'email': 'test@example.com'})
  117. self.assertEqual(len(self.mod_list.members), 0)
  118. self.assertEqual(len(self.mod_list.requests), 1)
  119. self.assertRedirects(
  120. response, reverse('list_summary',
  121. args=('moderate_subs.example.com', )))
  122. self.assertHasSuccessMessage(response)
  123. def test_secondary_mod(self):
  124. # Subscribe with a secondary email address
  125. self.client.login(username='testuser', password='pwd')
  126. response = self.client.post(
  127. reverse('list_subscribe', args=('moderate_subs.example.com', )),
  128. {'email': 'fritz@example.org'})
  129. self.assertEqual(len(self.mod_list.members), 0)
  130. self.assertEqual(len(self.mod_list.requests), 1)
  131. self.assertRedirects(
  132. response, reverse('list_summary',
  133. args=('moderate_subs.example.com', )))
  134. self.assertHasSuccessMessage(response)
  135. def test_subscribe_already_pending(self):
  136. # The user tries to subscribe twice on a moderated list.
  137. self.client.login(username='testuser', password='pwd')
  138. response = self.client.post(
  139. reverse('list_subscribe', args=('moderate_subs.example.com', )),
  140. {'email': 'test@example.com'})
  141. self.assertEqual(len(self.mod_list.members), 0)
  142. self.assertEqual(len(self.mod_list.requests), 1)
  143. self.assertHasSuccessMessage(response)
  144. # Try to subscribe a second time.
  145. response = self.client.post(
  146. reverse('list_subscribe', args=('moderate_subs.example.com', )),
  147. {'email': 'test@example.com'})
  148. self.assertEqual(len(self.mod_list.members), 0)
  149. self.assertEqual(len(self.mod_list.requests), 1)
  150. message = self.assertHasErrorMessage(response)
  151. self.assertIn('Subscription request already pending', message)
  152. def test_subscribe_with_name(self):
  153. owner = User.objects.create_user(
  154. 'testowner', 'owner@example.com', 'pwd')
  155. EmailAddress.objects.create(
  156. user=owner, email=owner.email, verified=True)
  157. self.open_list.add_owner('owner@example.com')
  158. self.client.login(username='testowner', password='pwd')
  159. email_list = """First Person <test-1@example.org>\n
  160. "Second Person" <test-2@example.org>\n
  161. test-3@example.org (Third Person)\n
  162. test-4@example.org\n
  163. <test-5@example.org>\n"""
  164. self.client.post(
  165. reverse('mass_subscribe', args=('open_list.example.com',)),
  166. {'emails': email_list})
  167. self.assertEqual(len(self.open_list.members), 5)
  168. first = self.open_list.get_member('test-1@example.org')
  169. second = self.open_list.get_member('test-2@example.org')
  170. third = self.open_list.get_member('test-3@example.org')
  171. fourth = self.open_list.get_member('test-4@example.org')
  172. fifth = self.open_list.get_member('test-5@example.org')
  173. self.assertEqual(first.address.display_name, 'First Person')
  174. self.assertEqual(second.address.display_name, 'Second Person')
  175. self.assertEqual(third.address.display_name, 'Third Person')
  176. self.assertIsNone(fourth.address.display_name)
  177. self.assertIsNone(fifth.address.display_name)
  178. def test_change_subscription_open(self):
  179. # The subscription is changed from an address to another
  180. self.open_list.subscribe('test@example.com')
  181. self.assertEqual(len(self.open_list.members), 1)
  182. self.assertEqual(len(self.open_list.requests), 0)
  183. self.client.login(username='testuser', password='pwd')
  184. response = self.client.post(
  185. reverse('change_subscription', args=['open_list.example.com']),
  186. {'email': 'fritz@example.org'})
  187. self.assertHasSuccessMessage(response)
  188. self.assertEqual(len(self.open_list.members), 1)
  189. self.assertEqual(len(self.open_list.requests), 0)
  190. try:
  191. member = self.open_list.get_member('fritz@example.org')
  192. except ValueError:
  193. self.fail('The subscription was not changed')
  194. self.assertEqual(member.email, 'fritz@example.org')
  195. self.assertRedirects(
  196. response, reverse('list_summary',
  197. args=('open_list.example.com', )))
  198. def test_change_subscription_confirm(self):
  199. # The subscription is changed from an address to another
  200. confirm_list = self.domain.create_list('confirm_list')
  201. settings = confirm_list.settings
  202. settings['subscription_policy'] = 'confirm'
  203. settings.save()
  204. confirm_list.subscribe('test@example.com', pre_confirmed=True)
  205. self.assertEqual(len(confirm_list.members), 1)
  206. self.assertEqual(len(confirm_list.requests), 0)
  207. self.client.login(username='testuser', password='pwd')
  208. response = self.client.post(
  209. reverse('change_subscription', args=['confirm_list.example.com']),
  210. {'email': 'fritz@example.org'})
  211. self.assertHasSuccessMessage(response)
  212. self.assertEqual(len(confirm_list.members), 1)
  213. self.assertEqual(len(confirm_list.requests), 0)
  214. try:
  215. member = confirm_list.get_member('fritz@example.org')
  216. except ValueError:
  217. self.fail('The subscription was not changed')
  218. self.assertEqual(member.email, 'fritz@example.org')
  219. self.assertRedirects(
  220. response, reverse('list_summary',
  221. args=('confirm_list.example.com', )))