test_thread_postlikes_api.py 4.0 KB

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