Skip to content

Commit

Permalink
tests: test C and PYTHON implementations in testPermissionRole
Browse files Browse the repository at this point in the history
  • Loading branch information
perrinjerome committed Oct 9, 2024
1 parent 94282bd commit 0d62399
Showing 1 changed file with 59 additions and 47 deletions.
106 changes: 59 additions & 47 deletions src/AccessControl/tests/testPermissionRole.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from Acquisition import Implicit
from Acquisition import aq_base

from AccessControl.PermissionRole import PermissionRole
from ..Implementation import PURE_PYTHON


ViewPermission = 'View'
Expand Down Expand Up @@ -50,40 +50,39 @@ class PermissiveObject(Explicit):
_Edit_Things__Permission = ['Anonymous']


def assertPRoles(ob, permission, expect):
"""
Asserts that in the context of ob, the given permission maps to
the given roles.
"""
pr = PermissionRole(permission)
roles = pr.__of__(ob)
roles2 = aq_base(pr).__of__(ob)
assert roles == roles2 or tuple(roles) == tuple(roles2), (
'Different methods of checking roles computed unequal results')
same = 0
if roles:
# When verbose security is enabled, permission names are
# embedded in the computed roles. Remove the permission
# names.
roles = [r for r in roles if not r.endswith('_Permission')]

if roles is None or expect is None:
if (roles is None or tuple(roles) == ('Anonymous', )) and \
(expect is None or tuple(expect) == ('Anonymous', )):
same = 1
else:
got = {}
for r in roles:
got[r] = 1
expected = {}
for r in expect:
expected[r] = 1
if got == expected: # Dict compare does the Right Thing.
same = 1
assert same, f'Expected roles: {expect!r}, got: {roles!r}'


class PermissionRoleTests (unittest.TestCase):
class PermissionRoleTestBase:

def assertPRoles(self, ob, permission, expect):
"""
Asserts that in the context of ob, the given permission maps to
the given roles.
"""
pr = self._getTargetClass()(permission)
roles = pr.__of__(ob)
roles2 = aq_base(pr).__of__(ob)
assert roles == roles2 or tuple(roles) == tuple(roles2), (
'Different methods of checking roles computed unequal results')
same = 0
if roles:
# When verbose security is enabled, permission names are
# embedded in the computed roles. Remove the permission
# names.
roles = [r for r in roles if not r.endswith('_Permission')]

if roles is None or expect is None:
if (roles is None or tuple(roles) == ('Anonymous', )) and \
(expect is None or tuple(expect) == ('Anonymous', )):
same = 1
else:
got = {}
for r in roles:
got[r] = 1
expected = {}
for r in expect:
expected[r] = 1
if got == expected: # Dict compare does the Right Thing.
same = 1
self.assertTrue(same, f'Expected roles: {expect!r}, got: {roles!r}')

def testRestrictive(self, explicit=0):
app = AppRoot()
Expand All @@ -93,9 +92,9 @@ def testRestrictive(self, explicit=0):
app.c = ImplicitContainer()
app.c.o = RestrictiveObject()
o = app.c.o
assertPRoles(o, ViewPermission, ('Manager', ))
assertPRoles(o, EditThingsPermission, ('Manager', 'Owner'))
assertPRoles(o, DeletePermission, ())
self.assertPRoles(o, ViewPermission, ('Manager', ))
self.assertPRoles(o, EditThingsPermission, ('Manager', 'Owner'))
self.assertPRoles(o, DeletePermission, ())

def testPermissive(self, explicit=0):
app = AppRoot()
Expand All @@ -105,25 +104,38 @@ def testPermissive(self, explicit=0):
app.c = ImplicitContainer()
app.c.o = PermissiveObject()
o = app.c.o
assertPRoles(o, ViewPermission, ('Anonymous', ))
assertPRoles(o, EditThingsPermission, ('Anonymous',
'Manager',
'Owner'))
assertPRoles(o, DeletePermission, ('Manager', ))
self.assertPRoles(o, ViewPermission, ('Anonymous', ))
self.assertPRoles(o, EditThingsPermission, ('Anonymous',
'Manager',
'Owner'))
self.assertPRoles(o, DeletePermission, ('Manager', ))

def testExplicit(self):
self.testRestrictive(1)
self.testPermissive(1)

def testAppDefaults(self):
o = AppRoot()
assertPRoles(o, ViewPermission, ('Anonymous', ))
assertPRoles(o, EditThingsPermission, ('Manager', 'Owner'))
assertPRoles(o, DeletePermission, ('Manager', ))
self.assertPRoles(o, ViewPermission, ('Anonymous', ))
self.assertPRoles(o, EditThingsPermission, ('Manager', 'Owner'))
self.assertPRoles(o, DeletePermission, ('Manager', ))

def testPermissionRoleSupportsGetattr(self):
a = PermissionRole('a')
a = self._getTargetClass()('a')
self.assertEqual(getattr(a, '__roles__'), ('Manager', ))
self.assertEqual(getattr(a, '_d'), ('Manager', ))
self.assertEqual(getattr(a, '__name__'), 'a')
self.assertEqual(getattr(a, '_p'), '_a_Permission')


class Python_PermissionRoleTests(PermissionRoleTestBase, unittest.TestCase):
def _getTargetClass(self):
from AccessControl.ImplPython import PermissionRole
return PermissionRole


@unittest.skipIf(PURE_PYTHON, reason="Test expects C impl.")
class C__PermissionRoleTests(PermissionRoleTestBase, unittest.TestCase):
def _getTargetClass(self):
from AccessControl.ImplC import PermissionRole
return PermissionRole

0 comments on commit 0d62399

Please sign in to comment.