Browse Source

Move misago.acl admin logic to misago.acl.admin

rafalp 6 years ago
parent
commit
101c98017a

+ 0 - 0
misago/acl/admin.py → misago/acl/admin/__init__.py


+ 2 - 2
misago/acl/forms.py → misago/acl/admin/forms.py

@@ -1,8 +1,8 @@
 from django import forms
 from django import forms
 from django.utils.translation import gettext_lazy as _
 from django.utils.translation import gettext_lazy as _
 
 
-from .models import Role
-from .providers import providers
+from ..models import Role
+from ..providers import providers
 
 
 
 
 class RoleForm(forms.ModelForm):
 class RoleForm(forms.ModelForm):

+ 18 - 0
misago/acl/admin/test.py

@@ -0,0 +1,18 @@
+from .forms import get_permissions_forms
+
+
+def mock_role_form_data(model, data):
+    """
+    In order for form to don't fail submission, all permission fields need
+    to receive values. This function populates data dict with default values
+    for permissions, making form validation pass
+    """
+    for form in get_permissions_forms(model):
+        for field in form:
+            if field.value() is True:
+                data[field.html_name] = 1
+            elif field.value() is False:
+                data[field.html_name] = 0
+            else:
+                data[field.html_name] = field.value()
+    return data

+ 0 - 0
misago/acl/admin/tests/__init__.py


+ 104 - 0
misago/acl/admin/tests/test_admin_views.py

@@ -0,0 +1,104 @@
+import pytest
+from django.urls import reverse
+
+from ....admin.test import AdminTestCase
+from ....cache.test import assert_invalidates_cache
+from ....test import assert_contains
+from ... import ACL_CACHE
+from ...models import Role
+from ..test import mock_role_form_data
+
+admin_link = reverse("misago:admin:permissions:index")
+
+
+def create_form_data(data_dict):
+    return mock_role_form_data(Role(), data_dict)
+
+
+def test_link_is_registered_in_admin_nav(admin_client):
+    response = admin_client.get(reverse("misago:admin:index"))
+    assert_contains(response, admin_link)
+
+
+def test_list_renders(admin_client):
+    response = admin_client.get(admin_link)
+    assert response.status_code == 200
+
+
+def test_new_role_form_renders(admin_client):
+    response = admin_client.get(reverse("misago:admin:permissions:new"))
+    assert response.status_code == 200
+
+
+def test_new_role_can_be_created(admin_client):
+    response = admin_client.post(
+        reverse("misago:admin:permissions:new"),
+        data=create_form_data({"name": "Test Role"}),
+    )
+
+    Role.objects.get(name="Test Role")
+
+
+@pytest.fixture
+def role(db):
+    return Role.objects.create(name="Test Role")
+
+
+def test_edit_role_form_renders(admin_client, role):
+    response = admin_client.get(
+        reverse("misago:admin:permissions:edit", kwargs={"pk": role.pk})
+    )
+    assert response.status_code == 200
+
+
+def test_role_can_be_edited(admin_client, role):
+    response = admin_client.post(
+        reverse("misago:admin:permissions:edit", kwargs={"pk": role.pk}),
+        data=create_form_data({"name": "Edited Role"}),
+    )
+
+    role.refresh_from_db()
+    assert role.name == "Edited Role"
+
+
+def test_editing_role_invalidates_acl_cache(admin_client, role):
+    with assert_invalidates_cache(ACL_CACHE):
+        admin_client.post(
+            reverse("misago:admin:permissions:edit", kwargs={"pk": role.pk}),
+            data=create_form_data({"name": "Role"}),
+        )
+
+
+def test_role_can_be_deleted(admin_client, role):
+    admin_client.post(
+        reverse("misago:admin:permissions:delete", kwargs={"pk": role.pk})
+    )
+
+    with pytest.raises(Role.DoesNotExist):
+        role.refresh_from_db()
+
+
+def test_special_role_cant_be_deleted(admin_client, role):
+    role.special_role = "Test"
+    role.save()
+
+    admin_client.post(
+        reverse("misago:admin:permissions:delete", kwargs={"pk": role.pk})
+    )
+
+    role.refresh_from_db()
+
+
+def test_deleting_role_invalidates_acl_cache(admin_client, role):
+    with assert_invalidates_cache(ACL_CACHE):
+        admin_client.post(
+            reverse("misago:admin:permissions:delete", kwargs={"pk": role.pk})
+        )
+
+
+def test_users_with_role_view_redirects_to_admin_users_list(admin_client, role):
+    response = admin_client.get(
+        reverse("misago:admin:permissions:users", kwargs={"pk": role.pk})
+    )
+    assert response.status_code == 302
+    assert reverse("misago:admin:users:index") in response["location"]

