Michael Merickel
2018-10-15 3670c2cdb732d378ba6d38e72e7cd875ff726aa9
commit | author | age
262cea 1 import unittest
CM 2 from pyramid.tests.test_scripts import dummy
3
4 class TestPViewsCommand(unittest.TestCase):
5     def _getTargetClass(self):
6         from pyramid.scripts.pviews import PViewsCommand
7         return PViewsCommand
8
9     def _makeOne(self, registry=None):
10         cmd = self._getTargetClass()([])
678790 11         cmd.bootstrap = dummy.DummyBootstrap(registry=registry)
MM 12         cmd.setup_logging = dummy.dummy_setup_logging()
5b40cd 13         cmd.args.config_uri = '/foo/bar/myapp.ini#myapp'
262cea 14         return cmd
CM 15
cefcf8 16     def _makeRequest(self, url, registry):
MM 17         from pyramid.request import Request
18         request = Request.blank('/a')
19         request.registry = registry
20         return request
21
262cea 22     def _register_mapper(self, registry, routes):
CM 23         from pyramid.interfaces import IRoutesMapper
24         mapper = dummy.DummyMapper(*routes)
25         registry.registerUtility(mapper, IRoutesMapper)
26
27     def test__find_view_no_match(self):
28         from pyramid.registry import Registry
29         registry = Registry()
30         self._register_mapper(registry, [])
31         command = self._makeOne(registry)
cefcf8 32         request = self._makeRequest('/a', registry)
MM 33         result = command._find_view(request)
262cea 34         self.assertEqual(result, None)
CM 35
36     def test__find_view_no_match_multiview_registered(self):
37         from zope.interface import implementer
38         from zope.interface import providedBy
39         from pyramid.interfaces import IRequest
40         from pyramid.interfaces import IViewClassifier
41         from pyramid.interfaces import IMultiView
42         from pyramid.traversal import DefaultRootFactory
43         from pyramid.registry import Registry
44         registry = Registry()
45         @implementer(IMultiView)
46         class View1(object):
47             pass
48         request = dummy.DummyRequest({'PATH_INFO':'/a'})
49         root = DefaultRootFactory(request)
50         root_iface = providedBy(root)
51         registry.registerAdapter(View1(),
52                                  (IViewClassifier, IRequest, root_iface),
53                                  IMultiView)
54         self._register_mapper(registry, [])
55         command = self._makeOne(registry=registry)
cefcf8 56         request = self._makeRequest('/x', registry)
MM 57         result = command._find_view(request)
262cea 58         self.assertEqual(result, None)
CM 59
60     def test__find_view_traversal(self):
61         from zope.interface import providedBy
62         from pyramid.interfaces import IRequest
63         from pyramid.interfaces import IViewClassifier
64         from pyramid.interfaces import IView
65         from pyramid.traversal import DefaultRootFactory
66         from pyramid.registry import Registry
67         registry = Registry()
68         def view1(): pass
69         request = dummy.DummyRequest({'PATH_INFO':'/a'})
70         root = DefaultRootFactory(request)
71         root_iface = providedBy(root)
72         registry.registerAdapter(view1,
73                                  (IViewClassifier, IRequest, root_iface),
74                                  IView, name='a')
75         self._register_mapper(registry, [])
76         command = self._makeOne(registry=registry)
cefcf8 77         request = self._makeRequest('/a', registry)
MM 78         result = command._find_view(request)
262cea 79         self.assertEqual(result, view1)
CM 80
81     def test__find_view_traversal_multiview(self):
82         from zope.interface import implementer
83         from zope.interface import providedBy
84         from pyramid.interfaces import IRequest
85         from pyramid.interfaces import IViewClassifier
86         from pyramid.interfaces import IMultiView
87         from pyramid.traversal import DefaultRootFactory
88         from pyramid.registry import Registry
89         registry = Registry()
90         @implementer(IMultiView)
91         class View1(object):
92             pass
93         request = dummy.DummyRequest({'PATH_INFO':'/a'})
94         root = DefaultRootFactory(request)
95         root_iface = providedBy(root)
96         view = View1()
97         registry.registerAdapter(view,
98                                  (IViewClassifier, IRequest, root_iface),
99                                  IMultiView, name='a')
100         self._register_mapper(registry, [])
101         command = self._makeOne(registry=registry)
cefcf8 102         request = self._makeRequest('/a', registry)
MM 103         result = command._find_view(request)
262cea 104         self.assertEqual(result, view)
CM 105
106     def test__find_view_route_no_multiview(self):
107         from zope.interface import Interface
108         from zope.interface import implementer
109         from pyramid.interfaces import IRouteRequest
110         from pyramid.interfaces import IViewClassifier
111         from pyramid.interfaces import IView
112         from pyramid.registry import Registry
113         registry = Registry()
114         def view():pass
115         class IMyRoot(Interface):
116             pass
117         class IMyRoute(Interface):
118             pass
119         registry.registerAdapter(view,
120                                  (IViewClassifier, IMyRoute, IMyRoot),
121                                  IView, '')
122         registry.registerUtility(IMyRoute, IRouteRequest, name='a')
123         @implementer(IMyRoot)
124         class Factory(object):
125             def __init__(self, request):
126                 pass
127         routes = [dummy.DummyRoute('a', '/a', factory=Factory, matchdict={}),
128                   dummy.DummyRoute('b', '/b', factory=Factory)]
129         self._register_mapper(registry, routes)
130         command = self._makeOne(registry=registry)
cefcf8 131         request = self._makeRequest('/a', registry)
MM 132         result = command._find_view(request)
262cea 133         self.assertEqual(result, view)
CM 134
135     def test__find_view_route_multiview_no_view_registered(self):
136         from zope.interface import Interface
137         from zope.interface import implementer
138         from pyramid.interfaces import IRouteRequest
139         from pyramid.interfaces import IMultiView
140         from pyramid.interfaces import IRootFactory
141         from pyramid.registry import Registry
142         registry = Registry()
143         def view1():pass
144         def view2():pass
145         class IMyRoot(Interface):
146             pass
147         class IMyRoute1(Interface):
148             pass
149         class IMyRoute2(Interface):
150             pass
151         registry.registerUtility(IMyRoute1, IRouteRequest, name='a')
152         registry.registerUtility(IMyRoute2, IRouteRequest, name='b')
153         @implementer(IMyRoot)
154         class Factory(object):
155             def __init__(self, request):
156                 pass
157         registry.registerUtility(Factory, IRootFactory)
158         routes = [dummy.DummyRoute('a', '/a', matchdict={}),
159                   dummy.DummyRoute('b', '/a', matchdict={})]
160         self._register_mapper(registry, routes)
161         command = self._makeOne(registry=registry)
cefcf8 162         request = self._makeRequest('/a', registry)
MM 163         result = command._find_view(request)
262cea 164         self.assertTrue(IMultiView.providedBy(result))
CM 165
166     def test__find_view_route_multiview(self):
167         from zope.interface import Interface
168         from zope.interface import implementer
169         from pyramid.interfaces import IRouteRequest
170         from pyramid.interfaces import IViewClassifier
171         from pyramid.interfaces import IView
172         from pyramid.interfaces import IMultiView
173         from pyramid.interfaces import IRootFactory
174         from pyramid.registry import Registry
175         registry = Registry()
176         def view1():pass
177         def view2():pass
178         class IMyRoot(Interface):
179             pass
180         class IMyRoute1(Interface):
181             pass
182         class IMyRoute2(Interface):
183             pass
184         registry.registerAdapter(view1,
185                                  (IViewClassifier, IMyRoute1, IMyRoot),
186                                  IView, '')
187         registry.registerAdapter(view2,
188                                  (IViewClassifier, IMyRoute2, IMyRoot),
189                                  IView, '')
190         registry.registerUtility(IMyRoute1, IRouteRequest, name='a')
191         registry.registerUtility(IMyRoute2, IRouteRequest, name='b')
192         @implementer(IMyRoot)
193         class Factory(object):
194             def __init__(self, request):
195                 pass
196         registry.registerUtility(Factory, IRootFactory)
197         routes = [dummy.DummyRoute('a', '/a', matchdict={}),
198                   dummy.DummyRoute('b', '/a', matchdict={})]
199         self._register_mapper(registry, routes)
200         command = self._makeOne(registry=registry)
cefcf8 201         request = self._makeRequest('/a', registry)
MM 202         result = command._find_view(request)
262cea 203         self.assertTrue(IMultiView.providedBy(result))
CM 204         self.assertEqual(len(result.views), 2)
205         self.assertTrue((None, view1, None) in result.views)
206         self.assertTrue((None, view2, None) in result.views)
207
208     def test__find_multi_routes_all_match(self):
209         command = self._makeOne()
210         def factory(request): pass
211         routes = [dummy.DummyRoute('a', '/a', factory=factory, matchdict={}),
212                   dummy.DummyRoute('b', '/a', factory=factory, matchdict={})]
213         mapper = dummy.DummyMapper(*routes)
214         request = dummy.DummyRequest({'PATH_INFO':'/a'})
215         result = command._find_multi_routes(mapper, request)
216         self.assertEqual(result, [{'match':{}, 'route':routes[0]},
217                                   {'match':{}, 'route':routes[1]}])
218         
219     def test__find_multi_routes_some_match(self):
220         command = self._makeOne()
221         def factory(request): pass
222         routes = [dummy.DummyRoute('a', '/a', factory=factory),
223                   dummy.DummyRoute('b', '/a', factory=factory, matchdict={})]
224         mapper = dummy.DummyMapper(*routes)
225         request = dummy.DummyRequest({'PATH_INFO':'/a'})
226         result = command._find_multi_routes(mapper, request)
227         self.assertEqual(result, [{'match':{}, 'route':routes[1]}])
228         
229     def test__find_multi_routes_none_match(self):
230         command = self._makeOne()
231         def factory(request): pass
232         routes = [dummy.DummyRoute('a', '/a', factory=factory),
233                   dummy.DummyRoute('b', '/a', factory=factory)]
234         mapper = dummy.DummyMapper(*routes)
235         request = dummy.DummyRequest({'PATH_INFO':'/a'})
236         result = command._find_multi_routes(mapper, request)
237         self.assertEqual(result, [])
238         
239     def test_views_command_not_found(self):
240         from pyramid.registry import Registry
241         registry = Registry()
242         command = self._makeOne(registry=registry)
243         L = []
244         command.out = L.append
cefcf8 245         command._find_view = lambda arg1: None
5b40cd 246         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 247         command.args.url = '/a'
262cea 248         result = command.run()
d58614 249         self.assertEqual(result, 0)
262cea 250         self.assertEqual(L[1], 'URL = /a')
CM 251         self.assertEqual(L[3], '    Not found.')
252
253     def test_views_command_not_found_url_starts_without_slash(self):
254         from pyramid.registry import Registry
255         registry = Registry()
256         command = self._makeOne(registry=registry)
257         L = []
258         command.out = L.append
cefcf8 259         command._find_view = lambda arg1: None
5b40cd 260         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
8529b3 261         command.args.url = 'a'
262cea 262         result = command.run()
d58614 263         self.assertEqual(result, 0)
262cea 264         self.assertEqual(L[1], 'URL = /a')
CM 265         self.assertEqual(L[3], '    Not found.')
266
267     def test_views_command_single_view_traversal(self):
268         from pyramid.registry import Registry
269         registry = Registry()
270         command = self._makeOne(registry=registry)
271         L = []
272         command.out = L.append
273         view = dummy.DummyView(context='context', view_name='a')
cefcf8 274         command._find_view = lambda arg1: view
5b40cd 275         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 276         command.args.url = '/a'
262cea 277         result = command.run()
d58614 278         self.assertEqual(result, 0)
262cea 279         self.assertEqual(L[1], 'URL = /a')
CM 280         self.assertEqual(L[3], '    context: context')
281         self.assertEqual(L[4], '    view name: a')
282         self.assertEqual(L[8],
283                          '    pyramid.tests.test_scripts.dummy.DummyView')
284
285     def test_views_command_single_view_function_traversal(self):
286         from pyramid.registry import Registry
287         registry = Registry()
288         command = self._makeOne(registry=registry)
289         L = []
290         command.out = L.append
291         def view(): pass
292         view.__request_attrs__ = {'context': 'context', 'view_name': 'a'}
cefcf8 293         command._find_view = lambda arg1: view
5b40cd 294         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 295         command.args.url = '/a'
262cea 296         result = command.run()
d58614 297         self.assertEqual(result, 0)
262cea 298         self.assertEqual(L[1], 'URL = /a')
CM 299         self.assertEqual(L[3], '    context: context')
300         self.assertEqual(L[4], '    view name: a')
301         self.assertEqual(L[8],
302                          '    pyramid.tests.test_scripts.test_pviews.view')
303
304     def test_views_command_single_view_traversal_with_permission(self):
305         from pyramid.registry import Registry
306         registry = Registry()
307         command = self._makeOne(registry=registry)
308         L = []
309         command.out = L.append
310         view = dummy.DummyView(context='context', view_name='a')
311         view.__permission__ = 'test'
cefcf8 312         command._find_view = lambda arg1: view
5b40cd 313         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 314         command.args.url = '/a'
262cea 315         result = command.run()
d58614 316         self.assertEqual(result, 0)
262cea 317         self.assertEqual(L[1], 'URL = /a')
CM 318         self.assertEqual(L[3], '    context: context')
319         self.assertEqual(L[4], '    view name: a')
320         self.assertEqual(L[8],
321                          '    pyramid.tests.test_scripts.dummy.DummyView')
322         self.assertEqual(L[9], '    required permission = test')
323
324     def test_views_command_single_view_traversal_with_predicates(self):
325         from pyramid.registry import Registry
326         registry = Registry()
327         command = self._makeOne(registry=registry)
328         L = []
329         command.out = L.append
330         def predicate(): pass
4d2602 331         predicate.text = lambda *arg: "predicate = x"
262cea 332         view = dummy.DummyView(context='context', view_name='a')
CM 333         view.__predicates__ = [predicate]
cefcf8 334         command._find_view = lambda arg1: view
5b40cd 335         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 336         command.args.url = '/a'
262cea 337         result = command.run()
d58614 338         self.assertEqual(result, 0)
262cea 339         self.assertEqual(L[1], 'URL = /a')
CM 340         self.assertEqual(L[3], '    context: context')
341         self.assertEqual(L[4], '    view name: a')
342         self.assertEqual(L[8],
343                          '    pyramid.tests.test_scripts.dummy.DummyView')
344         self.assertEqual(L[9], '    view predicates (predicate = x)')
345
346     def test_views_command_single_view_route(self):
347         from pyramid.registry import Registry
348         registry = Registry()
349         command = self._makeOne(registry=registry)
350         L = []
351         command.out = L.append
352         route = dummy.DummyRoute('a', '/a', matchdict={})
353         view = dummy.DummyView(context='context', view_name='a',
354                          matched_route=route, subpath='')
cefcf8 355         command._find_view = lambda arg1: view
5b40cd 356         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 357         command.args.url = '/a'
262cea 358         result = command.run()
d58614 359         self.assertEqual(result, 0)
262cea 360         self.assertEqual(L[1], 'URL = /a')
CM 361         self.assertEqual(L[3], '    context: context')
362         self.assertEqual(L[4], '    view name: a')
363         self.assertEqual(L[6], '    Route:')
364         self.assertEqual(L[8], '    route name: a')
365         self.assertEqual(L[9], '    route pattern: /a')
366         self.assertEqual(L[10], '    route path: /a')
367         self.assertEqual(L[11], '    subpath: ')
368         self.assertEqual(L[15],
369                    '        pyramid.tests.test_scripts.dummy.DummyView')
370
371     def test_views_command_multi_view_nested(self):
372         from pyramid.registry import Registry
373         registry = Registry()
374         command = self._makeOne(registry=registry)
375         L = []
376         command.out = L.append
377         view1 = dummy.DummyView(context='context', view_name='a1')
378         view1.__name__ = 'view1'
379         view1.__view_attr__ = 'call'
380         multiview1 = dummy.DummyMultiView(view1, context='context',
381                                           view_name='a1')
382         multiview2 = dummy.DummyMultiView(multiview1, context='context',
383                                     view_name='a')
cefcf8 384         command._find_view = lambda arg1: multiview2
5b40cd 385         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 386         command.args.url = '/a'
262cea 387         result = command.run()
d58614 388         self.assertEqual(result, 0)
262cea 389         self.assertEqual(L[1], 'URL = /a')
CM 390         self.assertEqual(L[3], '    context: context')
391         self.assertEqual(L[4], '    view name: a')
392         self.assertEqual(L[8],
393                   '    pyramid.tests.test_scripts.dummy.DummyMultiView')
394         self.assertEqual(L[12],
395                   '        pyramid.tests.test_scripts.dummy.view1.call')
396
397     def test_views_command_single_view_route_with_route_predicates(self):
398         from pyramid.registry import Registry
399         registry = Registry()
400         command = self._makeOne(registry=registry)
401         L = []
402         command.out = L.append
403         def predicate(): pass
0ccdc2 404         predicate.text = lambda *arg: "predicate = x"
262cea 405         route = dummy.DummyRoute('a', '/a', matchdict={}, predicate=predicate)
CM 406         view = dummy.DummyView(context='context', view_name='a',
407                          matched_route=route, subpath='')
cefcf8 408         command._find_view = lambda arg1: view
5b40cd 409         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 410         command.args.url = '/a'
262cea 411         result = command.run()
d58614 412         self.assertEqual(result, 0)
262cea 413         self.assertEqual(L[1], 'URL = /a')
CM 414         self.assertEqual(L[3], '    context: context')
415         self.assertEqual(L[4], '    view name: a')
416         self.assertEqual(L[6], '    Route:')
417         self.assertEqual(L[8], '    route name: a')
418         self.assertEqual(L[9], '    route pattern: /a')
419         self.assertEqual(L[10], '    route path: /a')
420         self.assertEqual(L[11], '    subpath: ')
421         self.assertEqual(L[12], '    route predicates (predicate = x)')
422         self.assertEqual(L[16],
423                '        pyramid.tests.test_scripts.dummy.DummyView')
424
425     def test_views_command_multiview(self):
426         from pyramid.registry import Registry
427         registry = Registry()
428         command = self._makeOne(registry=registry)
429         L = []
430         command.out = L.append
431         view = dummy.DummyView(context='context')
432         view.__name__ = 'view'
433         view.__view_attr__ = 'call'
434         multiview = dummy.DummyMultiView(view, context='context', view_name='a')
cefcf8 435         command._find_view = lambda arg1: multiview
5b40cd 436         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 437         command.args.url = '/a'
262cea 438         result = command.run()
d58614 439         self.assertEqual(result, 0)
262cea 440         self.assertEqual(L[1], 'URL = /a')
CM 441         self.assertEqual(L[3], '    context: context')
442         self.assertEqual(L[4], '    view name: a')
443         self.assertEqual(L[8],
444                      '    pyramid.tests.test_scripts.dummy.view.call')
445
446     def test_views_command_multiview_with_permission(self):
447         from pyramid.registry import Registry
448         registry = Registry()
449         command = self._makeOne(registry=registry)
450         L = []
451         command.out = L.append
452         view = dummy.DummyView(context='context')
453         view.__name__ = 'view'
454         view.__view_attr__ = 'call'
455         view.__permission__ = 'test'
456         multiview = dummy.DummyMultiView(view, context='context', view_name='a')
cefcf8 457         command._find_view = lambda arg1: multiview
5b40cd 458         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 459         command.args.url = '/a'
262cea 460         result = command.run()
d58614 461         self.assertEqual(result, 0)
262cea 462         self.assertEqual(L[1], 'URL = /a')
CM 463         self.assertEqual(L[3], '    context: context')
464         self.assertEqual(L[4], '    view name: a')
465         self.assertEqual(L[8],
466                        '    pyramid.tests.test_scripts.dummy.view.call')
467         self.assertEqual(L[9], '    required permission = test')
468
469     def test_views_command_multiview_with_predicates(self):
470         from pyramid.registry import Registry
471         registry = Registry()
472         command = self._makeOne(registry=registry)
473         L = []
474         command.out = L.append
475         def predicate(): pass
4d2602 476         predicate.text = lambda *arg: "predicate = x"
262cea 477         view = dummy.DummyView(context='context')
CM 478         view.__name__ = 'view'
479         view.__view_attr__ = 'call'
480         view.__predicates__ = [predicate]
481         multiview = dummy.DummyMultiView(view, context='context', view_name='a')
cefcf8 482         command._find_view = lambda arg1: multiview
5b40cd 483         command.args.config_uri = '/foo/bar/myapp.ini#myapp'
SP 484         command.args.url = '/a'
262cea 485         result = command.run()
d58614 486         self.assertEqual(result, 0)
262cea 487         self.assertEqual(L[1], 'URL = /a')
CM 488         self.assertEqual(L[3], '    context: context')
489         self.assertEqual(L[4], '    view name: a')
490         self.assertEqual(L[8],
491                          '    pyramid.tests.test_scripts.dummy.view.call')
492         self.assertEqual(L[9], '    view predicates (predicate = x)')
97f366 493
d29151 494 class Test_main(unittest.TestCase):
CM 495     def _callFUT(self, argv):
496         from pyramid.scripts.pviews import main
497         return main(argv, quiet=True)
498
499     def test_it(self):
500         result = self._callFUT(['pviews'])
d58614 501         self.assertEqual(result, 2)