Finish fixing failing ACL app tests

Signed-off-by: Roberto Rosario <Roberto.Rosario@mayan-edms.com>
This commit is contained in:
Roberto Rosario
2019-03-04 16:20:12 -04:00
parent 2a1e060907
commit 378511aea3
8 changed files with 133 additions and 64 deletions
+1 -1
View File
@@ -21,7 +21,7 @@ def get_kwargs_factory(variable_name):
) )
return { return {
'app_label': '"{}"'.format(content_type.app_label), 'app_label': '"{}"'.format(content_type.app_label),
'model': '"{}"'.format(content_type.model), 'model_name': '"{}"'.format(content_type.model),
'object_id': '{}.pk'.format(variable_name) 'object_id': '{}.pk'.format(variable_name)
} }
+25 -2
View File
@@ -3,10 +3,15 @@ from __future__ import unicode_literals
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from mayan.apps.permissions.tests.mixins import RoleTestCaseMixin from mayan.apps.common.tests.mixins import TestModelTestMixin
from mayan.apps.permissions.tests.mixins import (
PermissionTestMixin, RoleTestCaseMixin, RoleTestMixin
)
from mayan.apps.user_management.tests.mixins import UserTestCaseMixin from mayan.apps.user_management.tests.mixins import UserTestCaseMixin
from ..classes import ModelPermission
from ..models import AccessControlList from ..models import AccessControlList
from ..permissions import permission_acl_edit, permission_acl_view
class ACLTestCaseMixin(RoleTestCaseMixin, UserTestCaseMixin): class ACLTestCaseMixin(RoleTestCaseMixin, UserTestCaseMixin):
@@ -27,7 +32,7 @@ class ACLTestCaseMixin(RoleTestCaseMixin, UserTestCaseMixin):
) )
class ACLTestMixin(object): class ACLTestMixin(PermissionTestMixin, RoleTestMixin, TestModelTestMixin):
auto_create_test_role = True auto_create_test_role = True
def _create_test_acl(self): def _create_test_acl(self):
@@ -48,3 +53,21 @@ class ACLTestMixin(object):
'model_name': self.test_object_content_type.model, 'model_name': self.test_object_content_type.model,
'object_id': self.test_object.pk 'object_id': self.test_object.pk
} }
def _setup_test_object(self):
self._create_test_model()
self._create_test_object()
ModelPermission.register(
model=self.test_object._meta.model, permissions=(
permission_acl_edit, permission_acl_view,
)
)
self._create_test_permission()
ModelPermission.register(
model=self.test_object._meta.model, permissions=(
self.test_permission,
)
)
self._inject_test_object_content_type()
+2 -20
View File
@@ -2,38 +2,20 @@ from __future__ import absolute_import, unicode_literals
from rest_framework import status from rest_framework import status
from mayan.apps.common.tests.mixins import TestModelTestMixin
from mayan.apps.permissions.tests.mixins import PermissionTestMixin, RoleTestMixin
from mayan.apps.rest_api.tests import BaseAPITestCase from mayan.apps.rest_api.tests import BaseAPITestCase
from ..classes import ModelPermission
from ..models import AccessControlList from ..models import AccessControlList
from ..permissions import permission_acl_edit, permission_acl_view from ..permissions import permission_acl_edit, permission_acl_view
from .mixins import ACLTestMixin from .mixins import ACLTestMixin
class ACLAPITestCase(ACLTestMixin, RoleTestMixin, PermissionTestMixin, TestModelTestMixin, BaseAPITestCase): class ACLAPITestCase(ACLTestMixin, BaseAPITestCase):
def setUp(self): def setUp(self):
super(ACLAPITestCase, self).setUp() super(ACLAPITestCase, self).setUp()
self._setup_test_object()
self._create_test_model()
self._create_test_object()
ModelPermission.register(
model=self.test_object._meta.model, permissions=(
permission_acl_edit, permission_acl_view,
)
)
self._create_test_permission()
self._create_test_acl() self._create_test_acl()
ModelPermission.register(
model=self.test_object._meta.model, permissions=(
self.test_permission,
)
)
self.test_acl.permissions.add(self.test_permission.stored_permission) self.test_acl.permissions.add(self.test_permission.stored_permission)
self._inject_test_object_content_type()
def _request_object_acl_list_api_view(self): def _request_object_acl_list_api_view(self):
return self.get( return self.get(
+6 -2
View File
@@ -2,7 +2,7 @@ from __future__ import unicode_literals
from django.urls import reverse from django.urls import reverse
from mayan.apps.documents.tests import GenericDocumentViewTestCase from mayan.apps.common.tests import GenericViewTestCase
from ..links import ( from ..links import (
link_acl_create, link_acl_delete, link_acl_list, link_acl_permissions link_acl_create, link_acl_delete, link_acl_list, link_acl_permissions
@@ -12,9 +12,13 @@ from ..permissions import permission_acl_edit, permission_acl_view
from .mixins import ACLTestMixin from .mixins import ACLTestMixin
class ACLsLinksTestCase(ACLTestMixin, GenericDocumentViewTestCase): class AccessControlListLinksTestCase(ACLTestMixin, GenericViewTestCase):
auto_create_test_role = False auto_create_test_role = False
def setUp(self):
super(AccessControlListLinksTestCase, self).setUp()
self._setup_test_object()
def test_object_acl_create_link(self): def test_object_acl_create_link(self):
self.grant_access(obj=self.test_object, permission=permission_acl_edit) self.grant_access(obj=self.test_object, permission=permission_acl_edit)
+1 -3
View File
@@ -4,13 +4,11 @@ from django.core.exceptions import PermissionDenied
from django.db import models from django.db import models
from mayan.apps.common.tests import BaseTestCase from mayan.apps.common.tests import BaseTestCase
from mayan.apps.common.tests.mixins import TestModelTestMixin
from mayan.apps.documents.models import Document, DocumentType from mayan.apps.documents.models import Document, DocumentType
from mayan.apps.documents.permissions import permission_document_view from mayan.apps.documents.permissions import permission_document_view
from mayan.apps.documents.tests import ( from mayan.apps.documents.tests import (
DocumentTestMixin, TEST_DOCUMENT_TYPE_2_LABEL, TEST_DOCUMENT_TYPE_LABEL DocumentTestMixin, TEST_DOCUMENT_TYPE_2_LABEL, TEST_DOCUMENT_TYPE_LABEL
) )
from mayan.apps.permissions.tests.mixins import PermissionTestMixin, RoleTestMixin
from ..classes import ModelPermission from ..classes import ModelPermission
from ..models import AccessControlList from ..models import AccessControlList
@@ -157,7 +155,7 @@ class PermissionTestCase(DocumentTestMixin, BaseTestCase):
self.assertTrue(self.test_document_3 in result) self.assertTrue(self.test_document_3 in result)
class InheritedPermissionTestCase(TestModelTestMixin, PermissionTestMixin, RoleTestMixin, ACLTestMixin, BaseTestCase): class InheritedPermissionTestCase(ACLTestMixin, BaseTestCase):
def test_retrieve_inherited_role_permission_not_model_applicable(self): def test_retrieve_inherited_role_permission_not_model_applicable(self):
self._create_test_model() self._create_test_model()
self.test_object = self.TestModel.objects.create() self.test_object = self.TestModel.objects.create()
+87 -33
View File
@@ -2,16 +2,39 @@ from __future__ import absolute_import, unicode_literals
from django.utils.encoding import force_text from django.utils.encoding import force_text
from mayan.apps.documents.tests import GenericDocumentViewTestCase from mayan.apps.common.tests import GenericViewTestCase
from mayan.apps.permissions.tests.mixins import RoleTestMixin
from ..classes import ModelPermission
from ..models import AccessControlList from ..models import AccessControlList
from ..permissions import permission_acl_edit, permission_acl_view from ..permissions import permission_acl_edit, permission_acl_view
from .mixins import ACLTestMixin from .mixins import ACLTestMixin
class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocumentViewTestCase): class AccessControlListViewTestCase(ACLTestMixin, GenericViewTestCase):
def setUp(self):
super(AccessControlListViewTestCase, self).setUp()
self._create_test_model()
self._create_test_object()
ModelPermission.register(
model=self.test_object._meta.model, permissions=(
permission_acl_edit, permission_acl_view,
)
)
self._create_test_permission()
ModelPermission.register(
model=self.test_object._meta.model, permissions=(
self.test_permission,
)
)
self._inject_test_object_content_type()
self._create_test_acl()
self.test_acl.permissions.add(self.test_permission.stored_permission)
def _request_acl_create_get_view(self): def _request_acl_create_get_view(self):
return self.get( return self.get(
viewname='acls:acl_create', viewname='acls:acl_create',
@@ -21,12 +44,15 @@ class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocument
) )
def test_acl_create_get_view_no_permission(self): def test_acl_create_get_view_no_permission(self):
self.test_acl.delete()
response = self._request_acl_create_get_view() response = self._request_acl_create_get_view()
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
self.assertEqual(AccessControlList.objects.count(), 0)
def test_acl_create_get_view_with_document_access(self): self.assertFalse(self.test_object.acls.filter(role=self.test_role).exists())
def test_acl_create_get_view_with_object_access(self):
self.test_acl.delete()
self.grant_access(obj=self.test_object, permission=permission_acl_edit) self.grant_access(obj=self.test_object, permission=permission_acl_edit)
response = self._request_acl_create_get_view() response = self._request_acl_create_get_view()
@@ -35,6 +61,8 @@ class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocument
status_code=200 status_code=200
) )
self.assertFalse(self.test_object.acls.filter(role=self.test_role).exists())
def _request_acl_create_post_view(self): def _request_acl_create_post_view(self):
return self.post( return self.post(
viewname='acls:acl_create', viewname='acls:acl_create',
@@ -44,27 +72,27 @@ class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocument
) )
def test_acl_create_view_post_no_permission(self): def test_acl_create_view_post_no_permission(self):
response = self._request_acl_create_post_view() self.test_acl.delete()
response = self._request_acl_create_post_view()
self.assertEqual(response.status_code, 404) self.assertEqual(response.status_code, 404)
self.assertEqual(AccessControlList.objects.count(), 0)
self.assertFalse(self.test_object.acls.filter(role=self.test_role).exists())
def test_acl_create_view_post_with_access(self): def test_acl_create_view_post_with_access(self):
self.test_acl.delete()
self.grant_access(obj=self.test_object, permission=permission_acl_edit) self.grant_access(obj=self.test_object, permission=permission_acl_edit)
response = self._request_acl_create_post_view() response = self._request_acl_create_post_view()
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
# 2 ACLs: 1 created by the test and the other by the self.grant_access self.assertTrue(self.test_object.acls.filter(role=self.test_role).exists())
self.assertEqual(AccessControlList.objects.count(), 2)
def test_acl_create_duplicate_view_with_access(self): def test_acl_create_duplicate_view_with_access(self):
""" """
Test creating a duplicate ACL entry: same object & role Test creating a duplicate ACL entry: same object & role
Result: Should redirect to existing ACL for object + role combination Result: Should redirect to existing ACL for object + role combination
""" """
self._create_test_acl()
self.grant_access(obj=self.test_object, permission=permission_acl_edit) self.grant_access(obj=self.test_object, permission=permission_acl_edit)
response = self._request_acl_create_post_view() response = self._request_acl_create_post_view()
@@ -105,22 +133,15 @@ class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocument
) )
def test_acl_delete_view_no_permission(self): def test_acl_delete_view_no_permission(self):
self._create_test_acl()
response = self._request_acl_delete_view() response = self._request_acl_delete_view()
self.assertNotContains( self.assertNotContains(
response=response, text=force_text(self.test_object), response=response, text=force_text(self.test_object),
status_code=404 status_code=404
) )
# 1 ACL: the test one self.assertTrue(self.test_object.acls.filter(role=self.test_role).exists())
self.assertQuerysetEqual(
qs=AccessControlList.objects.all(), values=(repr(self.test_acl),)
)
def test_acl_delete_view_with_access(self): def test_acl_delete_view_with_access(self):
self._create_test_acl()
self.grant_access( self.grant_access(
obj=self.test_object, permission=permission_acl_edit obj=self.test_object, permission=permission_acl_edit
) )
@@ -128,12 +149,7 @@ class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocument
response = self._request_acl_delete_view() response = self._request_acl_delete_view()
self.assertEqual(response.status_code, 302) self.assertEqual(response.status_code, 302)
# 1 ACL: the one created by the self.grant_access self.assertFalse(self.test_object.acls.filter(role=self.test_role).exists())
self.assertQuerysetEqual(
qs=AccessControlList.objects.all(), values=(
repr(self._test_case_acl),
)
)
def _request_acl_list_view(self): def _request_acl_list_view(self):
return self.get( return self.get(
@@ -158,28 +174,66 @@ class AccessControlListViewTestCase(ACLTestMixin, RoleTestMixin, GenericDocument
status_code=200 status_code=200
) )
def _request_get_acl_permissions_view(self): def _request_get_acl_permissions_get_view(self):
return self.get( return self.get(
viewname='acls:acl_permissions', viewname='acls:acl_permissions',
kwargs={'acl_id': self.test_acl.pk} kwargs={'acl_id': self.test_acl.pk}
) )
def test_acl_permissions_view_get_no_permission(self): def test_acl_permissions_get_view_no_permission(self):
self._create_test_acl() self.test_acl.permissions.clear()
response = self._request_get_acl_permissions_view() response = self._request_get_acl_permissions_get_view()
self.assertNotContains( self.assertNotContains(
response=response, text=force_text(self.test_object), response=response, text=force_text(self.test_object),
status_code=404 status_code=404
) )
def test_acl_permissions_view_get_with_access(self): self.assertFalse(
self._create_test_acl() self.test_object.acls.filter(permissions=self.test_permission.stored_permission).exists()
)
def test_acl_permissions_get_view_with_access(self):
self.test_acl.permissions.clear()
self.grant_access(obj=self.test_object, permission=permission_acl_edit) self.grant_access(obj=self.test_object, permission=permission_acl_edit)
response = self._request_get_acl_permissions_view() response = self._request_get_acl_permissions_get_view()
self.assertContains( self.assertContains(
response=response, text=force_text(self.test_object), response=response, text=force_text(self.test_object),
status_code=200 status_code=200
) )
self.assertFalse(
self.test_object.acls.filter(permissions=self.test_permission.stored_permission).exists()
)
def _request_post_acl_permissions_post_view(self):
return self.post(
viewname='acls:acl_permissions',
kwargs={'acl_id': self.test_acl.pk},
data={'available-selection': self.test_permission.stored_permission.pk}
)
def test_acl_permissions_post_view_no_permission(self):
self.test_acl.permissions.clear()
response = self._request_post_acl_permissions_post_view()
self.assertNotContains(
response=response, text=force_text(self.test_object),
status_code=404
)
self.assertFalse(
self.test_object.acls.filter(permissions=self.test_permission.stored_permission).exists()
)
def test_acl_permissions_post_view_with_access(self):
self.test_acl.permissions.clear()
self.grant_access(obj=self.test_object, permission=permission_acl_edit)
response = self._request_post_acl_permissions_post_view()
self.assertEqual(response.status_code, 302)
self.assertTrue(
self.test_object.acls.filter(permissions=self.test_permission.stored_permission).exists()
)
+2 -2
View File
@@ -9,11 +9,11 @@ from .views import (
urlpatterns = [ urlpatterns = [
url( url(
regex=r'^objects/(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/create/$', regex=r'^objects/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/create/$',
name='acl_create', view=ACLCreateView.as_view() name='acl_create', view=ACLCreateView.as_view()
), ),
url( url(
regex=r'^objects/(?P<app_label>[-\w]+)/(?P<model>[-\w]+)/(?P<object_id>\d+)/list/$', regex=r'^objects/(?P<app_label>[-\w]+)/(?P<model_name>[-\w]+)/(?P<object_id>\d+)/list/$',
name='acl_list', view=ACLListView.as_view() name='acl_list', view=ACLListView.as_view()
), ),
url( url(
+9 -1
View File
@@ -27,6 +27,10 @@ logger = logging.getLogger(__name__)
class ACLCreateView(ContentTypeViewMixin, ExternalObjectMixin, SingleObjectCreateView): class ACLCreateView(ContentTypeViewMixin, ExternalObjectMixin, SingleObjectCreateView):
content_type_url_kw_args = {
'app_label': 'app_label',
'model': 'model_name'
}
external_object_permission = permission_acl_edit external_object_permission = permission_acl_edit
external_object_pk_url_kwarg = 'object_id' external_object_pk_url_kwarg = 'object_id'
form_class = ACLCreateForm form_class = ACLCreateForm
@@ -93,13 +97,17 @@ class ACLDeleteView(SingleObjectDeleteView):
return reverse( return reverse(
'acls:acl_list', kwargs={ 'acls:acl_list', kwargs={
'app_label': instance.content_type.app_label, 'app_label': instance.content_type.app_label,
'model': instance.content_type.model, 'model_name': instance.content_type.model,
'object_id': instance.object_id 'object_id': instance.object_id
} }
) )
class ACLListView(ContentTypeViewMixin, ExternalObjectMixin, SingleObjectListView): class ACLListView(ContentTypeViewMixin, ExternalObjectMixin, SingleObjectListView):
content_type_url_kw_args = {
'app_label': 'app_label',
'model': 'model_name'
}
external_object_permission = permission_acl_view external_object_permission = permission_acl_view
external_object_pk_url_kwarg = 'object_id' external_object_pk_url_kwarg = 'object_id'