1############################################################################## 2# 3# Copyright (c) 2012 Zope Foundation and Contributors. 4# All Rights Reserved. 5# 6# This software is subject to the provisions of the Zope Public License, 7# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. 8# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED 9# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 10# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS 11# FOR A PARTICULAR PURPOSE. 12# 13############################################################################## 14"""Pure-Python hookable tests 15""" 16import unittest 17 18 19class PermissionProxyTests(unittest.TestCase): 20 21 def _getTargetClass(self): 22 from zope.component.security import PermissionProxy 23 return PermissionProxy 24 25 def _makeOne(self, wrapped): 26 return self._getTargetClass()(wrapped) 27 28 def test_proxy_delegates___provided_by__(self): 29 from zope.interface import Interface 30 from zope.interface import implementer 31 from zope.interface import providedBy 32 class IFoo(Interface): 33 pass 34 @implementer(IFoo) 35 class Foo(object): 36 pass 37 foo = Foo() 38 proxy = self._makeOne(foo) 39 self.assertEqual(providedBy(proxy), providedBy(foo)) 40 41 42class Test__checker(unittest.TestCase): 43 44 def _callFUT(self, *args, **kw): 45 from zope.component.security import _checker 46 return _checker(*args, **kw) 47 48 def test_no_allowed_attributes_no_allowed_interfaces(self): 49 from zope.security.checker import CheckerPublic 50 checker = self._callFUT(object(), 'zope.Public', (), ()) 51 self.assertEqual(checker.get_permissions, {'__call__': CheckerPublic}) 52 self.assertFalse(checker.set_permissions) 53 54 def test_w_allowed_interfaces(self): 55 from zope.interface import Interface 56 class IFoo(Interface): 57 def bar(self): 58 pass 59 def baz(self): 60 pass 61 class ISpam(Interface): 62 def qux(self): 63 pass 64 checker = self._callFUT(object(), 'testing', (IFoo, ISpam), ()) 65 self.assertEqual(checker.get_permissions, 66 {'bar': 'testing', 'baz': 'testing', 'qux': 'testing'}) 67 self.assertFalse(checker.set_permissions) 68 69 def test_w_allowed_attributes(self): 70 checker = self._callFUT(object(), 'testing', (), ('foo', 'bar')) 71 self.assertEqual(checker.get_permissions, 72 {'foo': 'testing', 'bar': 'testing'}) 73 self.assertFalse(checker.set_permissions) 74 75 76class Test_proxify(unittest.TestCase): 77 78 def _callFUT(self, *args, **kw): 79 from zope.component.security import proxify 80 return proxify(*args, **kw) 81 82 def _makeContext(self): 83 class _Context(object): 84 def bar(self): 85 pass 86 return _Context() 87 88 def test_no_checker_no_provides(self): 89 ctx = self._makeContext() 90 self.assertRaises(ValueError, self._callFUT, ctx, permission='testing') 91 92 def test_no_checker_no_permission(self): 93 from zope.interface import Interface 94 class IFoo(Interface): 95 def bar(self): 96 pass 97 ctx = self._makeContext() 98 self.assertRaises(ValueError, self._callFUT, ctx, provides=IFoo) 99 100 def test_no_checker_w_provides_and_permission_public(self): 101 from zope.interface import Interface 102 from zope.security.checker import CheckerPublic 103 from zope.proxy import getProxiedObject 104 class IFoo(Interface): 105 def bar(self): 106 pass 107 ctx = self._makeContext() 108 proxy = self._callFUT(ctx, provides=IFoo, permission='zope.Public') 109 self.assertTrue(getProxiedObject(proxy) is ctx) 110 checker = proxy.__Security_checker__ 111 self.assertEqual(checker.get_permissions, {'bar': CheckerPublic}) 112 self.assertFalse(checker.set_permissions) 113 114 def test_no_checker_w_provides_and_permission_protected(self): 115 from zope.interface import Interface 116 from zope.proxy import getProxiedObject 117 class IFoo(Interface): 118 def bar(self): 119 pass 120 ctx = self._makeContext() 121 proxy = self._callFUT(ctx, provides=IFoo, permission='testing') 122 self.assertTrue(getProxiedObject(proxy) is ctx) 123 checker = proxy.__Security_checker__ 124 self.assertEqual(checker.get_permissions, {'bar': 'testing'}) 125 self.assertFalse(checker.set_permissions) 126 127 def test_w_checker(self): 128 from zope.proxy import getProxiedObject 129 _CHECKER = object() 130 ctx = self._makeContext() 131 proxy = self._callFUT(ctx, _CHECKER) 132 self.assertTrue(getProxiedObject(proxy) is ctx) 133 self.assertTrue(proxy.__Security_checker__ is _CHECKER) 134 135 136class Test_protectedFactory(unittest.TestCase): 137 138 def _callFUT(self, *args, **kw): 139 from zope.component.security import protectedFactory 140 return protectedFactory(*args, **kw) 141 142 def test_public_not_already_proxied(self): 143 from zope.interface import Interface 144 from zope.security.checker import CheckerPublic 145 class IFoo(Interface): 146 def bar(self): 147 pass 148 class _Factory(object): 149 def bar(self): 150 pass 151 protected = self._callFUT(_Factory, IFoo, 'zope.Public') 152 self.assertTrue(protected.factory is _Factory) 153 foo = protected() 154 self.assertEqual(foo.__Security_checker__.get_permissions, 155 {'bar': CheckerPublic}) 156 157 def test_nonpublic_already_proxied(self): 158 from zope.interface import Interface 159 from zope.security.proxy import getTestProxyItems 160 class IFoo(Interface): 161 def bar(self): 162 pass 163 class _Factory(object): 164 __slots__ = ('one',) 165 def bar(self): 166 pass 167 protected = self._callFUT(_Factory, IFoo, 'testing') 168 self.assertTrue(protected.factory is _Factory) 169 foo = protected() 170 self.assertEqual(getTestProxyItems(foo), [('bar', 'testing')]) 171 172 173class Test_securityAdapterFactory(unittest.TestCase): 174 175 def _callFUT(self, *args, **kw): 176 from zope.component.security import securityAdapterFactory 177 return securityAdapterFactory(*args, **kw) 178 179 def test_no_permission_untrusted_no_location(self): 180 class _Factory(object): 181 pass 182 self.assertTrue(self._callFUT(_Factory, None, False, False) 183 is _Factory) 184 185 def test_public_untrusted_no_location(self): 186 class _Factory(object): 187 pass 188 self.assertTrue(self._callFUT(_Factory, 'zope.Public', False, False) 189 is _Factory) 190 191 def test_CheckerPublic_untrusted_no_location(self): 192 from zope.security.checker import CheckerPublic 193 class _Factory(object): 194 pass 195 self.assertTrue(self._callFUT(_Factory, CheckerPublic, False, False) 196 is _Factory) 197 198 def test_protected_untrusted_no_location(self): 199 from zope.security.adapter import LocatingUntrustedAdapterFactory 200 class _Factory(object): 201 pass 202 proxy = self._callFUT(_Factory, 'testing', False, False) 203 self.assertTrue(isinstance(proxy, LocatingUntrustedAdapterFactory)) 204 205 def test_no_permission_trusted_no_location(self): 206 from zope.security.adapter import LocatingTrustedAdapterFactory 207 class _Factory(object): 208 pass 209 proxy = self._callFUT(_Factory, None, False, True) 210 self.assertTrue(isinstance(proxy, LocatingTrustedAdapterFactory)) 211 212 def test_public_trusted_no_location(self): 213 from zope.security.adapter import LocatingTrustedAdapterFactory 214 class _Factory(object): 215 pass 216 proxy = self._callFUT(_Factory, 'zope.Public', False, True) 217 self.assertTrue(isinstance(proxy, LocatingTrustedAdapterFactory)) 218 219 def test_CheckerPublic_trusted_no_location(self): 220 from zope.security.adapter import LocatingTrustedAdapterFactory 221 from zope.security.checker import CheckerPublic 222 class _Factory(object): 223 pass 224 proxy = self._callFUT(_Factory, CheckerPublic, False, True) 225 self.assertTrue(isinstance(proxy, LocatingTrustedAdapterFactory)) 226 227 def test_protected_trusted_no_location(self): 228 from zope.security.adapter import LocatingTrustedAdapterFactory 229 class _Factory(object): 230 pass 231 proxy = self._callFUT(_Factory, 'testing', False, True) 232 self.assertTrue(isinstance(proxy, LocatingTrustedAdapterFactory)) 233 234 def test_protected_trusted_w_location(self): 235 from zope.security.adapter import LocatingTrustedAdapterFactory 236 class _Factory(object): 237 pass 238 proxy = self._callFUT(_Factory, 'testing', True, True) 239 self.assertTrue(isinstance(proxy, LocatingTrustedAdapterFactory)) 240 241 242def test_suite(): 243 return unittest.TestSuite(( 244 unittest.makeSuite(PermissionProxyTests), 245 unittest.makeSuite(Test__checker), 246 unittest.makeSuite(Test_proxify), 247 unittest.makeSuite(Test_protectedFactory), 248 unittest.makeSuite(Test_securityAdapterFactory), 249 )) 250