diff --git a/mayan/apps/acls/tests/mixins.py b/mayan/apps/acls/tests/mixins.py index 6f4c9af305..7ea4237294 100644 --- a/mayan/apps/acls/tests/mixins.py +++ b/mayan/apps/acls/tests/mixins.py @@ -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 + } diff --git a/mayan/apps/acls/tests/test_links.py b/mayan/apps/acls/tests/test_links.py index 78d3821685..582e9b45c8 100644 --- a/mayan/apps/acls/tests/test_links.py +++ b/mayan/apps/acls/tests/test_links.py @@ -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 + ) ) diff --git a/mayan/apps/acls/tests/test_views.py b/mayan/apps/acls/tests/test_views.py index a41ca75164..7fabba2db8 100644 --- a/mayan/apps/acls/tests/test_views.py +++ b/mayan/apps/acls/tests/test_views.py @@ -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):