test_users_api.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. from datetime import timedelta
  2. from django.contrib.auth import get_user_model
  3. from django.utils import timezone
  4. from misago.acl.testutils import override_acl
  5. from misago.conf import settings
  6. from misago.core import threadstore
  7. from misago.core.cache import cache
  8. from misago.forums.models import Forum
  9. from misago.threads.testutils import post_thread
  10. from misago.users.models import Online, Rank
  11. from misago.users.testutils import AuthenticatedUserTestCase
  12. class ActivePostersListTests(AuthenticatedUserTestCase):
  13. """
  14. tests for active posters list (GET /users/?list=active)
  15. """
  16. def setUp(self):
  17. super(ActivePostersListTests, self).setUp()
  18. self.link = '/api/users/?list=active'
  19. cache.clear()
  20. threadstore.clear()
  21. self.forum = Forum.objects.all_forums().filter(role="forum")[:1][0]
  22. self.forum.labels = []
  23. def test_empty_list(self):
  24. """empty list is served"""
  25. response = self.client.get(self.link)
  26. self.assertEqual(response.status_code, 200)
  27. self.assertNotIn(self.user.username, response.content)
  28. response = self.client.get(self.link)
  29. self.assertEqual(response.status_code, 200)
  30. self.assertNotIn(self.user.username, response.content)
  31. def test_filled_list(self):
  32. """filled list is served"""
  33. post_thread(self.forum, poster=self.user)
  34. self.user.posts = 1
  35. self.user.save()
  36. response = self.client.get(self.link)
  37. self.assertEqual(response.status_code, 200)
  38. self.assertIn(self.user.username, response.content)
  39. self.assertIn('"is_online":true', response.content)
  40. self.assertIn('"is_offline":false', response.content)
  41. self.logout_user()
  42. response = self.client.get(self.link)
  43. self.assertEqual(response.status_code, 200)
  44. self.assertIn(self.user.username, response.content)
  45. self.assertIn('"is_online":false', response.content)
  46. self.assertIn('"is_offline":true', response.content)
  47. class FollowersListTests(AuthenticatedUserTestCase):
  48. """
  49. tests for generic list (GET /users/) filtered by followers
  50. """
  51. def setUp(self):
  52. super(FollowersListTests, self).setUp()
  53. self.link = '/api/users/?&followers='
  54. def test_nonexistent_user(self):
  55. """list for non-existing user returns 404"""
  56. response = self.client.get(self.link + 'this-user-is-fake')
  57. self.assertEqual(response.status_code, 404)
  58. def test_empty_list(self):
  59. """user without followers returns 200"""
  60. rank_slug = self.user.rank.slug
  61. response = self.client.get(self.link + self.user.slug)
  62. self.assertEqual(response.status_code, 200)
  63. def test_filled_list(self):
  64. """user with followers returns 200"""
  65. User = get_user_model()
  66. test_follower = User.objects.create_user(
  67. "TestFollower", "test@follower.com", self.USER_PASSWORD)
  68. self.user.followed_by.add(test_follower)
  69. response = self.client.get(self.link + self.user.slug)
  70. self.assertEqual(response.status_code, 200)
  71. self.assertIn(test_follower.username, response.content)
  72. class FollowsListTests(AuthenticatedUserTestCase):
  73. """
  74. tests for generic list (GET /users/) filtered by follows
  75. """
  76. def setUp(self):
  77. super(FollowsListTests, self).setUp()
  78. self.link = '/api/users/?&follows='
  79. def test_nonexistent_user(self):
  80. """list for non-existing user returns 404"""
  81. response = self.client.get(self.link + 'this-user-is-fake')
  82. self.assertEqual(response.status_code, 404)
  83. def test_empty_list(self):
  84. """user without follows returns 200"""
  85. rank_slug = self.user.rank.slug
  86. response = self.client.get(self.link + self.user.slug)
  87. self.assertEqual(response.status_code, 200)
  88. def test_filled_list(self):
  89. """user with follows returns 200"""
  90. User = get_user_model()
  91. test_follower = User.objects.create_user(
  92. "TestFollower", "test@follower.com", self.USER_PASSWORD)
  93. self.user.follows.add(test_follower)
  94. response = self.client.get(self.link + self.user.slug)
  95. self.assertEqual(response.status_code, 200)
  96. self.assertIn(test_follower.username, response.content)
  97. class RankListTests(AuthenticatedUserTestCase):
  98. """
  99. tests for generic list (GET /users/) filtered by rank
  100. """
  101. def setUp(self):
  102. super(RankListTests, self).setUp()
  103. self.link = '/api/users/?rank='
  104. def test_nonexistent_rank(self):
  105. """list for non-existing rank returns 404"""
  106. response = self.client.get(self.link + 'this-rank-is-non-existing')
  107. self.assertEqual(response.status_code, 404)
  108. def test_empty_list(self):
  109. """tab rank without members returns 200"""
  110. test_rank = Rank.objects.create(
  111. name="Test rank",
  112. slug="test-rank",
  113. is_tab=True
  114. )
  115. response = self.client.get(self.link + test_rank.slug)
  116. self.assertEqual(response.status_code, 200)
  117. def test_disabled_list(self):
  118. """non-tab rank returns 404"""
  119. self.user.rank.is_tab = False
  120. self.user.rank.save()
  121. response = self.client.get(self.link + self.user.rank.slug)
  122. self.assertEqual(response.status_code, 404)
  123. def test_filled_list(self):
  124. """tab rank with members return 200"""
  125. self.user.rank.is_tab = True
  126. self.user.rank.save()
  127. response = self.client.get(self.link + self.user.rank.slug)
  128. self.assertEqual(response.status_code, 200)
  129. self.assertIn(self.user.username, response.content)
  130. class SearchNamesListTests(AuthenticatedUserTestCase):
  131. """
  132. tests for generic list (GET /users/) filtered by username
  133. """
  134. def setUp(self):
  135. super(SearchNamesListTests, self).setUp()
  136. self.link = '/api/users/?&name='
  137. def test_empty_list(self):
  138. """empty list returns 200"""
  139. response = self.client.get(self.link + 'this-user-is-fake')
  140. self.assertEqual(response.status_code, 200)
  141. def test_filled_list(self):
  142. """filled list returns 200"""
  143. response = self.client.get(self.link + self.user.slug)
  144. self.assertEqual(response.status_code, 200)
  145. self.assertIn(self.user.username, response.content)
  146. class UserForumOptionsTests(AuthenticatedUserTestCase):
  147. """
  148. tests for user forum options RPC (POST to /api/users/1/forum-options/)
  149. """
  150. def setUp(self):
  151. super(UserForumOptionsTests, self).setUp()
  152. self.link = '/api/users/%s/forum-options/' % self.user.pk
  153. def test_empty_request(self):
  154. """empty request is handled"""
  155. response = self.client.post(self.link)
  156. self.assertEqual(response.status_code, 400)
  157. fields = (
  158. 'limits_private_thread_invites_to',
  159. 'subscribe_to_started_threads',
  160. 'subscribe_to_replied_threads'
  161. )
  162. for field in fields:
  163. self.assertIn('"%s"' % field, response.content)
  164. def test_change_forum_options(self):
  165. """forum options are changed"""
  166. response = self.client.post(self.link, data={
  167. 'limits_private_thread_invites_to': 1,
  168. 'subscribe_to_started_threads': 2,
  169. 'subscribe_to_replied_threads': 1
  170. })
  171. self.assertEqual(response.status_code, 200)
  172. self.reload_user();
  173. self.assertFalse(self.user.is_hiding_presence)
  174. self.assertEqual(self.user.limits_private_thread_invites_to, 1)
  175. self.assertEqual(self.user.subscribe_to_started_threads, 2)
  176. self.assertEqual(self.user.subscribe_to_replied_threads, 1)