test_thread_polldelete_api.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. from datetime import timedelta
  2. from django.urls import reverse
  3. from django.utils import timezone
  4. from ...acl.test import patch_user_acl
  5. from ..models import Poll, PollVote, Thread
  6. from ..test import patch_category_acl
  7. from .test_thread_poll_api import ThreadPollApiTestCase
  8. class ThreadPollDeleteTests(ThreadPollApiTestCase):
  9. def setUp(self):
  10. super().setUp()
  11. self.mock_poll()
  12. def test_anonymous(self):
  13. """api requires you to sign in to delete poll"""
  14. self.logout_user()
  15. response = self.client.delete(self.api_link)
  16. self.assertEqual(response.status_code, 403)
  17. def test_invalid_thread_id(self):
  18. """api validates that thread id is integer"""
  19. api_link = reverse(
  20. "misago:api:thread-poll-detail",
  21. kwargs={"thread_pk": "kjha6dsa687sa", "pk": self.poll.pk},
  22. )
  23. response = self.client.delete(api_link)
  24. self.assertEqual(response.status_code, 404)
  25. def test_nonexistant_thread_id(self):
  26. """api validates that thread exists"""
  27. api_link = reverse(
  28. "misago:api:thread-poll-detail",
  29. kwargs={"thread_pk": self.thread.pk + 1, "pk": self.poll.pk},
  30. )
  31. response = self.client.delete(api_link)
  32. self.assertEqual(response.status_code, 404)
  33. def test_invalid_poll_id(self):
  34. """api validates that poll id is integer"""
  35. api_link = reverse(
  36. "misago:api:thread-poll-detail",
  37. kwargs={"thread_pk": self.thread.pk, "pk": "sad98as7d97sa98"},
  38. )
  39. response = self.client.delete(api_link)
  40. self.assertEqual(response.status_code, 404)
  41. def test_nonexistant_poll_id(self):
  42. """api validates that poll exists"""
  43. api_link = reverse(
  44. "misago:api:thread-poll-detail",
  45. kwargs={"thread_pk": self.thread.pk, "pk": self.poll.pk + 123},
  46. )
  47. response = self.client.delete(api_link)
  48. self.assertEqual(response.status_code, 404)
  49. @patch_user_acl({"can_delete_polls": 0})
  50. def test_no_permission(self):
  51. """api validates that user has permission to delete poll in thread"""
  52. response = self.client.delete(self.api_link)
  53. self.assertEqual(response.status_code, 403)
  54. self.assertEqual(response.json(), {"detail": "You can't delete polls."})
  55. @patch_user_acl({"can_delete_polls": 1, "poll_edit_time": 5})
  56. def test_no_permission_timeout(self):
  57. """api validates that user's window to delete poll in thread has closed"""
  58. self.poll.posted_on = timezone.now() - timedelta(minutes=15)
  59. self.poll.save()
  60. response = self.client.delete(self.api_link)
  61. self.assertEqual(response.status_code, 403)
  62. self.assertEqual(
  63. response.json(),
  64. {"detail": "You can't delete polls that are older than 5 minutes."},
  65. )
  66. @patch_user_acl({"can_delete_polls": 1})
  67. def test_no_permission_poll_closed(self):
  68. """api validates that user's window to delete poll in thread has closed"""
  69. self.poll.posted_on = timezone.now() - timedelta(days=15)
  70. self.poll.length = 5
  71. self.poll.save()
  72. response = self.client.delete(self.api_link)
  73. self.assertEqual(response.status_code, 403)
  74. self.assertEqual(
  75. response.json(), {"detail": "This poll is over. You can't delete it."}
  76. )
  77. @patch_user_acl({"can_delete_polls": 1})
  78. def test_no_permission_other_user_poll(self):
  79. """api validates that user has permission to delete other user poll in thread"""
  80. self.poll.poster = None
  81. self.poll.save()
  82. response = self.client.delete(self.api_link)
  83. self.assertEqual(response.status_code, 403)
  84. self.assertEqual(
  85. response.json(),
  86. {"detail": "You can't delete other users polls in this category."},
  87. )
  88. @patch_user_acl({"can_delete_polls": 1})
  89. @patch_category_acl({"can_close_threads": False})
  90. def test_no_permission_closed_thread(self):
  91. """api validates that user has permission to delete poll in closed thread"""
  92. self.thread.is_closed = True
  93. self.thread.save()
  94. response = self.client.delete(self.api_link)
  95. self.assertEqual(response.status_code, 403)
  96. self.assertEqual(
  97. response.json(),
  98. {"detail": "This thread is closed. You can't delete polls in it."},
  99. )
  100. @patch_user_acl({"can_delete_polls": 1})
  101. @patch_category_acl({"can_close_threads": True})
  102. def test_closed_thread(self):
  103. """api validates that user has permission to delete poll in closed thread"""
  104. self.thread.is_closed = True
  105. self.thread.save()
  106. response = self.client.delete(self.api_link)
  107. self.assertEqual(response.status_code, 200)
  108. @patch_user_acl({"can_delete_polls": 1})
  109. @patch_category_acl({"can_close_threads": False})
  110. def test_no_permission_closed_category(self):
  111. """api validates that user has permission to delete poll in closed category"""
  112. self.category.is_closed = True
  113. self.category.save()
  114. response = self.client.delete(self.api_link)
  115. self.assertEqual(response.status_code, 403)
  116. self.assertEqual(
  117. response.json(),
  118. {"detail": "This category is closed. You can't delete polls in it."},
  119. )
  120. @patch_user_acl({"can_delete_polls": 1})
  121. @patch_category_acl({"can_close_threads": True})
  122. def test_closed_category(self):
  123. """api validates that user has permission to delete poll in closed category"""
  124. self.category.is_closed = True
  125. self.category.save()
  126. response = self.client.delete(self.api_link)
  127. self.assertEqual(response.status_code, 200)
  128. @patch_user_acl({"can_delete_polls": 1, "poll_edit_time": 5})
  129. def test_poll_delete(self):
  130. """api deletes poll and associated votes"""
  131. response = self.client.delete(self.api_link)
  132. self.assertEqual(response.status_code, 200)
  133. self.assertEqual(response.json(), {"can_start_poll": True})
  134. self.assertEqual(Poll.objects.count(), 0)
  135. self.assertEqual(PollVote.objects.count(), 0)
  136. # api set poll flag on thread to False
  137. thread = Thread.objects.get(pk=self.thread.pk)
  138. self.assertFalse(thread.has_poll)
  139. @patch_user_acl({"can_delete_polls": 2, "poll_edit_time": 5})
  140. def test_other_user_poll_delete(self):
  141. """api deletes other user's poll and associated votes, even if its over"""
  142. self.poll.poster = None
  143. self.poll.posted_on = timezone.now() - timedelta(days=15)
  144. self.poll.length = 5
  145. self.poll.save()
  146. response = self.client.delete(self.api_link)
  147. self.assertEqual(response.status_code, 200)
  148. self.assertEqual(response.json(), {"can_start_poll": True})
  149. self.assertEqual(Poll.objects.count(), 0)
  150. self.assertEqual(PollVote.objects.count(), 0)
  151. # api set poll flag on thread to False
  152. thread = Thread.objects.get(pk=self.thread.pk)
  153. self.assertFalse(thread.has_poll)