+ 1 - 1
misago/acl/tests/test_mock_role_admin_form_data.py → misago/acl/admin/tests/test_mock_role_admin_form_data.py

@@ -1,4 +1,4 @@
-from ..models import Role
+from ...models import Role
 from ..test import mock_role_form_data
 from ..test import mock_role_form_data
 
 
 
 

+ 2 - 2
misago/acl/views.py → misago/acl/admin/views.py

@@ -3,9 +3,9 @@ from django.shortcuts import redirect
 from django.urls import reverse
 from django.urls import reverse
 from django.utils.translation import gettext_lazy as _
 from django.utils.translation import gettext_lazy as _
 
 
-from ..admin.views import generic
+from ...admin.views import generic
+from ..models import Role
 from .forms import RoleForm, get_permissions_forms
 from .forms import RoleForm, get_permissions_forms
-from .models import Role
 
 
 
 
 class RoleAdmin(generic.AdminBaseMixin):
 class RoleAdmin(generic.AdminBaseMixin):

+ 0 - 18
misago/acl/test.py

@@ -1,7 +1,6 @@
 from contextlib import ContextDecorator, ExitStack, contextmanager
 from contextlib import ContextDecorator, ExitStack, contextmanager
 from unittest.mock import patch
 from unittest.mock import patch
 
 
-from .forms import get_permissions_forms
 from .useracl import get_user_acl
 from .useracl import get_user_acl
 
 
 __all__ = ["patch_user_acl"]
 __all__ = ["patch_user_acl"]
@@ -53,20 +52,3 @@ class patch_user_acl(ContextDecorator, ExitStack):
         return patch(
         return patch(
             "misago.acl.useracl.get_user_acl", side_effect=self.patched_get_user_acl
             "misago.acl.useracl.get_user_acl", side_effect=self.patched_get_user_acl
         )
         )
-
-
-def mock_role_form_data(model, data):
-    """
-    In order for form to don't fail submission, all permission fields need
-    to receive values. This function populates data dict with default values
-    for permissions, making form validation pass
-    """
-    for form in get_permissions_forms(model):
-        for field in form:
-            if field.value() is True:
-                data[field.html_name] = 1
-            elif field.value() is False:
-                data[field.html_name] = 0
-            else:
-                data[field.html_name] = field.value()
-    return data

+ 0 - 123
misago/acl/tests/test_roleadmin_views.py

