Fix and improve test for the ACL app
Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
from mayan.apps.permissions.tests.mixins import RoleTestCaseMixin
|
||||
@@ -21,6 +22,30 @@ class ACLTestCaseMixin(RoleTestCaseMixin, UserTestCaseMixin):
|
||||
'in order to enable the usage of ACLs in tests.'
|
||||
)
|
||||
|
||||
return AccessControlList.objects.grant(
|
||||
self._test_case_acl = AccessControlList.objects.grant(
|
||||
obj=obj, permission=permission, role=self._test_case_role
|
||||
)
|
||||
|
||||
|
||||
class ACLTestMixin(object):
|
||||
auto_create_test_role = True
|
||||
|
||||
def _create_test_acl(self):
|
||||
self.test_acl = AccessControlList.objects.create(
|
||||
content_object=self.test_object, role=self.test_role
|
||||
)
|
||||
|
||||
def setUp(self):
|
||||
super(ACLTestMixin, self).setUp()
|
||||
if self.auto_create_test_role:
|
||||
self._create_test_role()
|
||||
|
||||
self.test_object = self.document
|
||||
|
||||
content_type = ContentType.objects.get_for_model(self.test_object)
|
||||
|
||||
self.test_content_object_view_kwargs = {
|
||||
'app_label': content_type.app_label,
|
||||
'model': content_type.model,
|
||||
'object_id': self.test_object.pk
|
||||
}
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.urls import reverse
|
||||
|
||||
from mayan.apps.documents.tests import GenericDocumentViewTestCase
|
||||
@@ -8,35 +7,34 @@ from mayan.apps.documents.tests import GenericDocumentViewTestCase
|
||||
from ..links import (
|
||||
link_acl_create, link_acl_delete, link_acl_list, link_acl_permissions
|
||||
)
|
||||
from ..models import AccessControlList
|
||||
from ..permissions import permission_acl_edit, permission_acl_view
|
||||
|
||||
from .mixins import ACLTestMixin
|
||||
|
||||
class ACLsLinksTestCase(GenericDocumentViewTestCase):
|
||||
def test_document_acl_create_link(self):
|
||||
self.grant_access(obj=self.document, permission=permission_acl_edit)
|
||||
|
||||
self.add_test_view(test_object=self.document)
|
||||
class ACLsLinksTestCase(ACLTestMixin, GenericDocumentViewTestCase):
|
||||
auto_create_test_role = False
|
||||
|
||||
def test_object_acl_create_link(self):
|
||||
self.grant_access(obj=self.test_object, permission=permission_acl_edit)
|
||||
|
||||
self.add_test_view(test_object=self.test_object)
|
||||
context = self.get_test_view()
|
||||
resolved_link = link_acl_create.resolve(context=context)
|
||||
|
||||
self.assertNotEqual(resolved_link, None)
|
||||
|
||||
content_type = ContentType.objects.get_for_model(self.document)
|
||||
kwargs = {
|
||||
'app_label': content_type.app_label,
|
||||
'model': content_type.model,
|
||||
'object_id': self.document.pk
|
||||
}
|
||||
|
||||
self.assertEqual(
|
||||
resolved_link.url, reverse(viewname='acls:acl_create', kwargs=kwargs)
|
||||
resolved_link.url, reverse(
|
||||
viewname='acls:acl_create',
|
||||
kwargs=self.test_content_object_view_kwargs
|
||||
)
|
||||
)
|
||||
|
||||
def test_document_acl_delete_link(self):
|
||||
self.grant_access(obj=self.document, permission=permission_acl_edit)
|
||||
def test_object_acl_delete_link(self):
|
||||
self.grant_access(obj=self.test_object, permission=permission_acl_edit)
|
||||
|
||||
self.add_test_view(test_object=acl)
|
||||
self.add_test_view(test_object=self._test_case_acl)
|
||||
context = self.get_test_view()
|
||||
resolved_link = link_acl_delete.resolve(context=context)
|
||||
|
||||
@@ -44,14 +42,15 @@ class ACLsLinksTestCase(GenericDocumentViewTestCase):
|
||||
|
||||
self.assertEqual(
|
||||
resolved_link.url, reverse(
|
||||
viewname='acls:acl_delete', kwargs={'acl_id': acl.pk}
|
||||
viewname='acls:acl_delete',
|
||||
kwargs={'acl_id': self._test_case_acl.pk}
|
||||
)
|
||||
)
|
||||
|
||||
def test_document_acl_edit_link(self):
|
||||
self.grant_access(obj=self.document, permission=permission_acl_edit)
|
||||
def test_object_acl_edit_link(self):
|
||||
self.grant_access(obj=self.test_object, permission=permission_acl_edit)
|
||||
|
||||
self.add_test_view(test_object=acl)
|
||||
self.add_test_view(test_object=self._test_case_acl)
|
||||
context = self.get_test_view()
|
||||
resolved_link = link_acl_permissions.resolve(context=context)
|
||||
|
||||
@@ -59,26 +58,23 @@ class ACLsLinksTestCase(GenericDocumentViewTestCase):
|
||||
|
||||
self.assertEqual(
|
||||
resolved_link.url, reverse(
|
||||
viewname='acls:acl_permissions', kwargs={'acl_id': acl.pk}
|
||||
viewname='acls:acl_permissions',
|
||||
kwargs={'acl_id': self._test_case_acl.pk}
|
||||
)
|
||||
)
|
||||
|
||||
def test_document_acl_list_link(self):
|
||||
self.grant_access(obj=self.document, permission=permission_acl_view)
|
||||
def test_object_acl_list_link(self):
|
||||
self.grant_access(obj=self.test_object, permission=permission_acl_view)
|
||||
|
||||
self.add_test_view(test_object=self.document)
|
||||
self.add_test_view(test_object=self.test_object)
|
||||
context = self.get_test_view()
|
||||
resolved_link = link_acl_list.resolve(context=context)
|
||||
|
||||
self.assertNotEqual(resolved_link, None)
|
||||
|
||||
content_type = ContentType.objects.get_for_model(self.document)
|
||||
kwargs = {
|
||||
'app_label': content_type.app_label,
|
||||
'model': content_type.model,
|
||||
'object_id': self.document.pk
|
||||
}
|
||||
|
||||
self.assertEqual(
|
||||
resolved_link.url, reverse(viewname='acls:acl_list', kwargs=kwargs)
|
||||
resolved_link.url, reverse(
|
||||
viewname='acls:acl_list',
|
||||
kwargs=self.test_content_object_view_kwargs
|
||||
)
|
||||
)
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.utils.encoding import force_text
|
||||
|
||||
from mayan.apps.documents.tests import GenericDocumentViewTestCase
|
||||
@@ -9,70 +8,57 @@ from mayan.apps.permissions.tests.mixins import RoleTestMixin
|
||||
from ..models import AccessControlList
|
||||
from ..permissions import permission_acl_edit, permission_acl_view
|
||||
|
||||
from .mixins import ACLTestMixin
|
||||
|
||||
class AccessControlListViewTestCase(RoleTestMixin, GenericDocumentViewTestCase):
|
||||
def setUp(self):
|
||||
super(AccessControlListViewTestCase, self).setUp()
|
||||
self.login_user()
|
||||
self._create_test_role()
|
||||
|
||||
self.test_object = self.document
|
||||
|
||||
content_type = ContentType.objects.get_for_model(self.test_object)
|
||||
|
||||
self.view_content_object_arguments = {
|
||||
'app_label': content_type.app_label,
|
||||
'model': content_type.model,
|
||||
'object_id': self.test_object.pk
|
||||
}
|
||||
|
||||
def _request_get_acl_create_view(self):
|
||||
class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocumentViewTestCase):
|
||||
def _request_acl_create_get_view(self):
|
||||
return self.get(
|
||||
viewname='acls:acl_create',
|
||||
kwargs=self.view_content_object_arguments, data={
|
||||
kwargs=self.test_content_object_view_kwargs, data={
|
||||
'role': self.test_role.pk
|
||||
}
|
||||
)
|
||||
|
||||
def test_acl_create_view_get_no_permission(self):
|
||||
response = self._request_get_acl_create_view()
|
||||
def test_acl_create_get_view_no_permission(self):
|
||||
response = self._request_acl_create_get_view()
|
||||
|
||||
self.assertEqual(response.status_code, 404)
|
||||
self.assertEqual(AccessControlList.objects.count(), 0)
|
||||
|
||||
def test_acl_create_view_get_with_document_access(self):
|
||||
def test_acl_create_get_view_with_document_access(self):
|
||||
self.grant_access(obj=self.test_object, permission=permission_acl_edit)
|
||||
|
||||
response = self._request_get_acl_create_view()
|
||||
|
||||
response = self._request_acl_create_get_view()
|
||||
self.assertContains(
|
||||
response=response, text=force_text(self.test_object),
|
||||
status_code=200
|
||||
)
|
||||
|
||||
def _request_post_acl_create_view(self):
|
||||
def _request_acl_create_post_view(self):
|
||||
return self.post(
|
||||
viewname='acls:acl_create',
|
||||
kwargs=self.view_content_object_arguments, data={
|
||||
kwargs=self.test_content_object_view_kwargs, data={
|
||||
'role': self.test_role.pk
|
||||
}
|
||||
)
|
||||
|
||||
def test_acl_create_view_post_no_permission(self):
|
||||
response = self._request_post_acl_create_view()
|
||||
response = self._request_acl_create_post_view()
|
||||
|
||||
self.assertEqual(response.status_code, 404)
|
||||
self.assertEqual(AccessControlList.objects.count(), 0)
|
||||
|
||||
def test_acl_create_view_post_with_document_access(self):
|
||||
def test_acl_create_view_post_with_access(self):
|
||||
self.grant_access(obj=self.test_object, permission=permission_acl_edit)
|
||||
response = self._request_post_acl_create_view()
|
||||
|
||||
response = self._request_acl_create_post_view()
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
# 2 ACLs: 1 created by the test and the other by the self.grant_access
|
||||
self.assertEqual(AccessControlList.objects.count(), 2)
|
||||
|
||||
def test_acl_create_duplicate_view_with_permission(self):
|
||||
def test_acl_create_duplicate_view_with_access(self):
|
||||
"""
|
||||
Test creating a duplicate ACL entry: same object & role
|
||||
Result: Should redirect to existing ACL for object + role combination
|
||||
@@ -81,20 +67,36 @@ class AccessControlListViewTestCase(RoleTestMixin, GenericDocumentViewTestCase):
|
||||
|
||||
self.grant_access(obj=self.test_object, permission=permission_acl_edit)
|
||||
|
||||
response = self._request_post_acl_create_view()
|
||||
response = self._request_acl_create_post_view()
|
||||
self.assertNotContains(
|
||||
response=response, text=force_text(self.test_acl.role),
|
||||
status_code=200
|
||||
)
|
||||
|
||||
# 2 ACLs: 1 created by the test and the other by the self.grant_access
|
||||
self.assertEqual(AccessControlList.objects.count(), 2)
|
||||
self.assertEqual(
|
||||
AccessControlList.objects.first().pk, self.test_acl.pk
|
||||
|
||||
# Sorted by role PK
|
||||
expected_results = sorted(
|
||||
[
|
||||
{
|
||||
# Test role, created and then requested,
|
||||
# but created only once
|
||||
'object_id': self.test_object.pk,
|
||||
'role': self.test_role.pk
|
||||
},
|
||||
{
|
||||
# Test case ACL for the test case role, ignored
|
||||
'object_id': self.test_object.pk,
|
||||
'role': self._test_case_role.pk
|
||||
},
|
||||
], key=lambda item: item['role']
|
||||
)
|
||||
|
||||
def _create_test_acl(self):
|
||||
self.test_acl = AccessControlList.objects.create(
|
||||
content_object=self.test_object, role=self.test_role
|
||||
self.assertQuerysetEqual(
|
||||
qs=AccessControlList.objects.order_by('role__id').values(
|
||||
'object_id', 'role',
|
||||
), transform=dict, values=expected_results
|
||||
)
|
||||
|
||||
def _request_acl_delete_view(self):
|
||||
@@ -110,6 +112,7 @@ class AccessControlListViewTestCase(RoleTestMixin, GenericDocumentViewTestCase):
|
||||
response=response, text=force_text(self.test_object),
|
||||
status_code=404
|
||||
)
|
||||
|
||||
# 1 ACL: the test one
|
||||
self.assertQuerysetEqual(
|
||||
qs=AccessControlList.objects.all(), values=(repr(self.test_acl),)
|
||||
@@ -118,19 +121,23 @@ class AccessControlListViewTestCase(RoleTestMixin, GenericDocumentViewTestCase):
|
||||
def test_acl_delete_view_with_access(self):
|
||||
self._create_test_acl()
|
||||
|
||||
acl = self.grant_access(
|
||||
self.grant_access(
|
||||
obj=self.test_object, permission=permission_acl_edit
|
||||
)
|
||||
|
||||
response = self._request_acl_delete_view()
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
# 1 ACL: the one created by the self.grant_access
|
||||
self.assertQuerysetEqual(
|
||||
qs=AccessControlList.objects.all(), values=(repr(acl),)
|
||||
qs=AccessControlList.objects.all(), values=(
|
||||
repr(self._test_case_acl),
|
||||
)
|
||||
)
|
||||
|
||||
def _request_acl_list_view(self):
|
||||
return self.get(
|
||||
viewname='acls:acl_list', kwargs=self.view_content_object_arguments
|
||||
viewname='acls:acl_list', kwargs=self.test_content_object_view_kwargs
|
||||
)
|
||||
|
||||
def test_acl_list_view_no_permission(self):
|
||||
|
||||
Reference in New Issue
Block a user