Michael Merickel
2018-10-15 0c29cf2df41600d3906d521c72991c7686018b71
commit | author | age
eb6144 1 import unittest
CM 2
7975a1 3 from pyramid.compat import text_
3c2f95 4 from pyramid.security import AuthenticationAPIMixin, AuthorizationAPIMixin
dd3cc8 5 from . import IDummy
eb6144 6
0c29cf 7
eb6144 8 class TestingConfiguratorMixinTests(unittest.TestCase):
CM 9     def _makeOne(self, *arg, **kw):
10         from pyramid.config import Configurator
0c29cf 11
eb6144 12         config = Configurator(*arg, **kw)
CM 13         return config
14
15     def test_testing_securitypolicy(self):
16         from pyramid.testing import DummySecurityPolicy
0c29cf 17
eb6144 18         config = self._makeOne(autocommit=True)
0c29cf 19         config.testing_securitypolicy(
MM 20             'user', ('group1', 'group2'), permissive=False
21         )
eb6144 22         from pyramid.interfaces import IAuthenticationPolicy
CM 23         from pyramid.interfaces import IAuthorizationPolicy
0c29cf 24
eb6144 25         ut = config.registry.getUtility(IAuthenticationPolicy)
CM 26         self.assertTrue(isinstance(ut, DummySecurityPolicy))
27         ut = config.registry.getUtility(IAuthorizationPolicy)
28         self.assertEqual(ut.userid, 'user')
29         self.assertEqual(ut.groupids, ('group1', 'group2'))
30         self.assertEqual(ut.permissive, False)
31
1273d5 32     def test_testing_securitypolicy_remember_result(self):
0dcd56 33         from pyramid.security import remember
0c29cf 34
1273d5 35         config = self._makeOne(autocommit=True)
CM 36         pol = config.testing_securitypolicy(
0c29cf 37             'user',
MM 38             ('group1', 'group2'),
39             permissive=False,
40             remember_result=True,
41         )
1273d5 42         request = DummyRequest()
CM 43         request.registry = config.registry
0dcd56 44         val = remember(request, 'fred')
1273d5 45         self.assertEqual(pol.remembered, 'fred')
CM 46         self.assertEqual(val, True)
47
48     def test_testing_securitypolicy_forget_result(self):
0dcd56 49         from pyramid.security import forget
0c29cf 50
1273d5 51         config = self._makeOne(autocommit=True)
CM 52         pol = config.testing_securitypolicy(
0c29cf 53             'user', ('group1', 'group2'), permissive=False, forget_result=True
MM 54         )
1273d5 55         request = DummyRequest()
CM 56         request.registry = config.registry
0dcd56 57         val = forget(request)
1273d5 58         self.assertEqual(pol.forgotten, True)
0dcd56 59         self.assertEqual(val, True)
1273d5 60
eb6144 61     def test_testing_resources(self):
CM 62         from pyramid.traversal import find_resource
63         from pyramid.interfaces import ITraverser
0c29cf 64
eb6144 65         ob1 = object()
CM 66         ob2 = object()
0c29cf 67         resources = {'/ob1': ob1, '/ob2': ob2}
eb6144 68         config = self._makeOne(autocommit=True)
CM 69         config.testing_resources(resources)
70         adapter = config.registry.getAdapter(None, ITraverser)
0c29cf 71         result = adapter(DummyRequest({'PATH_INFO': '/ob1'}))
eb6144 72         self.assertEqual(result['context'], ob1)
CM 73         self.assertEqual(result['view_name'], '')
74         self.assertEqual(result['subpath'], ())
7975a1 75         self.assertEqual(result['traversed'], (text_('ob1'),))
eb6144 76         self.assertEqual(result['virtual_root'], ob1)
CM 77         self.assertEqual(result['virtual_root_path'], ())
0c29cf 78         result = adapter(DummyRequest({'PATH_INFO': '/ob2'}))
eb6144 79         self.assertEqual(result['context'], ob2)
CM 80         self.assertEqual(result['view_name'], '')
81         self.assertEqual(result['subpath'], ())
7975a1 82         self.assertEqual(result['traversed'], (text_('ob2'),))
eb6144 83         self.assertEqual(result['virtual_root'], ob2)
CM 84         self.assertEqual(result['virtual_root_path'], ())
0c29cf 85         self.assertRaises(
MM 86             KeyError, adapter, DummyRequest({'PATH_INFO': '/ob3'})
87         )
eb6144 88         try:
CM 89             config.begin()
90             self.assertEqual(find_resource(None, '/ob1'), ob1)
91         finally:
92             config.end()
93
94     def test_testing_add_subscriber_single(self):
95         config = self._makeOne(autocommit=True)
96         L = config.testing_add_subscriber(IDummy)
97         event = DummyEvent()
98         config.registry.notify(event)
99         self.assertEqual(len(L), 1)
100         self.assertEqual(L[0], event)
101         config.registry.notify(object())
102         self.assertEqual(len(L), 1)
103
104     def test_testing_add_subscriber_dottedname(self):
105         config = self._makeOne(autocommit=True)
0c29cf 106         L = config.testing_add_subscriber('tests.test_config.test_init.IDummy')
eb6144 107         event = DummyEvent()
CM 108         config.registry.notify(event)
109         self.assertEqual(len(L), 1)
110         self.assertEqual(L[0], event)
111         config.registry.notify(object())
112         self.assertEqual(len(L), 1)
113
114     def test_testing_add_subscriber_multiple(self):
115         from zope.interface import Interface
0c29cf 116
eb6144 117         config = self._makeOne(autocommit=True)
CM 118         L = config.testing_add_subscriber((Interface, IDummy))
119         event = DummyEvent()
120         event.object = 'foo'
121         # the below is the equivalent of z.c.event.objectEventNotify(event)
122         config.registry.subscribers((event.object, event), None)
123         self.assertEqual(len(L), 2)
124         self.assertEqual(L[0], 'foo')
125         self.assertEqual(L[1], event)
126
127     def test_testing_add_subscriber_defaults(self):
128         config = self._makeOne(autocommit=True)
129         L = config.testing_add_subscriber()
130         event = object()
131         config.registry.notify(event)
132         self.assertEqual(L[-1], event)
133         event2 = object()
134         config.registry.notify(event2)
135         self.assertEqual(L[-1], event2)
136
137     def test_testing_add_renderer(self):
138         config = self._makeOne(autocommit=True)
139         renderer = config.testing_add_renderer('templates/foo.pt')
140         from pyramid.testing import DummyTemplateRenderer
0c29cf 141
eb6144 142         self.assertTrue(isinstance(renderer, DummyTemplateRenderer))
CM 143         from pyramid.renderers import render_to_response
0c29cf 144
eb6144 145         # must provide request to pass in registry (this is a functest)
CM 146         request = DummyRequest()
147         request.registry = config.registry
148         render_to_response(
0c29cf 149             'templates/foo.pt', {'foo': 1, 'bar': 2}, request=request
MM 150         )
eb6144 151         renderer.assert_(foo=1)
CM 152         renderer.assert_(bar=2)
153         renderer.assert_(request=request)
154
155     def test_testing_add_renderer_twice(self):
156         config = self._makeOne(autocommit=True)
157         renderer1 = config.testing_add_renderer('templates/foo.pt')
158         renderer2 = config.testing_add_renderer('templates/bar.pt')
159         from pyramid.testing import DummyTemplateRenderer
0c29cf 160
eb6144 161         self.assertTrue(isinstance(renderer1, DummyTemplateRenderer))
CM 162         self.assertTrue(isinstance(renderer2, DummyTemplateRenderer))
163         from pyramid.renderers import render_to_response
0c29cf 164
eb6144 165         # must provide request to pass in registry (this is a functest)
CM 166         request = DummyRequest()
167         request.registry = config.registry
168         render_to_response(
0c29cf 169             'templates/foo.pt', {'foo': 1, 'bar': 2}, request=request
MM 170         )
eb6144 171         renderer1.assert_(foo=1)
CM 172         renderer1.assert_(bar=2)
173         renderer1.assert_(request=request)
174         render_to_response(
0c29cf 175             'templates/bar.pt', {'foo': 1, 'bar': 2}, request=request
MM 176         )
eb6144 177         renderer2.assert_(foo=1)
CM 178         renderer2.assert_(bar=2)
179         renderer2.assert_(request=request)
180
181     def test_testing_add_renderer_explicitrenderer(self):
182         config = self._makeOne(autocommit=True)
0c29cf 183
MM 184         class E(Exception):
185             pass
186
eb6144 187         def renderer(kw, system):
0c29cf 188             self.assertEqual(kw, {'foo': 1, 'bar': 2})
eb6144 189             raise E
0c29cf 190
eb6144 191         renderer = config.testing_add_renderer('templates/foo.pt', renderer)
CM 192         from pyramid.renderers import render_to_response
0c29cf 193
eb6144 194         # must provide request to pass in registry (this is a functest)
CM 195         request = DummyRequest()
196         request.registry = config.registry
197         try:
198             render_to_response(
0c29cf 199                 'templates/foo.pt', {'foo': 1, 'bar': 2}, request=request
MM 200             )
eb6144 201         except E:
CM 202             pass
0c29cf 203         else:  # pragma: no cover
eb6144 204             raise AssertionError
CM 205
206     def test_testing_add_template(self):
207         config = self._makeOne(autocommit=True)
208         renderer = config.testing_add_template('templates/foo.pt')
209         from pyramid.testing import DummyTemplateRenderer
0c29cf 210
eb6144 211         self.assertTrue(isinstance(renderer, DummyTemplateRenderer))
CM 212         from pyramid.renderers import render_to_response
0c29cf 213
eb6144 214         # must provide request to pass in registry (this is a functest)
CM 215         request = DummyRequest()
216         request.registry = config.registry
0c29cf 217         render_to_response(
MM 218             'templates/foo.pt', dict(foo=1, bar=2), request=request
219         )
eb6144 220         renderer.assert_(foo=1)
CM 221         renderer.assert_(bar=2)
222         renderer.assert_(request=request)
223
0c29cf 224
3b7334 225 from zope.interface import implementer
0c29cf 226
MM 227
3b7334 228 @implementer(IDummy)
eb6144 229 class DummyEvent:
3b7334 230     pass
0c29cf 231
eb6144 232
3c2f95 233 class DummyRequest(AuthenticationAPIMixin, AuthorizationAPIMixin):
eb6144 234     def __init__(self, environ=None):
CM 235         if environ is None:
236             environ = {}
237         self.environ = environ