test_thread_postedits_api.py 6.4 KB

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