@@ -1,123 +0,0 @@
-from django.urls import reverse
-
-from .. import ACL_CACHE
-from ...admin.test import AdminTestCase
-from ...cache.test import assert_invalidates_cache
-from ..models import Role
-from ..test import mock_role_form_data
-
-
-def create_data(data_dict):
-    return mock_role_form_data(Role(), data_dict)
-
-
-class RoleAdminViewsTests(AdminTestCase):
-    def test_link_registered(self):
-        """admin nav contains user roles link"""
-        response = self.client.get(reverse("misago:admin:permissions:index"))
-        self.assertContains(response, reverse("misago:admin:permissions:index"))
-
-    def test_list_view(self):
-        """roles list view returns 200"""
-        response = self.client.get(reverse("misago:admin:permissions: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:new"))
-        self.assertEqual(response.status_code, 200)
-
-        response = self.client.post(
-            reverse("misago:admin:permissions:new"),
-            data=create_data({"name": "Test Role"}),
-        )
-        self.assertEqual(response.status_code, 302)
-
-        test_role = Role.objects.get(name="Test Role")
-        response = self.client.get(reverse("misago:admin:permissions:index"))
-        self.assertEqual(response.status_code, 200)
-        self.assertContains(response, test_role.name)
-
-    def test_edit_view(self):
-        """edit role view has no showstoppers"""
-        self.client.post(
-            reverse("misago:admin:permissions:new"),
-            data=create_data({"name": "Test Role"}),
-        )
-
-        test_role = Role.objects.get(name="Test Role")
-
-        response = self.client.get(
-            reverse("misago:admin:permissions:edit", kwargs={"pk": test_role.pk})
-        )
-        self.assertEqual(response.status_code, 200)
-        self.assertContains(response, "Test Role")
-
-        response = self.client.post(
-            reverse("misago:admin:permissions:edit", kwargs={"pk": test_role.pk}),
-            data=create_data({"name": "Top Lel"}),
-        )
-        self.assertEqual(response.status_code, 302)
-
-        test_role = Role.objects.get(name="Top Lel")
-        response = self.client.get(reverse("misago:admin:permissions:index"))
-        self.assertEqual(response.status_code, 200)
-        self.assertContains(response, test_role.name)
-
-    def test_editing_role_invalidates_acl_cache(self):
-        self.client.post(
-            reverse("misago:admin:permissions:new"),
-            data=create_data({"name": "Test Role"}),
-        )
-
-        test_role = Role.objects.get(name="Test Role")
-
-        with assert_invalidates_cache(ACL_CACHE):
-            self.client.post(
-                reverse("misago:admin:permissions:edit", kwargs={"pk": test_role.pk}),
-                data=create_data({"name": "Top Lel"}),
-            )
-
-    def test_users_view(self):
-        """users with this role view has no showstoppers"""
-        response = self.client.post(
-            reverse("misago:admin:permissions:new"),
-            data=create_data({"name": "Test Role"}),
-        )
-        test_role = Role.objects.get(name="Test Role")
-
-        response = self.client.get(
-            reverse("misago:admin:permissions:users", kwargs={"pk": test_role.pk})
-        )
-        self.assertEqual(response.status_code, 302)
-
-    def test_delete_view(self):
-        """delete role view has no showstoppers"""
-        self.client.post(
-            reverse("misago:admin:permissions:new"),
-            data=create_data({"name": "Test Role"}),
-        )
-
-        test_role = Role.objects.get(name="Test Role")
-        response = self.client.post(
-            reverse("misago:admin:permissions:delete", kwargs={"pk": test_role.pk})
-        )
-        self.assertEqual(response.status_code, 302)
-
-        # Get the page twice so no alert is renderered on second request
-        self.client.get(reverse("misago:admin:permissions:index"))
-        response = self.client.get(reverse("misago:admin:permissions:index"))
-        self.assertNotContains(response, test_role.name)
-
-    def test_deleting_role_invalidates_acl_cache(self):
-        self.client.post(
-            reverse("misago:admin:permissions:new"),
-            data=create_data({"name": "Test Role"}),
-        )
-
-        test_role = Role.objects.get(name="Test Role")
-
-        with assert_invalidates_cache(ACL_CACHE):
-            self.client.post(
-                reverse("misago:admin:permissions:delete", kwargs={"pk": test_role.pk})
-            )

+ 1 - 1
misago/categories/tests/test_permissions_admin_views.py

@@ -2,7 +2,7 @@ from django.urls import reverse
 
 
 from ...acl import ACL_CACHE
 from ...acl import ACL_CACHE
 from ...acl.models import Role
 from ...acl.models import Role
-from ...acl.test import mock_role_form_data
+from ...acl.admin.test import mock_role_form_data
 from ...admin.test import AdminTestCase
 from ...admin.test import AdminTestCase
 from ...cache.test import assert_invalidates_cache
 from ...cache.test import assert_invalidates_cache
 from ..models import Category, CategoryRole
 from ..models import Category, CategoryRole

+ 2 - 2
misago/categories/views/permsadmin.py

@@ -2,10 +2,10 @@ from django.contrib import messages
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.utils.translation import gettext_lazy as _
 from django.utils.translation import gettext_lazy as _
 
 
+from ...acl.admin.forms import get_permissions_forms
+from ...acl.admin.views import RoleAdmin, RolesList
 from ...acl.cache import clear_acl_cache
 from ...acl.cache import clear_acl_cache
-from ...acl.forms import get_permissions_forms
 from ...acl.models import Role
 from ...acl.models import Role
-from ...acl.views import RoleAdmin, RolesList
 from ...admin.views import generic
 from ...admin.views import generic
 from ..forms import (
 from ..forms import (
     CategoryRoleForm,
     CategoryRoleForm,