test_threads_api.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. import json
  2. from misago.acl.testutils import override_acl
  3. from misago.users.testutils import AuthenticatedUserTestCase
  4. from misago.categories.models import CATEGORIES_TREE_ID, Category
  5. from misago.threads import testutils
  6. from misago.threads.models import Thread
  7. class ThreadsApiTestCase(AuthenticatedUserTestCase):
  8. def setUp(self):
  9. super(ThreadsApiTestCase, self).setUp()
  10. self.root = Category.objects.get(tree_id=CATEGORIES_TREE_ID, level=0)
  11. self.category = Category.objects.get(slug='first-category')
  12. self.thread = testutils.post_thread(category=self.category)
  13. self.api_link = self.thread.get_api_url()
  14. def override_acl(self, acl=None):
  15. final_acl = {
  16. 'can_see': 1,
  17. 'can_browse': 1,
  18. 'can_see_all_threads': 1,
  19. 'can_see_own_threads': 0,
  20. 'can_hide_threads': 0,
  21. 'can_approve_content': 0,
  22. 'can_edit_posts': 0,
  23. 'can_hide_posts': 0,
  24. 'can_hide_own_posts': 0,
  25. }
  26. if acl:
  27. final_acl.update(acl)
  28. override_acl(self.user, {
  29. 'categories': {
  30. self.category.pk: final_acl
  31. }
  32. })
  33. def get_thread_json(self):
  34. response = self.client.get(self.thread.get_api_url())
  35. self.assertEqual(response.status_code, 200)
  36. return json.loads(response.content)
  37. class ThreadRetrieveApiTests(ThreadsApiTestCase):
  38. def setUp(self):
  39. super(ThreadRetrieveApiTests, self).setUp()
  40. self.tested_links = [
  41. self.api_link,
  42. '%sposts/' % self.api_link,
  43. '%sposts/?page=1' % self.api_link,
  44. ]
  45. def test_api_returns_thread(self):
  46. """api endpoint has no showstoppers"""
  47. for link in self.tested_links:
  48. self.override_acl()
  49. response = self.client.get(link)
  50. self.assertEqual(response.status_code, 200)
  51. response_json = json.loads(response.content)
  52. self.assertEqual(response_json['id'], self.thread.pk)
  53. self.assertEqual(response_json['title'], self.thread.title)
  54. if 'posts' in link:
  55. self.assertIn('post_set', response_json)
  56. def test_api_shows_owner_thread(self):
  57. """api handles "owned threads only"""
  58. for link in self.tested_links:
  59. self.override_acl({
  60. 'can_see_all_threads': 0
  61. })
  62. response = self.client.get(link)
  63. self.assertEqual(response.status_code, 404)
  64. self.thread.starter = self.user
  65. self.thread.save()
  66. for link in self.tested_links:
  67. self.override_acl({
  68. 'can_see_all_threads': 0
  69. })
  70. response = self.client.get(link)
  71. self.assertEqual(response.status_code, 200)
  72. def test_api_validates_category_permissions(self):
  73. """api endpoint validates category visiblity"""
  74. for link in self.tested_links:
  75. self.override_acl({
  76. 'can_see': 0
  77. })
  78. response = self.client.get(link)
  79. self.assertEqual(response.status_code, 404)
  80. for link in self.tested_links:
  81. self.override_acl({
  82. 'can_browse': 0
  83. })
  84. response = self.client.get(link)
  85. self.assertEqual(response.status_code, 404)
  86. class ThreadDeleteApiTests(ThreadsApiTestCase):
  87. def test_delete_thread(self):
  88. """DELETE to API link with permission deletes thread"""
  89. self.override_acl({
  90. 'can_hide_threads': 2
  91. })
  92. response = self.client.delete(self.api_link)
  93. self.assertEqual(response.status_code, 200)
  94. with self.assertRaises(Thread.DoesNotExist):
  95. Thread.objects.get(pk=self.thread.pk)
  96. def test_delete_thread_no_permission(self):
  97. """DELETE to API link with no permission to delete fails"""
  98. self.override_acl({
  99. 'can_hide_threads': 1
  100. })
  101. response = self.client.delete(self.api_link)
  102. self.assertEqual(response.status_code, 403)
  103. self.override_acl({
  104. 'can_hide_threads': 0
  105. })
  106. response_json = json.loads(response.content)
  107. self.assertEqual(response_json['detail'],
  108. "You don't have permission to delete this thread.")
  109. response = self.client.delete(self.api_link)
  110. self.assertEqual(response.status_code, 403)
  111. class ThreadsReadApiTests(ThreadsApiTestCase):
  112. def setUp(self):
  113. super(ThreadsReadApiTests, self).setUp()
  114. self.api_link = '/api/threads/read/'
  115. def test_read_all_threads(self):
  116. """api sets all threads as read"""
  117. response = self.client.post(self.api_link)
  118. self.assertEqual(response.status_code, 200)
  119. self.assertEqual(self.user.categoryread_set.count(), 2)
  120. def test_read_threads_in_category(self):
  121. """api sets threads in category as read"""
  122. response = self.client.post(
  123. '%s?category=%s' % (self.api_link, self.category.pk))
  124. self.assertEqual(response.status_code, 200)
  125. self.assertEqual(self.user.categoryread_set.count(), 1)