123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377 |
- from django.urls import reverse
- from ...acl import ACL_CACHE
- from ...acl.models import Role
- from ...acl.test import mock_role_form_data
- from ...admin.test import AdminTestCase
- from ...cache.test import assert_invalidates_cache
- from ..models import Category, CategoryRole
- def create_data(data_dict):
- return mock_role_form_data(CategoryRole(), data_dict)
- class CategoryRoleAdminViewsTests(AdminTestCase):
- def test_link_registered(self):
- """admin nav contains category roles link"""
- response = self.client.get(reverse("misago:admin:permissions:categories:index"))
- self.assertContains(
- response, reverse("misago:admin:permissions:categories:index")
- )
- def test_list_view(self):
- """roles list view returns 200"""
- response = self.client.get(reverse("misago:admin:permissions:categories:index"))
- self.assertEqual(response.status_code, 200)
- def test_new_view(self):
- """new role view has no showstoppers"""
- response = self.client.get(reverse("misago:admin:permissions:categories:new"))
- self.assertEqual(response.status_code, 200)
- response = self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test CategoryRole"}),
- )
- self.assertEqual(response.status_code, 302)
- test_role = CategoryRole.objects.get(name="Test CategoryRole")
- response = self.client.get(reverse("misago:admin:permissions:categories:index"))
- self.assertContains(response, test_role.name)
- def test_edit_view(self):
- """edit role view has no showstoppers"""
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test CategoryRole"}),
- )
- test_role = CategoryRole.objects.get(name="Test CategoryRole")
- response = self.client.get(
- reverse(
- "misago:admin:permissions:categories:edit", kwargs={"pk": test_role.pk}
- )
- )
- self.assertContains(response, "Test CategoryRole")
- response = self.client.post(
- reverse(
- "misago:admin:permissions:categories:edit", kwargs={"pk": test_role.pk}
- ),
- data=create_data({"name": "Top Lel"}),
- )
- self.assertEqual(response.status_code, 302)
- test_role = CategoryRole.objects.get(name="Top Lel")
- response = self.client.get(reverse("misago:admin:permissions:categories:index"))
- self.assertContains(response, test_role.name)
- def test_editing_role_invalidates_acl_cache(self):
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test CategoryRole"}),
- )
- test_role = CategoryRole.objects.get(name="Test CategoryRole")
- with assert_invalidates_cache(ACL_CACHE):
- self.client.post(
- reverse(
- "misago:admin:permissions:categories:edit",
- kwargs={"pk": test_role.pk},
- ),
- data=create_data({"name": "Top Lel"}),
- )
- def test_delete_view(self):
- """delete role view has no showstoppers"""
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test CategoryRole"}),
- )
- test_role = CategoryRole.objects.get(name="Test CategoryRole")
- response = self.client.post(
- reverse(
- "misago:admin:permissions:categories:delete",
- kwargs={"pk": test_role.pk},
- )
- )
- self.assertEqual(response.status_code, 302)
- self.client.get(reverse("misago:admin:permissions:categories:index"))
- response = self.client.get(reverse("misago:admin:permissions:categories:index"))
- self.assertNotContains(response, test_role.name)
- def test_deleting_role_invalidates_acl_cache(self):
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test CategoryRole"}),
- )
- test_role = CategoryRole.objects.get(name="Test CategoryRole")
- with assert_invalidates_cache(ACL_CACHE):
- self.client.post(
- reverse(
- "misago:admin:permissions:categories:delete",
- kwargs={"pk": test_role.pk},
- )
- )
- def test_change_category_roles_view(self):
- """change category roles perms view works"""
- root = Category.objects.root_category()
- for descendant in root.get_descendants():
- descendant.delete()
- # Create categories tree for test cases:
- #
- # Category A
- # + Category B
- # Category C
- # + Category D
- root = Category.objects.root_category()
- self.client.post(
- reverse("misago:admin:categories:nodes:new"),
- data={
- "name": "Category A",
- "new_parent": root.pk,
- "prune_started_after": 0,
- "prune_replied_after": 0,
- },
- )
- test_category = Category.objects.get(slug="category-a")
- self.assertEqual(Category.objects.count(), 3)
- # Create test roles
- self.client.post(
- reverse("misago:admin:permissions:users:new"),
- data=mock_role_form_data(Role(), {"name": "Test Role A"}),
- )
- self.client.post(
- reverse("misago:admin:permissions:users:new"),
- data=mock_role_form_data(Role(), {"name": "Test Role B"}),
- )
- test_role_a = Role.objects.get(name="Test Role A")
- test_role_b = Role.objects.get(name="Test Role B")
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test Comments"}),
- )
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test Full"}),
- )
- role_comments = CategoryRole.objects.get(name="Test Comments")
- role_full = CategoryRole.objects.get(name="Test Full")
- # Test view itself
- # See if form page is rendered
- response = self.client.get(
- reverse(
- "misago:admin:categories:nodes:permissions",
- kwargs={"pk": test_category.pk},
- )
- )
- self.assertContains(response, test_category.name)
- self.assertContains(response, test_role_a.name)
- self.assertContains(response, test_role_b.name)
- self.assertContains(response, role_comments.name)
- self.assertContains(response, role_full.name)
- # Assign roles to categories
- response = self.client.post(
- reverse(
- "misago:admin:categories:nodes:permissions",
- kwargs={"pk": test_category.pk},
- ),
- data={
- ("%s-category_role" % test_role_a.pk): role_full.pk,
- ("%s-category_role" % test_role_b.pk): role_comments.pk,
- },
- )
- self.assertEqual(response.status_code, 302)
- # Check that roles were assigned
- category_role_set = test_category.category_role_set
- self.assertEqual(
- category_role_set.get(role=test_role_a).category_role_id, role_full.pk
- )
- self.assertEqual(
- category_role_set.get(role=test_role_b).category_role_id, role_comments.pk
- )
- # Check that ACL was invalidated
- with assert_invalidates_cache(ACL_CACHE):
- self.client.post(
- reverse(
- "misago:admin:categories:nodes:permissions",
- kwargs={"pk": test_category.pk},
- ),
- data={
- ("%s-category_role" % test_role_a.pk): role_full.pk,
- ("%s-category_role" % test_role_b.pk): role_comments.pk,
- },
- )
- def test_change_role_categories_permissions_view(self):
- """change role categories perms view works"""
- self.client.post(
- reverse("misago:admin:permissions:users:new"),
- data=mock_role_form_data(Role(), {"name": "Test CategoryRole"}),
- )
- test_role = Role.objects.get(name="Test CategoryRole")
- root = Category.objects.root_category()
- for descendant in root.get_descendants():
- descendant.delete()
- self.assertEqual(Category.objects.count(), 2)
- response = self.client.get(
- reverse(
- "misago:admin:permissions:users:categories", kwargs={"pk": test_role.pk}
- )
- )
- self.assertEqual(response.status_code, 302)
- # Create categories tree for test cases:
- #
- # Category A
- # + Category B
- # Category C
- # + Category D
- root = Category.objects.root_category()
- self.client.post(
- reverse("misago:admin:categories:nodes:new"),
- data={
- "name": "Category A",
- "new_parent": root.pk,
- "prune_started_after": 0,
- "prune_replied_after": 0,
- },
- )
- self.client.post(
- reverse("misago:admin:categories:nodes:new"),
- data={
- "name": "Category C",
- "new_parent": root.pk,
- "prune_started_after": 0,
- "prune_replied_after": 0,
- },
- )
- category_a = Category.objects.get(slug="category-a")
- category_c = Category.objects.get(slug="category-c")
- self.client.post(
- reverse("misago:admin:categories:nodes:new"),
- data={
- "name": "Category B",
- "new_parent": category_a.pk,
- "prune_started_after": 0,
- "prune_replied_after": 0,
- },
- )
- category_b = Category.objects.get(slug="category-b")
- self.client.post(
- reverse("misago:admin:categories:nodes:new"),
- data={
- "name": "Category D",
- "new_parent": category_c.pk,
- "prune_started_after": 0,
- "prune_replied_after": 0,
- },
- )
- category_d = Category.objects.get(slug="category-d")
- self.assertEqual(Category.objects.count(), 6)
- # See if form page is rendered
- response = self.client.get(
- reverse(
- "misago:admin:permissions:users:categories", kwargs={"pk": test_role.pk}
- )
- )
- self.assertContains(response, category_a.name)
- self.assertContains(response, category_b.name)
- self.assertContains(response, category_c.name)
- self.assertContains(response, category_d.name)
- # Set test roles
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test Comments"}),
- )
- role_comments = CategoryRole.objects.get(name="Test Comments")
- self.client.post(
- reverse("misago:admin:permissions:categories:new"),
- data=create_data({"name": "Test Full"}),
- )
- role_full = CategoryRole.objects.get(name="Test Full")
- # See if form contains those roles
- response = self.client.get(
- reverse(
- "misago:admin:permissions:users:categories", kwargs={"pk": test_role.pk}
- )
- )
- self.assertContains(response, role_comments.name)
- self.assertContains(response, role_full.name)
- # Assign roles to categories
- response = self.client.post(
- reverse(
- "misago:admin:permissions:users:categories", kwargs={"pk": test_role.pk}
- ),
- data={
- ("%s-role" % category_a.pk): role_comments.pk,
- ("%s-role" % category_b.pk): role_comments.pk,
- ("%s-role" % category_c.pk): role_full.pk,
- ("%s-role" % category_d.pk): role_full.pk,
- },
- )
- self.assertEqual(response.status_code, 302)
- # Check that roles were assigned
- categories_acls = test_role.categories_acls
- self.assertEqual(
- categories_acls.get(category=category_a).category_role_id, role_comments.pk
- )
- self.assertEqual(
- categories_acls.get(category=category_b).category_role_id, role_comments.pk
- )
- self.assertEqual(
- categories_acls.get(category=category_c).category_role_id, role_full.pk
- )
- self.assertEqual(
- categories_acls.get(category=category_d).category_role_id, role_full.pk
- )
- # Check that ACL was invalidated
- with assert_invalidates_cache(ACL_CACHE):
- self.client.post(
- reverse(
- "misago:admin:permissions:users:categories",
- kwargs={"pk": test_role.pk},
- ),
- data={
- ("%s-role" % category_a.pk): role_comments.pk,
- ("%s-role" % category_b.pk): role_comments.pk,
- ("%s-role" % category_c.pk): role_full.pk,
- ("%s-role" % category_d.pk): role_full.pk,
- },
- )
|