test_users_api.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  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 ActiveUsersListTests(AuthenticatedUserTestCase):
  13. """
  14. tests for active users list (GET /users/?list=active)
  15. """
  16. def setUp(self):
  17. super(ActiveUsersListTests, 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. self.logout_user()
  37. response = self.client.get(self.link)
  38. self.assertEqual(response.status_code, 200)
  39. self.assertIn(self.user.username, response.content)
  40. response = self.client.get(self.link)
  41. self.assertEqual(response.status_code, 200)
  42. self.assertIn(self.user.username, response.content)
  43. class OnlineListTests(AuthenticatedUserTestCase):
  44. """
  45. tests for online list (GET /users/?list=online)
  46. """
  47. def setUp(self):
  48. super(OnlineListTests, self).setUp()
  49. self.link = '/api/users/?list=online'
  50. cache.clear()
  51. threadstore.clear()
  52. def test_no_permission(self):
  53. """online list returns 403 if user has no permission"""
  54. override_acl(self.user, {
  55. 'can_browse_users_list': 1,
  56. 'can_see_users_online_list': 0,
  57. })
  58. response = self.client.get(self.link)
  59. self.assertEqual(response.status_code, 403)
  60. def test_empty_list(self):
  61. """empty online list returns 200"""
  62. override_acl(self.user, {
  63. 'can_browse_users_list': 1,
  64. 'can_see_users_online_list': 1,
  65. })
  66. Online.objects.all().update(
  67. last_click=timezone.now() - timedelta(days=5))
  68. response = self.client.get(self.link)
  69. self.assertEqual(response.status_code, 200)
  70. self.assertNotIn(self.user.username, response.content)
  71. override_acl(self.user, {
  72. 'can_browse_users_list': 1,
  73. 'can_see_users_online_list': 1,
  74. })
  75. response = self.client.get(self.link)
  76. self.assertEqual(response.status_code, 200)
  77. self.assertNotIn(self.user.username, response.content)
  78. def test_filled_list(self):
  79. """filled online list returns 200"""
  80. override_acl(self.user, {
  81. 'can_browse_users_list': 1,
  82. 'can_see_users_online_list': 1,
  83. })
  84. Online.objects.all().update(
  85. last_click=timezone.now())
  86. response = self.client.get(self.link)
  87. self.assertEqual(response.status_code, 200)
  88. self.assertIn(self.user.username, response.content)
  89. override_acl(self.user, {
  90. 'can_browse_users_list': 1,
  91. 'can_see_users_online_list': 1,
  92. })
  93. response = self.client.get(self.link)
  94. self.assertEqual(response.status_code, 200)
  95. self.assertIn(self.user.username, response.content)
  96. class RankListTests(AuthenticatedUserTestCase):
  97. """
  98. tests for rank list (GET /users/?list=rank&rank=slug)
  99. """
  100. def setUp(self):
  101. super(RankListTests, self).setUp()
  102. self.link = '/api/users/?list=rank&rank='
  103. def test_nonexistent_rank(self):
  104. """list for non-existing rank returns 404"""
  105. response = self.client.get(self.link + 'this-rank-is-non-existing')
  106. self.assertEqual(response.status_code, 404)
  107. def test_empty_list(self):
  108. """tab rank without members returns 200"""
  109. rank_slug = self.user.rank.slug
  110. self.user.rank = Rank.objects.filter(is_tab=False)[:1][0]
  111. self.user.rank.save()
  112. response = self.client.get(self.link + rank_slug)
  113. self.assertEqual(response.status_code, 404)
  114. def test_disabled_list(self):
  115. """non-tab rank with members returns 404"""
  116. self.user.rank.is_tab = False
  117. self.user.rank.save()
  118. response = self.client.get(self.link + self.user.rank.slug)
  119. self.assertEqual(response.status_code, 404)
  120. def test_filled_list(self):
  121. """tab rank with members return 200"""
  122. self.user.rank.is_tab = True
  123. self.user.rank.save()
  124. response = self.client.get(self.link + self.user.rank.slug)
  125. self.assertEqual(response.status_code, 200)
  126. self.assertIn(self.user.username, response.content)
  127. class UserForumOptionsTests(AuthenticatedUserTestCase):
  128. """
  129. tests for user forum options RPC (POST to /api/users/1/forum-options/)
  130. """
  131. def setUp(self):
  132. super(UserForumOptionsTests, self).setUp()
  133. self.link = '/api/users/%s/forum-options/' % self.user.pk
  134. def test_empty_request(self):
  135. """empty request is handled"""
  136. response = self.client.post(self.link)
  137. self.assertEqual(response.status_code, 400)
  138. fields = (
  139. 'limits_private_thread_invites_to',
  140. 'subscribe_to_started_threads',
  141. 'subscribe_to_replied_threads'
  142. )
  143. for field in fields:
  144. self.assertIn('"%s"' % field, response.content)
  145. def test_change_forum_options(self):
  146. """forum options are changed"""
  147. response = self.client.post(self.link, data={
  148. 'limits_private_thread_invites_to': 1,
  149. 'subscribe_to_started_threads': 2,
  150. 'subscribe_to_replied_threads': 1
  151. })
  152. self.assertEqual(response.status_code, 200)
  153. self.reload_user();
  154. self.assertFalse(self.user.is_hiding_presence)
  155. self.assertEqual(self.user.limits_private_thread_invites_to, 1)
  156. self.assertEqual(self.user.subscribe_to_started_threads, 2)
  157. self.assertEqual(self.user.subscribe_to_replied_threads, 1)