test_thread_postlikes_api.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from django.urls import reverse
  2. from misago.threads import testutils
  3. from misago.threads.test import patch_category_acl
  4. from misago.threads.serializers import PostLikeSerializer
  5. from .test_threads_api import ThreadsApiTestCase
  6. class ThreadPostLikesApiTestCase(ThreadsApiTestCase):
  7. def setUp(self):
  8. super().setUp()
  9. self.post = testutils.reply_thread(self.thread, poster=self.user)
  10. self.api_link = reverse(
  11. 'misago:api:thread-post-likes',
  12. kwargs={
  13. 'thread_pk': self.thread.pk,
  14. 'pk': self.post.pk,
  15. }
  16. )
  17. @patch_category_acl({"can_see_posts_likes": 0})
  18. def test_no_permission(self):
  19. """api errors if user has no permission to see likes"""
  20. response = self.client.get(self.api_link)
  21. self.assertEqual(response.status_code, 403)
  22. self.assertEquals(response.json(), {
  23. "detail": "You can't see who liked this post."
  24. })
  25. @patch_category_acl({"can_see_posts_likes": 1})
  26. def test_no_permission_to_list(self):
  27. """api errors if user has no permission to see likes, but can see likes count"""
  28. response = self.client.get(self.api_link)
  29. self.assertEqual(response.status_code, 403)
  30. self.assertEquals(response.json(), {
  31. "detail": "You can't see who liked this post."
  32. })
  33. @patch_category_acl({"can_see_posts_likes": 2})
  34. def test_no_likes(self):
  35. """api returns empty list if post has no likes"""
  36. response = self.client.get(self.api_link)
  37. self.assertEqual(response.status_code, 200)
  38. self.assertEqual(response.json(), [])
  39. @patch_category_acl({"can_see_posts_likes": 2})
  40. def test_likes(self):
  41. """api returns list of likes"""
  42. like = testutils.like_post(self.post, self.user)
  43. other_like = testutils.like_post(self.post, self.user)
  44. response = self.client.get(self.api_link)
  45. self.assertEqual(response.status_code, 200)
  46. self.assertEqual(
  47. response.json(), [
  48. PostLikeSerializer({
  49. 'id': other_like.id,
  50. 'liked_on': other_like.liked_on,
  51. 'liker_id': other_like.liker_id,
  52. 'liker_name': other_like.liker_name,
  53. 'liker_slug': other_like.liker_slug,
  54. 'liker__avatars': self.user.avatars,
  55. }).data,
  56. PostLikeSerializer({
  57. 'id': like.id,
  58. 'liked_on': like.liked_on,
  59. 'liker_id': like.liker_id,
  60. 'liker_name': like.liker_name,
  61. 'liker_slug': like.liker_slug,
  62. 'liker__avatars': self.user.avatars,
  63. }).data,
  64. ]
  65. )
  66. # api has no showstoppers for likes by deleted users
  67. like.liker = None
  68. like.save()
  69. other_like.liker = None
  70. other_like.save()
  71. response = self.client.get(self.api_link)
  72. self.assertEqual(response.status_code, 200)
  73. self.assertEqual(
  74. response.json(), [
  75. PostLikeSerializer({
  76. 'id': other_like.id,
  77. 'liked_on': other_like.liked_on,
  78. 'liker_id': other_like.liker_id,
  79. 'liker_name': other_like.liker_name,
  80. 'liker_slug': other_like.liker_slug,
  81. 'liker__avatars': None,
  82. }).data,
  83. PostLikeSerializer({
  84. 'id': like.id,
  85. 'liked_on': like.liked_on,
  86. 'liker_id': like.liker_id,
  87. 'liker_name': like.liker_name,
  88. 'liker_slug': like.liker_slug,
  89. 'liker__avatars': None,
  90. }).data,
  91. ]
  92. )