import os import unittest from . import dummy class DummyIntrospector(object): def __init__(self): self.relations = {} self.introspectables = {} def get(self, name, discrim): pass class TestPRoutesCommand(unittest.TestCase): def _getTargetClass(self): from pyramid.scripts.proutes import PRoutesCommand return PRoutesCommand def _makeOne(self): cmd = self._getTargetClass()([]) cmd.bootstrap = dummy.DummyBootstrap() cmd.get_config_loader = dummy.DummyLoader() cmd.args.config_uri = '/foo/bar/myapp.ini#myapp' return cmd def _makeRegistry(self): from pyramid.registry import Registry registry = Registry() registry.introspector = DummyIntrospector() return registry def _makeConfig(self, *arg, **kw): from pyramid.config import Configurator config = Configurator(*arg, **kw) return config def test_good_args(self): cmd = self._getTargetClass()([]) cmd.bootstrap = dummy.DummyBootstrap() cmd.get_config_loader = dummy.DummyLoader() cmd.args.config_uri = '/foo/bar/myapp.ini#myapp' cmd.args.config_args = ('a=1',) route = dummy.DummyRoute('a', '/a') mapper = dummy.DummyMapper(route) cmd._get_mapper = lambda *arg: mapper registry = self._makeRegistry() cmd.bootstrap = dummy.DummyBootstrap(registry=registry) L = [] cmd.out = lambda msg: L.append(msg) cmd.run() self.assertTrue('' in ''.join(L)) def test_bad_args(self): cmd = self._getTargetClass()([]) cmd.bootstrap = dummy.DummyBootstrap() cmd.get_config_loader = dummy.DummyLoader() cmd.args.config_uri = '/foo/bar/myapp.ini#myapp' cmd.args.config_vars = ('a',) route = dummy.DummyRoute('a', '/a') mapper = dummy.DummyMapper(route) cmd._get_mapper = lambda *arg: mapper self.assertRaises(ValueError, cmd.run) def test_no_routes(self): command = self._makeOne() mapper = dummy.DummyMapper() command._get_mapper = lambda *arg: mapper L = [] command.out = L.append result = command.run() self.assertEqual(result, 0) self.assertEqual(L, []) def test_no_mapper(self): command = self._makeOne() command._get_mapper = lambda *arg:None L = [] command.out = L.append result = command.run() self.assertEqual(result, 0) self.assertEqual(L, []) def test_single_route_no_route_registered(self): command = self._makeOne() route = dummy.DummyRoute('a', '/a') mapper = dummy.DummyMapper(route) command._get_mapper = lambda *arg: mapper registry = self._makeRegistry() command.bootstrap = dummy.DummyBootstrap(registry=registry) L = [] command.out = L.append result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) self.assertEqual(L[-1].split(), ['a', '/a', '', '*']) def test_route_with_no_slash_prefix(self): command = self._makeOne() route = dummy.DummyRoute('a', 'a') mapper = dummy.DummyMapper(route) command._get_mapper = lambda *arg: mapper L = [] command.out = L.append registry = self._makeRegistry() command.bootstrap = dummy.DummyBootstrap(registry=registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) self.assertEqual(L[-1].split(), ['a', '/a', '', '*']) def test_single_route_no_views_registered(self): from zope.interface import Interface from pyramid.interfaces import IRouteRequest registry = self._makeRegistry() def view():pass class IMyRoute(Interface): pass registry.registerUtility(IMyRoute, IRouteRequest, name='a') command = self._makeOne() route = dummy.DummyRoute('a', '/a') mapper = dummy.DummyMapper(route) command._get_mapper = lambda *arg: mapper L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) self.assertEqual(L[-1].split()[:3], ['a', '/a', '']) def test_single_route_one_view_registered(self): from zope.interface import Interface from pyramid.interfaces import IRouteRequest from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IView registry = self._makeRegistry() def view():pass class IMyRoute(Interface): pass registry.registerAdapter(view, (IViewClassifier, IMyRoute, Interface), IView, '') registry.registerUtility(IMyRoute, IRouteRequest, name='a') command = self._makeOne() route = dummy.DummyRoute('a', '/a') mapper = dummy.DummyMapper(route) command._get_mapper = lambda *arg: mapper L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split()[:3] self.assertEqual( compare_to, ['a', '/a', 'tests.test_scripts.test_proutes.view'] ) def test_one_route_with_long_name_one_view_registered(self): from zope.interface import Interface from pyramid.interfaces import IRouteRequest from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IView registry = self._makeRegistry() def view():pass class IMyRoute(Interface): pass registry.registerAdapter( view, (IViewClassifier, IMyRoute, Interface), IView, '' ) registry.registerUtility(IMyRoute, IRouteRequest, name='very_long_name_123') command = self._makeOne() route = dummy.DummyRoute( 'very_long_name_123', '/and_very_long_pattern_as_well' ) mapper = dummy.DummyMapper(route) command._get_mapper = lambda *arg: mapper L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split()[:3] self.assertEqual( compare_to, ['very_long_name_123', '/and_very_long_pattern_as_well', 'tests.test_scripts.test_proutes.view'] ) def test_class_view(self): from pyramid.renderers import null_renderer as nr config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=dummy.DummyView, attr='view', renderer=nr, request_method='POST' ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = [ 'foo', '/a/b', 'tests.test_scripts.dummy.DummyView.view', 'POST' ] self.assertEqual(compare_to, expected) def test_single_route_one_view_registered_with_factory(self): from zope.interface import Interface from pyramid.interfaces import IRouteRequest from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IView registry = self._makeRegistry() def view():pass class IMyRoot(Interface): pass class IMyRoute(Interface): pass registry.registerAdapter(view, (IViewClassifier, IMyRoute, IMyRoot), IView, '') registry.registerUtility(IMyRoute, IRouteRequest, name='a') command = self._makeOne() def factory(request): pass route = dummy.DummyRoute('a', '/a', factory=factory) mapper = dummy.DummyMapper(route) command._get_mapper = lambda *arg: mapper L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) self.assertEqual(L[-1].split()[:3], ['a', '/a', '']) def test_single_route_multiview_registered(self): from zope.interface import Interface from pyramid.interfaces import IRouteRequest from pyramid.interfaces import IViewClassifier from pyramid.interfaces import IMultiView registry = self._makeRegistry() def view(): pass class IMyRoute(Interface): pass multiview1 = dummy.DummyMultiView( view, context='context', view_name='a1' ) registry.registerAdapter( multiview1, (IViewClassifier, IMyRoute, Interface), IMultiView, '' ) registry.registerUtility(IMyRoute, IRouteRequest, name='a') command = self._makeOne() route = dummy.DummyRoute('a', '/a') mapper = dummy.DummyMapper(route) command._get_mapper = lambda *arg: mapper L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split()[:3] view_module = 'tests.test_scripts.dummy' view_str = '' ] self.assertEqual(compare_to, expected) def test_route_static_views(self): from pyramid.renderers import null_renderer as nr config = self._makeConfig(autocommit=True) config.add_static_view('static', 'static', cache_max_age=3600) path2 = os.path.normpath('/var/www/static') config.add_static_view(name='static2', path=path2) config.add_static_view( name='pyramid_scaffold', path='pyramid:scaffolds/starter/+package+/static' ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 5) expected = [ ['__static/', '/static/*subpath', 'tests.test_scripts:static/', '*'], ['__static2/', '/static2/*subpath', path2 + os.sep, '*'], ['__pyramid_scaffold/', '/pyramid_scaffold/*subpath', 'pyramid:scaffolds/starter/+package+/static/', '*'], ] for index, line in enumerate(L[2:]): data = line.split() self.assertEqual(data, expected[index]) def test_route_no_view(self): from pyramid.renderers import null_renderer as nr config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b', request_method='POST') command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = [ 'foo', '/a/b', '', 'POST', ] self.assertEqual(compare_to, expected) def test_route_as_wsgiapp(self): from pyramid.wsgi import wsgiapp2 config1 = self._makeConfig(autocommit=True) def view1(context, request): return 'view1' config1.add_route('foo', '/a/b', request_method='POST') config1.add_view(view=view1, route_name='foo') config2 = self._makeConfig(autocommit=True) config2.add_route('foo', '/a/b', request_method='POST') config2.add_view( wsgiapp2(config1.make_wsgi_app()), route_name='foo', ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config2.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = [ 'foo', '/a/b', '', 'POST', ] self.assertEqual(compare_to, expected) def test_route_is_get_view_request_method_not_post(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b', request_method='GET') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = [ 'foo', '/a/b', 'tests.test_scripts.test_proutes.view1', 'GET' ] self.assertEqual(compare_to, expected) def test_view_request_method_not_post(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = [ 'foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*' ] self.assertEqual(compare_to, expected) def test_view_glob(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' def view2(context, request): return 'view2' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) config.add_route('bar', '/b/a') config.add_view( route_name='bar', view=view2, renderer=nr, request_method=not_('POST') ) command = self._makeOne() command.args.glob = '*foo*' L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = [ 'foo', '/a/b', 'tests.test_scripts.test_proutes.view1', '!POST,*' ] self.assertEqual(compare_to, expected) def test_good_format(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) command = self._makeOne() command.args.glob = '*foo*' command.args.format = 'method,name' L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = ['!POST,*', 'foo'] self.assertEqual(compare_to, expected) self.assertEqual(L[0].split(), ['Method', 'Name']) def test_bad_format(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) command = self._makeOne() command.args.glob = '*foo*' command.args.format = 'predicates,name,pattern' L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) expected = ( "You provided invalid formats ['predicates'], " "Available formats are ['name', 'pattern', 'view', 'method']" ) result = command.run() self.assertEqual(result, 2) self.assertEqual(L[0], expected) def test_config_format_ini_newlines(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) command.get_config_loader = dummy.DummyLoader( {'proutes': {'format': 'method\nname'}}) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = ['!POST,*', 'foo'] self.assertEqual(compare_to, expected) self.assertEqual(L[0].split(), ['Method', 'Name']) def test_config_format_ini_spaces(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) command.get_config_loader = dummy.DummyLoader( {'proutes': {'format': 'method name'}}) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = ['!POST,*', 'foo'] self.assertEqual(compare_to, expected) self.assertEqual(L[0].split(), ['Method', 'Name']) def test_config_format_ini_commas(self): from pyramid.renderers import null_renderer as nr from pyramid.config import not_ def view1(context, request): return 'view1' config = self._makeConfig(autocommit=True) config.add_route('foo', '/a/b') config.add_view( route_name='foo', view=view1, renderer=nr, request_method=not_('POST') ) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) command.get_config_loader = dummy.DummyLoader( {'proutes': {'format': 'method,name'}}) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = ['!POST,*', 'foo'] self.assertEqual(compare_to, expected) self.assertEqual(L[0].split(), ['Method', 'Name']) def test_static_routes_included_in_list(self): from pyramid.renderers import null_renderer as nr config = self._makeConfig(autocommit=True) config.add_route('foo', 'http://example.com/bar.aspx', static=True) command = self._makeOne() L = [] command.out = L.append command.bootstrap = dummy.DummyBootstrap(registry=config.registry) result = command.run() self.assertEqual(result, 0) self.assertEqual(len(L), 3) compare_to = L[-1].split() expected = [ 'foo', 'http://example.com/bar.aspx', '', '*', ] self.assertEqual(compare_to, expected) class Test_main(unittest.TestCase): def _callFUT(self, argv): from pyramid.scripts.proutes import main return main(argv, quiet=True) def test_it(self): result = self._callFUT(['proutes']) self.assertEqual(result, 2)