test_views.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. from datetime import timedelta
  2. from django.urls import reverse
  3. from django.utils import timezone
  4. from misago.acl.testutils import override_acl
  5. from misago.users.testutils import AuthenticatedUserTestCase
  6. from ..models import Category
  7. from ..utils import get_categories_tree
  8. class CategoryViewsTests(AuthenticatedUserTestCase):
  9. def test_index_renders(self):
  10. """categories list renders for authenticated"""
  11. response = self.client.get(reverse('misago:categories'))
  12. for node in get_categories_tree(self.user):
  13. self.assertContains(response, node.name)
  14. if node.level > 1:
  15. self.assertContains(response, node.get_absolute_url())
  16. def test_index_renders_for_guest(self):
  17. """categories list renders for guest"""
  18. self.logout_user()
  19. response = self.client.get(reverse('misago:categories'))
  20. for node in get_categories_tree(self.user):
  21. self.assertContains(response, node.name)
  22. if node.level > 1:
  23. self.assertContains(response, node.get_absolute_url())
  24. def test_index_no_perms_renders(self):
  25. """categories list renders no visible categories for authenticated"""
  26. override_acl(self.user, {'visible_categories': []})
  27. response = self.client.get(reverse('misago:categories'))
  28. for node in get_categories_tree(self.user):
  29. self.assertNotIn(node.name, response.content)
  30. if node.level > 1:
  31. self.assertNotContains(response, node.get_absolute_url())
  32. def test_index_no_perms_renders_for_guest(self):
  33. """categories list renders no visible categories for guest"""
  34. self.logout_user()
  35. override_acl(self.user, {'visible_categories': []})
  36. response = self.client.get(reverse('misago:categories'))
  37. for node in get_categories_tree(self.user):
  38. self.assertNotIn(node.name, response.content)
  39. if node.level > 1:
  40. self.assertNotContains(response, node.get_absolute_url())
  41. class CategoryAPIViewsTests(AuthenticatedUserTestCase):
  42. def setUp(self):
  43. super(CategoryAPIViewsTests, self).setUp()
  44. self.category = Category.objects.get(slug='first-category')
  45. self.api_link = reverse('misago:api:category-read', kwargs={
  46. 'pk': self.category.pk
  47. })
  48. def test_list_renders(self):
  49. """api returns categories for authenticated"""
  50. response = self.client.get(reverse('misago:api:category-list'))
  51. for node in get_categories_tree(self.user):
  52. self.assertContains(response, node.name)
  53. if node.level > 1:
  54. self.assertNotContains(response, node.get_absolute_url())
  55. def test_list_renders_for_guest(self):
  56. """api returns categories for guest"""
  57. self.logout_user()
  58. response = self.client.get(reverse('misago:api:category-list'))
  59. for node in get_categories_tree(self.user):
  60. self.assertContains(response, node.name)
  61. if node.level > 1:
  62. self.assertNotContains(response, node.get_absolute_url())
  63. def test_list_no_perms_renders(self):
  64. """api returns no categories for authenticated"""
  65. override_acl(self.user, {'visible_categories': []})
  66. response = self.client.get(reverse('misago:api:category-list'))
  67. for node in get_categories_tree(self.user):
  68. self.assertNotIn(node.name, response.content)
  69. if node.level > 1:
  70. self.assertNotContains(response, node.get_absolute_url())
  71. def test_list_no_perms_renders_for_guest(self):
  72. """api returns no categories for guest"""
  73. self.logout_user()
  74. override_acl(self.user, {'visible_categories': []})
  75. response = self.client.get(reverse('misago:api:category-list'))
  76. for node in get_categories_tree(self.user):
  77. self.assertNotContains(response, node.name)
  78. if node.level > 1:
  79. self.assertNotContains(response, node.get_absolute_url())
  80. def test_read_category_guest(self):
  81. """category read api validates that user is authenticated"""
  82. self.logout_user()
  83. response = self.client.post(self.api_link)
  84. self.assertContains(response, "This action is not available to guests.", status_code=403)
  85. def test_read_invalid_category(self):
  86. """category read api validates category id"""
  87. api_link = reverse('misago:api:category-read', kwargs={
  88. 'pk': 'abcd'
  89. })
  90. response = self.client.post(api_link)
  91. self.assertEqual(response.status_code, 404)
  92. def test_read_nonexistant_category(self):
  93. """category read api validates category visibility"""
  94. api_link = reverse('misago:api:category-read', kwargs={
  95. 'pk': self.category.pk * 2
  96. })
  97. response = self.client.post(api_link)
  98. self.assertEqual(response.status_code, 404)
  99. def test_read_category_no_permission(self):
  100. """category read api validates category permission"""
  101. override_acl(self.user, {'visible_categories': []})
  102. response = self.client.post(self.api_link)
  103. self.assertEqual(response.status_code, 404)
  104. def test_read_category(self):
  105. """category read api reads category"""
  106. # clean reads
  107. self.user.categoryread_set.all().delete()
  108. self.assertEqual(self.user.categoryread_set.count(), 0)
  109. # call api
  110. response = self.client.post(self.api_link)
  111. self.assertEqual(response.status_code, 200)
  112. # assert that new read was created
  113. self.assertEqual(self.user.categoryread_set.count(), 1)
  114. read = self.user.categoryread_set.order_by('id').last()
  115. self.assertEqual(read.category_id, self.category.id)
  116. self.assertTrue(read.last_read_on > timezone.now() - timedelta(seconds=3))
  117. def test_read_root_category(self):
  118. """category read api reads root category"""
  119. category = Category.objects.root_category()
  120. api_link = reverse('misago:api:category-read', kwargs={
  121. 'pk': category.pk
  122. })
  123. # clean reads
  124. self.user.categoryread_set.all().delete()
  125. self.assertEqual(self.user.categoryread_set.count(), 0)
  126. # call api
  127. response = self.client.post(api_link)
  128. self.assertEqual(response.status_code, 200)
  129. # assert that new read for subcategory was created
  130. self.assertEqual(self.user.categoryread_set.count(), 1)
  131. read = self.user.categoryread_set.order_by('id').last()
  132. self.assertEqual(read.category_id, self.category.id)
  133. self.assertTrue(read.last_read_on > timezone.now() - timedelta(seconds=3))