test_thread_postedits_api.py 6.3 KB

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