Michael Merickel
2018-10-15 0c29cf2df41600d3906d521c72991c7686018b71
commit | author | age
eb6144 1 import unittest
CM 2
bc37a5 3 from pyramid.compat import PY2
dd3cc8 4 from . import IDummy
eb6144 5
0c29cf 6
eb6144 7 class AdaptersConfiguratorMixinTests(unittest.TestCase):
CM 8     def _makeOne(self, *arg, **kw):
9         from pyramid.config import Configurator
0c29cf 10
eb6144 11         config = Configurator(*arg, **kw)
CM 12         return config
13
14     def test_add_subscriber_defaults(self):
3b7334 15         from zope.interface import implementer
eb6144 16         from zope.interface import Interface
0c29cf 17
eb6144 18         class IEvent(Interface):
CM 19             pass
0c29cf 20
3b7334 21         @implementer(IEvent)
eb6144 22         class Event:
3b7334 23             pass
0c29cf 24
eb6144 25         L = []
0c29cf 26
eb6144 27         def subscriber(event):
CM 28             L.append(event)
0c29cf 29
eb6144 30         config = self._makeOne(autocommit=True)
CM 31         config.add_subscriber(subscriber)
32         event = Event()
33         config.registry.notify(event)
34         self.assertEqual(len(L), 1)
35         self.assertEqual(L[0], event)
36         config.registry.notify(object())
37         self.assertEqual(len(L), 2)
38
39     def test_add_subscriber_iface_specified(self):
3b7334 40         from zope.interface import implementer
eb6144 41         from zope.interface import Interface
0c29cf 42
eb6144 43         class IEvent(Interface):
CM 44             pass
0c29cf 45
3b7334 46         @implementer(IEvent)
eb6144 47         class Event:
3b7334 48             pass
0c29cf 49
eb6144 50         L = []
0c29cf 51
eb6144 52         def subscriber(event):
CM 53             L.append(event)
0c29cf 54
eb6144 55         config = self._makeOne(autocommit=True)
CM 56         config.add_subscriber(subscriber, IEvent)
57         event = Event()
58         config.registry.notify(event)
59         self.assertEqual(len(L), 1)
60         self.assertEqual(L[0], event)
61         config.registry.notify(object())
62         self.assertEqual(len(L), 1)
63
64     def test_add_subscriber_dottednames(self):
dd3cc8 65         import tests.test_config
eb6144 66         from pyramid.interfaces import INewRequest
0c29cf 67
eb6144 68         config = self._makeOne(autocommit=True)
0c29cf 69         config.add_subscriber(
MM 70             'tests.test_config', 'pyramid.interfaces.INewRequest'
71         )
eb6144 72         handlers = list(config.registry.registeredHandlers())
CM 73         self.assertEqual(len(handlers), 1)
74         handler = handlers[0]
dd3cc8 75         self.assertEqual(handler.handler, tests.test_config)
eb6144 76         self.assertEqual(handler.required, (INewRequest,))
CM 77
78     def test_add_object_event_subscriber(self):
3b7334 79         from zope.interface import implementer
eb6144 80         from zope.interface import Interface
0c29cf 81
eb6144 82         class IEvent(Interface):
CM 83             pass
0c29cf 84
3b7334 85         @implementer(IEvent)
eb6144 86         class Event:
CM 87             object = 'foo'
0c29cf 88
eb6144 89         event = Event()
CM 90         L = []
0c29cf 91
eb6144 92         def subscriber(object, event):
CM 93             L.append(event)
0c29cf 94
eb6144 95         config = self._makeOne(autocommit=True)
CM 96         config.add_subscriber(subscriber, (Interface, IEvent))
97         config.registry.subscribers((event.object, event), None)
98         self.assertEqual(len(L), 1)
99         self.assertEqual(L[0], event)
100         config.registry.subscribers((event.object, IDummy), None)
101         self.assertEqual(len(L), 1)
102
95f766 103     def test_add_subscriber_with_specific_type_and_predicates_True(self):
CM 104         from zope.interface import implementer
105         from zope.interface import Interface
0c29cf 106
95f766 107         class IEvent(Interface):
CM 108             pass
0c29cf 109
95f766 110         @implementer(IEvent)
CM 111         class Event:
112             pass
0c29cf 113
95f766 114         L = []
0c29cf 115
95f766 116         def subscriber(event):
CM 117             L.append(event)
0c29cf 118
95f766 119         config = self._makeOne(autocommit=True)
405213 120         predlist = config.get_predlist('subscriber')
95f766 121         jam_predicate = predicate_maker('jam')
CM 122         jim_predicate = predicate_maker('jim')
123         predlist.add('jam', jam_predicate)
124         predlist.add('jim', jim_predicate)
125         config.add_subscriber(subscriber, IEvent, jam=True, jim=True)
126         event = Event()
127         event.jam = True
128         event.jim = True
129         config.registry.notify(event)
130         self.assertEqual(len(L), 1)
131         self.assertEqual(L[0], event)
132         config.registry.notify(object())
133         self.assertEqual(len(L), 1)
134
135     def test_add_subscriber_with_default_type_predicates_True(self):
136         from zope.interface import implementer
137         from zope.interface import Interface
0c29cf 138
95f766 139         class IEvent(Interface):
CM 140             pass
0c29cf 141
95f766 142         @implementer(IEvent)
CM 143         class Event:
144             pass
0c29cf 145
95f766 146         L = []
0c29cf 147
95f766 148         def subscriber(event):
CM 149             L.append(event)
0c29cf 150
95f766 151         config = self._makeOne(autocommit=True)
405213 152         predlist = config.get_predlist('subscriber')
95f766 153         jam_predicate = predicate_maker('jam')
CM 154         jim_predicate = predicate_maker('jim')
155         predlist.add('jam', jam_predicate)
156         predlist.add('jim', jim_predicate)
157         config.add_subscriber(subscriber, jam=True, jim=True)
158         event = Event()
159         event.jam = True
160         event.jim = True
161         config.registry.notify(event)
162         self.assertEqual(len(L), 1)
163         self.assertEqual(L[0], event)
164         config.registry.notify(object())
165         self.assertEqual(len(L), 1)
166
167     def test_add_subscriber_with_specific_type_and_predicates_False(self):
168         from zope.interface import implementer
169         from zope.interface import Interface
0c29cf 170
95f766 171         class IEvent(Interface):
CM 172             pass
0c29cf 173
95f766 174         @implementer(IEvent)
CM 175         class Event:
176             pass
0c29cf 177
95f766 178         L = []
0c29cf 179
MM 180         def subscriber(event):
181             L.append(event)
182
95f766 183         config = self._makeOne(autocommit=True)
405213 184         predlist = config.get_predlist('subscriber')
95f766 185         jam_predicate = predicate_maker('jam')
CM 186         jim_predicate = predicate_maker('jim')
187         predlist.add('jam', jam_predicate)
188         predlist.add('jim', jim_predicate)
189         config.add_subscriber(subscriber, IEvent, jam=True, jim=True)
190         event = Event()
191         event.jam = True
192         event.jim = False
193         config.registry.notify(event)
194         self.assertEqual(len(L), 0)
195
196     def test_add_subscriber_with_default_type_predicates_False(self):
197         from zope.interface import implementer
198         from zope.interface import Interface
0c29cf 199
95f766 200         class IEvent(Interface):
CM 201             pass
0c29cf 202
95f766 203         @implementer(IEvent)
CM 204         class Event:
205             pass
0c29cf 206
95f766 207         L = []
0c29cf 208
MM 209         def subscriber(event):
210             L.append(event)
211
95f766 212         config = self._makeOne(autocommit=True)
405213 213         predlist = config.get_predlist('subscriber')
95f766 214         jam_predicate = predicate_maker('jam')
CM 215         jim_predicate = predicate_maker('jim')
216         predlist.add('jam', jam_predicate)
217         predlist.add('jim', jim_predicate)
218         config.add_subscriber(subscriber, jam=True, jim=True)
219         event = Event()
220         event.jam = False
221         event.jim = True
222         config.registry.notify(event)
223         self.assertEqual(len(L), 0)
224
225     def test_add_subscriber_predicate(self):
226         config = self._makeOne()
227         L = []
0c29cf 228
MM 229         def add_predicate(
230             type, name, factory, weighs_less_than=None, weighs_more_than=None
231         ):
95f766 232             self.assertEqual(type, 'subscriber')
CM 233             self.assertEqual(name, 'name')
234             self.assertEqual(factory, 'factory')
235             self.assertEqual(weighs_more_than, 1)
236             self.assertEqual(weighs_less_than, 2)
237             L.append(1)
0c29cf 238
95f766 239         config._add_predicate = add_predicate
CM 240         config.add_subscriber_predicate('name', 'factory', 1, 2)
241         self.assertTrue(L)
0c29cf 242
eb6144 243     def test_add_response_adapter(self):
CM 244         from pyramid.interfaces import IResponse
0c29cf 245
eb6144 246         config = self._makeOne(autocommit=True)
0c29cf 247
eb6144 248         class Adapter(object):
CM 249             def __init__(self, other):
250                 self.other = other
0c29cf 251
eb6144 252         config.add_response_adapter(Adapter, str)
CM 253         result = config.registry.queryAdapter('foo', IResponse)
254         self.assertTrue(result.other, 'foo')
255
256     def test_add_response_adapter_self(self):
257         from pyramid.interfaces import IResponse
0c29cf 258
eb6144 259         config = self._makeOne(autocommit=True)
0c29cf 260
eb6144 261         class Adapter(object):
CM 262             pass
0c29cf 263
eb6144 264         config.add_response_adapter(None, Adapter)
CM 265         adapter = Adapter()
266         result = config.registry.queryAdapter(adapter, IResponse)
267         self.assertTrue(result is adapter)
268
269     def test_add_response_adapter_dottednames(self):
270         from pyramid.interfaces import IResponse
0c29cf 271
eb6144 272         config = self._makeOne(autocommit=True)
bc37a5 273         if PY2:
0ce501 274             str_name = '__builtin__.str'
bc37a5 275         else:
MM 276             str_name = 'builtins.str'
0ce501 277         config.add_response_adapter('pyramid.response.Response', str_name)
eb6144 278         result = config.registry.queryAdapter('foo', IResponse)
0ce501 279         self.assertTrue(result.body, b'foo')
eb6144 280
e0551c 281     def test_add_traverser_dotted_names(self):
CM 282         from pyramid.interfaces import ITraverser
0c29cf 283
e0551c 284         config = self._makeOne(autocommit=True)
CM 285         config.add_traverser(
dd3cc8 286             'tests.test_config.test_adapters.DummyTraverser',
0c29cf 287             'tests.test_config.test_adapters.DummyIface',
MM 288         )
e0551c 289         iface = DummyIface()
CM 290         traverser = config.registry.getAdapter(iface, ITraverser)
291         self.assertEqual(traverser.__class__, DummyTraverser)
292         self.assertEqual(traverser.root, iface)
293
294     def test_add_traverser_default_iface_means_Interface(self):
295         from pyramid.interfaces import ITraverser
0c29cf 296
e0551c 297         config = self._makeOne(autocommit=True)
CM 298         config.add_traverser(DummyTraverser)
299         traverser = config.registry.getAdapter(None, ITraverser)
300         self.assertEqual(traverser.__class__, DummyTraverser)
301
302     def test_add_traverser_nondefault_iface(self):
303         from pyramid.interfaces import ITraverser
0c29cf 304
e0551c 305         config = self._makeOne(autocommit=True)
CM 306         config.add_traverser(DummyTraverser, DummyIface)
307         iface = DummyIface()
308         traverser = config.registry.getAdapter(iface, ITraverser)
309         self.assertEqual(traverser.__class__, DummyTraverser)
310         self.assertEqual(traverser.root, iface)
0c29cf 311
e0551c 312     def test_add_traverser_introspectables(self):
CM 313         config = self._makeOne()
314         config.add_traverser(DummyTraverser, DummyIface)
315         actions = config.action_state.actions
316         self.assertEqual(len(actions), 1)
0c29cf 317         intrs = actions[0]['introspectables']
e0551c 318         self.assertEqual(len(intrs), 1)
CM 319         intr = intrs[0]
320         self.assertEqual(intr.type_name, 'traverser')
321         self.assertEqual(intr.discriminator, ('traverser', DummyIface))
322         self.assertEqual(intr.category_name, 'traversers')
323         self.assertEqual(intr.title, 'traverser for %r' % DummyIface)
324         self.assertEqual(intr['adapter'], DummyTraverser)
325         self.assertEqual(intr['iface'], DummyIface)
326
327     def test_add_resource_url_adapter_dotted_names(self):
328         from pyramid.interfaces import IResourceURL
0c29cf 329
e0551c 330         config = self._makeOne(autocommit=True)
CM 331         config.add_resource_url_adapter(
dd3cc8 332             'tests.test_config.test_adapters.DummyResourceURL',
MM 333             'tests.test_config.test_adapters.DummyIface',
0c29cf 334         )
e0551c 335         iface = DummyIface()
0c29cf 336         adapter = config.registry.getMultiAdapter((iface, iface), IResourceURL)
e0551c 337         self.assertEqual(adapter.__class__, DummyResourceURL)
CM 338         self.assertEqual(adapter.resource, iface)
339         self.assertEqual(adapter.request, iface)
340
8b59f6 341     def test_add_resource_url_default_resource_iface_means_Interface(self):
e0551c 342         from pyramid.interfaces import IResourceURL
0c29cf 343
e0551c 344         config = self._makeOne(autocommit=True)
CM 345         config.add_resource_url_adapter(DummyResourceURL)
346         iface = DummyIface()
0c29cf 347         adapter = config.registry.getMultiAdapter((iface, iface), IResourceURL)
e0551c 348         self.assertEqual(adapter.__class__, DummyResourceURL)
CM 349         self.assertEqual(adapter.resource, iface)
350         self.assertEqual(adapter.request, iface)
351
8b59f6 352     def test_add_resource_url_nodefault_resource_iface(self):
e0551c 353         from zope.interface import Interface
CM 354         from pyramid.interfaces import IResourceURL
0c29cf 355
e0551c 356         config = self._makeOne(autocommit=True)
8b59f6 357         config.add_resource_url_adapter(DummyResourceURL, DummyIface)
e0551c 358         iface = DummyIface()
0c29cf 359         adapter = config.registry.getMultiAdapter((iface, iface), IResourceURL)
e0551c 360         self.assertEqual(adapter.__class__, DummyResourceURL)
CM 361         self.assertEqual(adapter.resource, iface)
362         self.assertEqual(adapter.request, iface)
363         bad_result = config.registry.queryMultiAdapter(
0c29cf 364             (Interface, Interface), IResourceURL
MM 365         )
e0551c 366         self.assertEqual(bad_result, None)
CM 367
368     def test_add_resource_url_adapter_introspectables(self):
369         config = self._makeOne()
370         config.add_resource_url_adapter(DummyResourceURL, DummyIface)
371         actions = config.action_state.actions
372         self.assertEqual(len(actions), 1)
0c29cf 373         intrs = actions[0]['introspectables']
e0551c 374         self.assertEqual(len(intrs), 1)
CM 375         intr = intrs[0]
376         self.assertEqual(intr.type_name, 'resource url adapter')
0c29cf 377         self.assertEqual(
MM 378             intr.discriminator, ('resource url adapter', DummyIface)
379         )
e0551c 380         self.assertEqual(intr.category_name, 'resource url adapters')
CM 381         self.assertEqual(
382             intr.title,
383             "resource url adapter for resource iface "
0c29cf 384             "<class 'tests.test_config.test_adapters.DummyIface'>",
MM 385         )
e0551c 386         self.assertEqual(intr['adapter'], DummyResourceURL)
CM 387         self.assertEqual(intr['resource_iface'], DummyIface)
0c29cf 388
e0551c 389
28fc3d 390 class Test_eventonly(unittest.TestCase):
CM 391     def _callFUT(self, callee):
392         from pyramid.config.adapters import eventonly
0c29cf 393
28fc3d 394         return eventonly(callee)
CM 395
396     def test_defaults(self):
0c29cf 397         def acallable(event, a=1, b=2):
MM 398             pass
399
28fc3d 400         self.assertTrue(self._callFUT(acallable))
0c29cf 401
28fc3d 402
e0551c 403 class DummyTraverser(object):
CM 404     def __init__(self, root):
405         self.root = root
406
0c29cf 407
e0551c 408 class DummyIface(object):
CM 409     pass
0c29cf 410
e0551c 411
CM 412 class DummyResourceURL(object):
413     def __init__(self, resource, request):
414         self.resource = resource
415         self.request = request
0c29cf 416
MM 417
95f766 418 def predicate_maker(name):
CM 419     class Predicate(object):
420         def __init__(self, val, config):
421             self.val = val
0c29cf 422
95f766 423         def phash(self):
CM 424             return 'phash'
0c29cf 425
95f766 426         text = phash
0c29cf 427
95f766 428         def __call__(self, event):
CM 429             return getattr(event, name, None) == self.val
430
0c29cf 431     return Predicate