test_thread_postedits_api.py 6.3 KB

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