test_thread_postedits_api.py 6.6 KB

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