|
@@ -1,10 +1,169 @@
|
|
|
|
+from datetime import timedelta
|
|
|
|
+
|
|
from django.contrib.auth import get_user_model
|
|
from django.contrib.auth import get_user_model
|
|
|
|
+from django.utils import timezone
|
|
|
|
|
|
|
|
+from misago.acl.testutils import override_acl
|
|
from misago.conf import settings
|
|
from misago.conf import settings
|
|
|
|
+from misago.core import threadstore
|
|
|
|
+from misago.core.cache import cache
|
|
|
|
+from misago.forums.models import Forum
|
|
|
|
+from misago.threads.testutils import post_thread
|
|
|
|
|
|
|
|
+from misago.users.models import Online, Rank
|
|
from misago.users.testutils import AuthenticatedUserTestCase
|
|
from misago.users.testutils import AuthenticatedUserTestCase
|
|
|
|
|
|
|
|
|
|
|
|
+class ActiveUsersListTests(AuthenticatedUserTestCase):
|
|
|
|
+ """
|
|
|
|
+ tests for active users list (GET /users/?list=active)
|
|
|
|
+ """
|
|
|
|
+ def setUp(self):
|
|
|
|
+ super(ActiveUsersListTests, self).setUp()
|
|
|
|
+ self.link = '/api/users/?list=active'
|
|
|
|
+
|
|
|
|
+ cache.clear()
|
|
|
|
+ threadstore.clear()
|
|
|
|
+
|
|
|
|
+ self.forum = Forum.objects.all_forums().filter(role="forum")[:1][0]
|
|
|
|
+ self.forum.labels = []
|
|
|
|
+
|
|
|
|
+ def test_empty_list(self):
|
|
|
|
+ """empty list is served"""
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertNotIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertNotIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+ def test_filled_list(self):
|
|
|
|
+ """filled list is served"""
|
|
|
|
+ post_thread(self.forum, poster=self.user)
|
|
|
|
+ self.user.posts = 1
|
|
|
|
+ self.user.save()
|
|
|
|
+
|
|
|
|
+ self.logout_user()
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class OnlineListTests(AuthenticatedUserTestCase):
|
|
|
|
+ """
|
|
|
|
+ tests for online list (GET /users/?list=online)
|
|
|
|
+ """
|
|
|
|
+ def setUp(self):
|
|
|
|
+ super(OnlineListTests, self).setUp()
|
|
|
|
+ self.link = '/api/users/?list=online'
|
|
|
|
+
|
|
|
|
+ cache.clear()
|
|
|
|
+ threadstore.clear()
|
|
|
|
+
|
|
|
|
+ def test_no_permission(self):
|
|
|
|
+ """online list returns 403 if user has no permission"""
|
|
|
|
+ override_acl(self.user, {
|
|
|
|
+ 'can_browse_users_list': 1,
|
|
|
|
+ 'can_see_users_online_list': 0,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 403)
|
|
|
|
+
|
|
|
|
+ def test_empty_list(self):
|
|
|
|
+ """empty online list returns 200"""
|
|
|
|
+ override_acl(self.user, {
|
|
|
|
+ 'can_browse_users_list': 1,
|
|
|
|
+ 'can_see_users_online_list': 1,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ Online.objects.all().update(
|
|
|
|
+ last_click=timezone.now() - timedelta(days=5))
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertNotIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+ override_acl(self.user, {
|
|
|
|
+ 'can_browse_users_list': 1,
|
|
|
|
+ 'can_see_users_online_list': 1,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertNotIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+ def test_filled_list(self):
|
|
|
|
+ """filled online list returns 200"""
|
|
|
|
+ override_acl(self.user, {
|
|
|
|
+ 'can_browse_users_list': 1,
|
|
|
|
+ 'can_see_users_online_list': 1,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ Online.objects.all().update(
|
|
|
|
+ last_click=timezone.now())
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+ override_acl(self.user, {
|
|
|
|
+ 'can_browse_users_list': 1,
|
|
|
|
+ 'can_see_users_online_list': 1,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+class RankListTests(AuthenticatedUserTestCase):
|
|
|
|
+ """
|
|
|
|
+ tests for rank list (GET /users/?list=rank&rank=slug)
|
|
|
|
+ """
|
|
|
|
+ def setUp(self):
|
|
|
|
+ super(RankListTests, self).setUp()
|
|
|
|
+ self.link = '/api/users/?list=rank&rank='
|
|
|
|
+
|
|
|
|
+ def test_nonexistent_rank(self):
|
|
|
|
+ """list for non-existing rank returns 404"""
|
|
|
|
+ response = self.client.get(self.link + 'this-rank-is-non-existing')
|
|
|
|
+ self.assertEqual(response.status_code, 404)
|
|
|
|
+
|
|
|
|
+ def test_empty_list(self):
|
|
|
|
+ """tab rank without members returns 200"""
|
|
|
|
+ rank_slug = self.user.rank.slug
|
|
|
|
+
|
|
|
|
+ self.user.rank = Rank.objects.filter(is_tab=False)[:1][0]
|
|
|
|
+ self.user.rank.save()
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link + rank_slug)
|
|
|
|
+ self.assertEqual(response.status_code, 404)
|
|
|
|
+
|
|
|
|
+ def test_disabled_list(self):
|
|
|
|
+ """non-tab rank with members returns 404"""
|
|
|
|
+ self.user.rank.is_tab = False
|
|
|
|
+ self.user.rank.save()
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link + self.user.rank.slug)
|
|
|
|
+ self.assertEqual(response.status_code, 404)
|
|
|
|
+
|
|
|
|
+ def test_filled_list(self):
|
|
|
|
+ """tab rank with members return 200"""
|
|
|
|
+ self.user.rank.is_tab = True
|
|
|
|
+ self.user.rank.save()
|
|
|
|
+
|
|
|
|
+ response = self.client.get(self.link + self.user.rank.slug)
|
|
|
|
+ self.assertEqual(response.status_code, 200)
|
|
|
|
+ self.assertIn(self.user.username, response.content)
|
|
|
|
+
|
|
|
|
+
|
|
class UserForumOptionsTests(AuthenticatedUserTestCase):
|
|
class UserForumOptionsTests(AuthenticatedUserTestCase):
|
|
"""
|
|
"""
|
|
tests for user forum options RPC (POST to /api/users/1/forum-options/)
|
|
tests for user forum options RPC (POST to /api/users/1/forum-options/)
|