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