test_thread_postedits_api.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. from django.urls import reverse
  2. from misago.threads import testutils
  3. from misago.threads.test import patch_category_acl
  4. from .test_threads_api import ThreadsApiTestCase
  5. class ThreadPostEditsApiTestCase(ThreadsApiTestCase):
  6. def setUp(self):
  7. super().setUp()
  8. self.post = testutils.reply_thread(self.thread, poster=self.user)
  9. self.api_link = reverse(
  10. "misago:api:thread-post-edits",
  11. kwargs={"thread_pk": self.thread.pk, "pk": self.post.pk},
  12. )
  13. def mock_edit_record(self):
  14. edits_record = [
  15. self.post.edits_record.create(
  16. category=self.category,
  17. thread=self.thread,
  18. editor=self.user,
  19. editor_name=self.user.username,
  20. editor_slug=self.user.slug,
  21. edited_from="Original body",
  22. edited_to="First Edit",
  23. ),
  24. self.post.edits_record.create(
  25. category=self.category,
  26. thread=self.thread,
  27. editor_name="Deleted",
  28. editor_slug="deleted",
  29. edited_from="First Edit",
  30. edited_to="Second Edit",
  31. ),
  32. self.post.edits_record.create(
  33. category=self.category,
  34. thread=self.thread,
  35. editor=self.user,
  36. editor_name=self.user.username,
  37. editor_slug=self.user.slug,
  38. edited_from="Second Edit",
  39. edited_to="Last Edit",
  40. ),
  41. ]
  42. self.post.original = "Last Edit"
  43. self.post.parsed = "<p>Last Edit</p>"
  44. self.post.save()
  45. return edits_record
  46. class ThreadPostGetEditTests(ThreadPostEditsApiTestCase):
  47. def test_no_edits(self):
  48. """api returns 403 if post has no edits record"""
  49. response = self.client.get(self.api_link)
  50. self.assertEqual(response.status_code, 403)
  51. self.assertEqual(
  52. response.json(), {"detail": "Edits record is unavailable for this post."}
  53. )
  54. self.logout_user()
  55. response = self.client.get(self.api_link)
  56. self.assertEqual(response.status_code, 403)
  57. self.assertEqual(
  58. response.json(), {"detail": "Edits record is unavailable for this post."}
  59. )
  60. def test_empty_edit_id(self):
  61. """api handles empty edit in querystring"""
  62. response = self.client.get("%s?edit=" % self.api_link)
  63. self.assertEqual(response.status_code, 404)
  64. def test_invalid_edit_id(self):
  65. """api handles invalid edit in querystring"""
  66. response = self.client.get("%s?edit=dsa67d8sa68" % self.api_link)
  67. self.assertEqual(response.status_code, 404)
  68. def test_nonexistant_edit_id(self):
  69. """api handles nonexistant edit in querystring"""
  70. response = self.client.get("%s?edit=1321" % self.api_link)
  71. self.assertEqual(response.status_code, 404)
  72. def test_get_last_edit(self):
  73. """api returns last edit record"""
  74. edits = self.mock_edit_record()
  75. response = self.client.get(self.api_link)
  76. self.assertEqual(response.status_code, 200)
  77. response_json = response.json()
  78. self.assertEqual(response_json["id"], edits[-1].id)
  79. self.assertIsNone(response_json["next"])
  80. self.assertEqual(response_json["previous"], edits[1].id)
  81. def test_get_middle_edit(self):
  82. """api returns middle edit record"""
  83. edits = self.mock_edit_record()
  84. response = self.client.get("%s?edit=%s" % (self.api_link, edits[1].id))
  85. self.assertEqual(response.status_code, 200)
  86. response_json = response.json()
  87. self.assertEqual(response_json["id"], edits[1].id)
  88. self.assertEqual(response_json["next"], edits[-1].id)
  89. self.assertEqual(response_json["previous"], edits[0].id)
  90. def test_get_first_edit(self):
  91. """api returns middle edit record"""
  92. edits = self.mock_edit_record()
  93. response = self.client.get("%s?edit=%s" % (self.api_link, edits[0].id))
  94. self.assertEqual(response.status_code, 200)
  95. response_json = response.json()
  96. self.assertEqual(response_json["id"], edits[0].id)
  97. self.assertEqual(response_json["next"], edits[1].id)
  98. self.assertIsNone(response_json["previous"])
  99. class ThreadPostPostEditTests(ThreadPostEditsApiTestCase):
  100. def setUp(self):
  101. super().setUp()
  102. self.edits = self.mock_edit_record()
  103. @patch_category_acl({"can_edit_posts": 2})
  104. def test_empty_edit_id(self):
  105. """api handles empty edit in querystring"""
  106. response = self.client.post("%s?edit=" % self.api_link)
  107. self.assertEqual(response.status_code, 404)
  108. @patch_category_acl({"can_edit_posts": 2})
  109. def test_invalid_edit_id(self):
  110. """api handles invalid edit in querystring"""
  111. response = self.client.post("%s?edit=dsa67d8sa68" % self.api_link)
  112. self.assertEqual(response.status_code, 404)
  113. @patch_category_acl({"can_edit_posts": 2})
  114. def test_nonexistant_edit_id(self):
  115. """api handles nonexistant edit in querystring"""
  116. response = self.client.post("%s?edit=1321" % self.api_link)
  117. self.assertEqual(response.status_code, 404)
  118. def test_anonymous(self):
  119. """only signed in users can rever ports"""
  120. self.logout_user()
  121. response = self.client.post("%s?edit=%s" % (self.api_link, self.edits[0].id))
  122. self.assertEqual(response.status_code, 403)
  123. @patch_category_acl({"can_edit_posts": 0})
  124. def test_no_permission(self):
  125. """api validates permission to revert post"""
  126. response = self.client.post("%s?edit=1321" % self.api_link)
  127. self.assertEqual(response.status_code, 403)
  128. @patch_category_acl({"can_edit_posts": 2})
  129. def test_revert_post(self):
  130. """api reverts post to version from before specified edit"""
  131. response = self.client.post("%s?edit=%s" % (self.api_link, self.edits[0].id))
  132. self.assertEqual(response.status_code, 200)
  133. response_json = response.json()
  134. self.assertEqual(response_json["edits"], 1)
  135. self.assertEqual(response_json["content"], "<p>Original body</p>")
  136. self.assertEqual(self.post.edits_record.count(), 4)
  137. edit = self.post.edits_record.first()
  138. self.assertEqual(edit.edited_from, self.post.original)
  139. self.assertEqual(edit.edited_to, "Original body")