from django.urls import reverse from misago.threads import testutils from misago.threads.test import patch_category_acl from misago.threads.serializers import PostLikeSerializer from .test_threads_api import ThreadsApiTestCase class ThreadPostLikesApiTestCase(ThreadsApiTestCase): def setUp(self): super().setUp() self.post = testutils.reply_thread(self.thread, poster=self.user) self.api_link = reverse( 'misago:api:thread-post-likes', kwargs={ 'thread_pk': self.thread.pk, 'pk': self.post.pk, } ) @patch_category_acl({"can_see_posts_likes": 0}) def test_no_permission(self): """api errors if user has no permission to see likes""" response = self.client.get(self.api_link) self.assertEqual(response.status_code, 403) self.assertEquals(response.json(), { "detail": "You can't see who liked this post." }) @patch_category_acl({"can_see_posts_likes": 1}) def test_no_permission_to_list(self): """api errors if user has no permission to see likes, but can see likes count""" response = self.client.get(self.api_link) self.assertEqual(response.status_code, 403) self.assertEquals(response.json(), { "detail": "You can't see who liked this post." }) @patch_category_acl({"can_see_posts_likes": 2}) def test_no_likes(self): """api returns empty list if post has no likes""" response = self.client.get(self.api_link) self.assertEqual(response.status_code, 200) self.assertEqual(response.json(), []) @patch_category_acl({"can_see_posts_likes": 2}) def test_likes(self): """api returns list of likes""" like = testutils.like_post(self.post, self.user) other_like = testutils.like_post(self.post, self.user) response = self.client.get(self.api_link) self.assertEqual(response.status_code, 200) self.assertEqual( response.json(), [ PostLikeSerializer({ 'id': other_like.id, 'liked_on': other_like.liked_on, 'liker_id': other_like.liker_id, 'liker_name': other_like.liker_name, 'liker_slug': other_like.liker_slug, 'liker__avatars': self.user.avatars, }).data, PostLikeSerializer({ 'id': like.id, 'liked_on': like.liked_on, 'liker_id': like.liker_id, 'liker_name': like.liker_name, 'liker_slug': like.liker_slug, 'liker__avatars': self.user.avatars, }).data, ] ) # api has no showstoppers for likes by deleted users like.liker = None like.save() other_like.liker = None other_like.save() response = self.client.get(self.api_link) self.assertEqual(response.status_code, 200) self.assertEqual( response.json(), [ PostLikeSerializer({ 'id': other_like.id, 'liked_on': other_like.liked_on, 'liker_id': other_like.liker_id, 'liker_name': other_like.liker_name, 'liker_slug': other_like.liker_slug, 'liker__avatars': None, }).data, PostLikeSerializer({ 'id': like.id, 'liked_on': like.liked_on, 'liker_id': like.liker_id, 'liker_name': like.liker_name, 'liker_slug': like.liker_slug, 'liker__avatars': None, }).data, ] )