import unittest from repoze.bfg.testing import cleanUp class RouterTests(unittest.TestCase): def setUp(self): from repoze.bfg.registry import Registry from zope.component import getSiteManager self.registry = Registry() getSiteManager.sethook(lambda *arg: self.registry) def tearDown(self): from zope.component import getSiteManager getSiteManager.reset() cleanUp() def _registerLogger(self): from repoze.bfg.interfaces import ILogger logger = DummyLogger() self.registry.registerUtility(logger, ILogger, name='repoze.bfg.debug') return logger def _registerSettings(self, **kw): from repoze.bfg.interfaces import ISettings class Settings: def __init__(self, **kw): self.__dict__.update(kw) defaultkw = {'debug_authorization':False, 'debug_notfound':False} defaultkw.update(kw) settings = Settings(**defaultkw) self.registry.registerUtility(settings, ISettings) def _registerAuthenticationPolicy(self): from repoze.bfg.interfaces import IAuthenticationPolicy policy = DummyAuthenticationPolicy() self.registry.registerUtility(policy, IAuthenticationPolicy) return policy def _registerTraverserFactory(self, context, view_name='', subpath=None, traversed=None, virtual_root=None, virtual_root_path=None, **kw): from repoze.bfg.interfaces import ITraverserFactory if virtual_root is None: virtual_root = context if subpath is None: subpath = [] if traversed is None: traversed = [] if virtual_root_path is None: virtual_root_path = [] class DummyTraverserFactory: def __init__(self, root): self.root = root def __call__(self, path): values = {'root':self.root, 'context':context, 'view_name':view_name, 'subpath':subpath, 'traversed':traversed, 'virtual_root':virtual_root, 'virtual_root_path':virtual_root_path} kw.update(values) return kw self.registry.registerAdapter(DummyTraverserFactory, (None,), ITraverserFactory, name='') def _registerView(self, app, name, *for_): from repoze.bfg.interfaces import IView self.registry.registerAdapter(app, for_, IView, name) def _registerViewPermission(self, view_name, allow=True): from zope.interface import Interface from repoze.bfg.interfaces import IViewPermission class Checker(object): def __call__(self, context, request): self.context = context self.request = request return allow checker = Checker() self.registry.registerAdapter(checker, (Interface, Interface), IViewPermission, view_name) return checker def _registerEventListener(self, iface): L = [] def listener(event): L.append(event) self.registry.registerHandler(listener, (iface,)) return L def _registerRootFactory(self, val): rootfactory = make_rootfactory(val) from repoze.bfg.interfaces import IRootFactory self.registry.registerUtility(rootfactory, IRootFactory) return rootfactory def _getTargetClass(self): from repoze.bfg.router import Router return Router def _makeOne(self): klass = self._getTargetClass() return klass(self.registry) def _makeEnviron(self, **extras): environ = { 'wsgi.url_scheme':'http', 'SERVER_NAME':'localhost', 'SERVER_PORT':'8080', 'REQUEST_METHOD':'GET', 'PATH_INFO':'/', } environ.update(extras) return environ def test_root_policy(self): environ = self._makeEnviron() context = DummyContext() self._registerTraverserFactory(context) rootfactory = self._registerRootFactory(None) router = self._makeOne() self.assertEqual(router.root_policy, rootfactory) def test_iforbiddenview_override(self): from repoze.bfg.interfaces import IForbiddenView def app(): """ """ self.registry.registerUtility(app, IForbiddenView) self._registerRootFactory(None) router = self._makeOne() self.assertEqual(router.forbidden_view, app) def test_iforbiddenview_nooverride(self): context = DummyContext() self._registerRootFactory(None) router = self._makeOne() from repoze.bfg.router import default_forbidden_view self.assertEqual(router.forbidden_view, default_forbidden_view) def test_inotfoundview_override(self): from repoze.bfg.interfaces import INotFoundView def app(): """ """ self.registry.registerUtility(app, INotFoundView) self._registerRootFactory(None) router = self._makeOne() self.assertEqual(router.notfound_view, app) def test_inotfoundview_nooverride(self): context = DummyContext() self._registerRootFactory(None) router = self._makeOne() from repoze.bfg.router import default_notfound_view self.assertEqual(router.notfound_view, default_notfound_view) def test_iunauthorized_appfactory_BBB(self): from repoze.bfg.interfaces import IUnauthorizedAppFactory environ = self._makeEnviron() context = DummyContext() self._registerTraverserFactory(context) rootfactory = self._registerRootFactory(None) logger = self._registerLogger() def factory(): return 'yo' self.registry.registerUtility(factory, IUnauthorizedAppFactory) router = self._makeOne() self.assertEqual(len(logger.messages), 1) self.failUnless('IForbiddenView' in logger.messages[0]) class DummyRequest: def get_response(self, app): return app req = DummyRequest() self.assertEqual(router.forbidden_view(None, req), 'yo') def test_inotfound_appfactory_BBB(self): from repoze.bfg.interfaces import INotFoundAppFactory environ = self._makeEnviron() context = DummyContext() self._registerTraverserFactory(context) rootfactory = self._registerRootFactory(None) logger = self._registerLogger() def factory(): return 'yo' self.registry.registerUtility(factory, INotFoundAppFactory) router = self._makeOne() self.assertEqual(len(logger.messages), 1) self.failUnless('INotFoundView' in logger.messages[0]) class DummyRequest: def get_response(self, app): return app req = DummyRequest() self.assertEqual(router.notfound_view(None, req), 'yo') def test_call_no_view_registered_no_isettings(self): environ = self._makeEnviron() context = DummyContext() self._registerTraverserFactory(context) logger = self._registerLogger() self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) headers = start_response.headers self.assertEqual(len(headers), 2) status = start_response.status self.assertEqual(status, '404 Not Found') self.failUnless('http://localhost:8080' in result[0], result) self.failIf('debug_notfound' in result[0]) self.assertEqual(len(logger.messages), 0) def test_call_root_is_icontextnotfound(self): from zope.interface import implements from repoze.bfg.interfaces import IContextNotFound class NotFound(object): implements(IContextNotFound) context = NotFound() self._registerTraverserFactory(context) environ = self._makeEnviron() start_response = DummyStartResponse() self._registerRootFactory(NotFound()) router = self._makeOne() result = router(environ, start_response) status = start_response.status self.assertEqual(status, '404 Not Found') self.failUnless('http://localhost:8080' in result[0], result) def test_call_no_view_registered_debug_notfound_false(self): environ = self._makeEnviron() context = DummyContext() self._registerTraverserFactory(context) logger = self._registerLogger() self._registerSettings(debug_notfound=False) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) headers = start_response.headers self.assertEqual(len(headers), 2) status = start_response.status self.assertEqual(status, '404 Not Found') self.failUnless('http://localhost:8080' in result[0], result) self.failIf('debug_notfound' in result[0]) self.assertEqual(len(logger.messages), 0) def test_call_no_view_registered_debug_notfound_true(self): environ = self._makeEnviron() context = DummyContext() self._registerTraverserFactory(context) self._registerSettings(debug_notfound=True) logger = self._registerLogger() self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) headers = start_response.headers self.assertEqual(len(headers), 2) status = start_response.status self.assertEqual(status, '404 Not Found') self.failUnless( "debug_notfound of url http://localhost:8080/; path_info: '/', " "context:" in result[0]) self.failUnless( "view_name: '', subpath: []" in result[0]) self.failUnless('http://localhost:8080' in result[0], result) self.assertEqual(len(logger.messages), 1) message = logger.messages[0] self.failUnless('of url http://localhost:8080' in message) self.failUnless("path_info: '/'" in message) self.failUnless('DummyContext instance at' in message) self.failUnless("view_name: ''" in message) self.failUnless("subpath: []" in message) def test_call_view_returns_nonresponse(self): context = DummyContext() self._registerTraverserFactory(context) environ = self._makeEnviron() view = make_view('abc') self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() self.assertRaises(ValueError, router, environ, start_response) def test_inotfoundview_returns_nonresponse(self): from repoze.bfg.interfaces import INotFoundView context = DummyContext() environ = self._makeEnviron() self._registerTraverserFactory(context) self._registerRootFactory(None) def app(context, request): """ """ self.registry.registerUtility(app, INotFoundView) router = self._makeOne() start_response = DummyStartResponse() self.assertRaises(ValueError, router, environ, start_response) def test_iforbiddenview_returns_nonresponse(self): from repoze.bfg.interfaces import IForbiddenView from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context) self._registerAuthenticationPolicy() response = DummyResponse() view = make_view(response) from repoze.bfg.security import ACLDenied denied = ACLDenied('ace', 'acl', 'permission', ['principals'], context) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) checker = self._registerViewPermission('', denied) self._registerRootFactory(None) def app(context, request): """ """ self.registry.registerUtility(app, IForbiddenView) router = self._makeOne() start_response = DummyStartResponse() self.assertRaises(ValueError, router, environ, start_response) def test_call_view_registered_nonspecific_default_path(self): context = DummyContext() self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(result, ['Hello world']) self.assertEqual(start_response.headers, ()) self.assertEqual(start_response.status, '200 OK') self.assertEqual(environ['webob.adhoc_attrs']['view_name'], '') self.assertEqual(environ['webob.adhoc_attrs']['subpath'], []) self.assertEqual(environ['webob.adhoc_attrs']['context'], context) self.assertEqual(environ['webob.adhoc_attrs']['root'], None) def test_call_deprecation_warning(self): context = DummyContext() self._registerTraverserFactory(context, _deprecation_warning='abc') response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() logger = self._registerLogger() router.logger = logger start_response = DummyStartResponse() router(environ, start_response) self.assertEqual(len(logger.messages), 1) self.assertEqual(logger.messages[0], 'abc') def test_call_view_registered_nonspecific_nondefault_path_and_subpath(self): context = DummyContext() self._registerTraverserFactory(context, view_name='foo', subpath=['bar'], traversed=['context']) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron() self._registerView(view, 'foo', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(result, ['Hello world']) self.assertEqual(start_response.headers, ()) self.assertEqual(start_response.status, '200 OK') self.assertEqual(environ['webob.adhoc_attrs']['view_name'], 'foo') self.assertEqual(environ['webob.adhoc_attrs']['subpath'], ['bar']) self.assertEqual(environ['webob.adhoc_attrs']['context'], context) self.assertEqual(environ['webob.adhoc_attrs']['root'], None) def test_call_view_registered_specific_success(self): from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(result, ['Hello world']) self.assertEqual(start_response.headers, ()) self.assertEqual(start_response.status, '200 OK') self.assertEqual(environ['webob.adhoc_attrs']['view_name'], '') self.assertEqual(environ['webob.adhoc_attrs']['subpath'], []) self.assertEqual(environ['webob.adhoc_attrs']['context'], context) self.assertEqual(environ['webob.adhoc_attrs']['root'], None) def test_call_view_registered_specific_fail(self): from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass class INotContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, INotContext) self._registerTraverserFactory(context, subpath=['']) response = DummyResponse() view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '404 Not Found') self.failUnless('404' in result[0]) def test_call_view_permission_none(self): from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context, subpath=['']) response = DummyResponse() view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '200 OK') def test_call_view_no_authentication_policy_debug_authorization(self): logger = self._registerLogger() from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context, subpath=['']) response = DummyResponse() view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) self._registerRootFactory(None) router = self._makeOne() router.debug_authorization = True start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '200 OK') self.assertEqual(len(logger.messages), 1) self.failUnless('no authentication policy' in logger.messages[0]) def test_call_view_no_permission_registered_debug_authorization(self): self._registerAuthenticationPolicy() logger = self._registerLogger() from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context, subpath=['']) response = DummyResponse() view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) self._registerRootFactory(None) router = self._makeOne() router.debug_authorization = True start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '200 OK') self.assertEqual(len(logger.messages), 1) self.failUnless('no permission registered' in logger.messages[0]) def test_call_view_no_permission_registered_no_debug(self): self._registerAuthenticationPolicy() logger = self._registerLogger() from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context, subpath=['']) response = DummyResponse() view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) self._registerRootFactory(None) router = self._makeOne() router.debug_authorization = False start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '200 OK') self.assertEqual(len(logger.messages), 0) def test_call_view_permission_succeeds(self): from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context, subpath=['']) self._registerAuthenticationPolicy() response = DummyResponse() view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) checker = self._registerViewPermission('', True) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '200 OK') self.assertEqual(checker.context, context) def test_call_view_permission_fails_nosettings(self): from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context, subpath=['']) self._registerAuthenticationPolicy() response = DummyResponse() view = make_view(response) from repoze.bfg.security import ACLDenied denied = ACLDenied('ace', 'acl', 'permission', ['principals'], context) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) checker = self._registerViewPermission('', denied) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '401 Unauthorized') message = environ['repoze.bfg.message'] self.assertEqual(message, 'Unauthorized: failed security policy check') self.assertEqual(checker.context, context) def test_call_view_permission_fails_no_debug_auth(self): from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerTraverserFactory(context, subpath=['']) self._registerAuthenticationPolicy() response = DummyResponse() view = make_view(response) from repoze.bfg.security import ACLDenied denied = ACLDenied('ace', 'acl', 'permission', ['principals'], context) environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) checker = self._registerViewPermission('', denied) self._registerSettings(debug_authorization=False) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '401 Unauthorized') message = environ['repoze.bfg.message'] self.failUnless('failed security policy check' in message) self.assertEqual(checker.context, context) def test_call_view_permission_fails_with_debug_auth(self): from zope.interface import Interface from zope.interface import directlyProvides class IContext(Interface): pass from repoze.bfg.interfaces import IRequest context = DummyContext() directlyProvides(context, IContext) self._registerAuthenticationPolicy() self._registerTraverserFactory(context, subpath=['']) response = DummyResponse() view = make_view(response) from repoze.bfg.security import ACLDenied environ = self._makeEnviron() self._registerView(view, '', IContext, IRequest) allowed = ACLDenied('ace', 'acl', 'permission', ['principals'], context) checker = self._registerViewPermission('', allowed) self._registerSettings(debug_authorization=True) logger = self._registerLogger() self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(start_response.status, '401 Unauthorized') message = environ['repoze.bfg.message'] self.failUnless( "ACLDenied permission 'permission' via ACE 'ace' in ACL 'acl' " "on context" in message) self.failUnless("for principals ['principals']" in message) self.assertEqual(checker.context, context) self.assertEqual(len(logger.messages), 1) logged = logger.messages[0] self.failUnless( "debug_authorization of url http://localhost:8080/ (view name " "'' against context" in logged) self.failUnless( "ACLDenied permission 'permission' via ACE 'ace' in ACL 'acl' on " "context" in logged) self.failUnless( "for principals ['principals']" in logged) def test_call_eventsends(self): context = DummyContext() self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', None, None) from repoze.bfg.interfaces import INewRequest from repoze.bfg.interfaces import INewResponse request_events = self._registerEventListener(INewRequest) response_events = self._registerEventListener(INewResponse) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() result = router(environ, start_response) self.assertEqual(len(request_events), 1) self.assertEqual(request_events[0].request.environ, environ) self.assertEqual(len(response_events), 1) self.assertEqual(response_events[0].response, response) def test_call_pushes_and_pops_threadlocal_manager(self): context = DummyContext() self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() router.threadlocal_manager = DummyThreadLocalManager() result = router(environ, start_response) self.assertEqual(len(router.threadlocal_manager.pushed), 1) self.assertEqual(len(router.threadlocal_manager.popped), 1) def test_call_post_method(self): from repoze.bfg.interfaces import INewRequest from repoze.bfg.interfaces import IPOSTRequest from repoze.bfg.interfaces import IPUTRequest from repoze.bfg.interfaces import IRequest context = DummyContext() self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron(REQUEST_METHOD='POST') self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() request_events = self._registerEventListener(INewRequest) result = router(environ, start_response) request = request_events[0].request self.failUnless(IPOSTRequest.providedBy(request)) self.failIf(IPUTRequest.providedBy(request)) self.failUnless(IRequest.providedBy(request)) def test_call_put_method(self): from repoze.bfg.interfaces import INewRequest from repoze.bfg.interfaces import IPUTRequest from repoze.bfg.interfaces import IPOSTRequest from repoze.bfg.interfaces import IRequest context = DummyContext() self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron(REQUEST_METHOD='PUT') self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() request_events = self._registerEventListener(INewRequest) result = router(environ, start_response) request = request_events[0].request self.failUnless(IPUTRequest.providedBy(request)) self.failIf(IPOSTRequest.providedBy(request)) self.failUnless(IRequest.providedBy(request)) def test_call_unknown_method(self): from repoze.bfg.interfaces import INewRequest from repoze.bfg.interfaces import IRequest context = DummyContext() self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron(REQUEST_METHOD='UNKNOWN') self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() request_events = self._registerEventListener(INewRequest) result = router(environ, start_response) request = request_events[0].request self.failUnless(IRequest.providedBy(request)) def test_call_irequestfactory_override(self): from repoze.bfg.interfaces import INewRequest from repoze.bfg.interfaces import IRequestFactory from repoze.bfg.testing import DummyRequest self.registry.registerUtility(DummyRequest, IRequestFactory) context = DummyContext() self._registerTraverserFactory(context) response = DummyResponse() response.app_iter = ['Hello world'] view = make_view(response) environ = self._makeEnviron() self._registerView(view, '', None, None) self._registerRootFactory(None) router = self._makeOne() start_response = DummyStartResponse() request_events = self._registerEventListener(INewRequest) result = router(environ, start_response) request = request_events[0].request self.failUnless(isinstance(request, DummyRequest)) self.assertEqual(request.root, None) self.assertEqual(request.context, context) self.assertEqual(request.view_name, '') self.assertEqual(request.subpath, []) class MakeAppTests(unittest.TestCase): def setUp(self): cleanUp() import repoze.bfg.router self.old_tl_manager = repoze.bfg.router.manager self.regmgr = DummyRegistryManager() repoze.bfg.router.manager = self.regmgr def tearDown(self): cleanUp() import repoze.bfg.router repoze.bfg.router.threadlocal_manager = self.old_tl_manager def _callFUT(self, *arg, **kw): from repoze.bfg.router import make_app return make_app(*arg, **kw) def test_fixtureapp(self): from repoze.bfg.tests import fixtureapp rootpolicy = make_rootfactory(None) app = self._callFUT(rootpolicy, fixtureapp) self.assertEqual(app.registry.__name__, 'repoze.bfg.tests.fixtureapp') def test_event(self): def subscriber(event): event.app.created = True from repoze.bfg.interfaces import IWSGIApplicationCreatedEvent from zope.component import getGlobalSiteManager getGlobalSiteManager().registerHandler( subscriber, (IWSGIApplicationCreatedEvent,) ) from repoze.bfg.tests import fixtureapp rootpolicy = make_rootfactory(None) app = self._callFUT(rootpolicy, fixtureapp) assert app.created is True def test_registrations(self): options= {'reload_templates':True, 'debug_authorization':True} from repoze.bfg.tests import fixtureapp rootpolicy = make_rootfactory(None) app = self._callFUT(rootpolicy, fixtureapp, options=options) from repoze.bfg.interfaces import ISettings from repoze.bfg.interfaces import ILogger from repoze.bfg.interfaces import IRootFactory settings = app.registry.getUtility(ISettings) logger = app.registry.getUtility(ILogger, name='repoze.bfg.debug') rootfactory = app.registry.getUtility(IRootFactory) self.assertEqual(logger.name, 'repoze.bfg.debug') self.assertEqual(settings.reload_templates, True) self.assertEqual(settings.debug_authorization, True) self.assertEqual(rootfactory, rootpolicy) self.failUnless(self.regmgr.pushed and self.regmgr.popped) def test_routes_in_config_with_rootpolicy(self): options= {'reload_templates':True, 'debug_authorization':True} from repoze.bfg.urldispatch import RoutesRootFactory from repoze.bfg.tests import routesapp rootpolicy = make_rootfactory(None) app = self._callFUT(rootpolicy, routesapp, options=options) from repoze.bfg.interfaces import ISettings from repoze.bfg.interfaces import ILogger from repoze.bfg.interfaces import IRootFactory settings = app.registry.getUtility(ISettings) logger = app.registry.getUtility(ILogger, name='repoze.bfg.debug') rootfactory = app.registry.getUtility(IRootFactory) self.assertEqual(logger.name, 'repoze.bfg.debug') self.assertEqual(settings.reload_templates, True) self.assertEqual(settings.debug_authorization, True) self.failUnless(isinstance(rootfactory, RoutesRootFactory)) self.assertEqual(rootfactory.get_root, rootpolicy) self.failUnless(self.regmgr.pushed and self.regmgr.popped) def test_routes_in_config_no_rootpolicy(self): options= {'reload_templates':True, 'debug_authorization':True} from repoze.bfg.urldispatch import RoutesRootFactory from repoze.bfg.tests import routesapp app = self._callFUT(None, routesapp, options=options) from repoze.bfg.interfaces import ISettings from repoze.bfg.interfaces import ILogger from repoze.bfg.interfaces import IRootFactory settings = app.registry.getUtility(ISettings) logger = app.registry.getUtility(ILogger, name='repoze.bfg.debug') rootfactory = app.registry.getUtility(IRootFactory) self.assertEqual(logger.name, 'repoze.bfg.debug') self.assertEqual(settings.reload_templates, True) self.assertEqual(settings.debug_authorization, True) self.failUnless(isinstance(rootfactory, RoutesRootFactory)) self.assertEqual(rootfactory.get_root, None) self.failUnless(self.regmgr.pushed and self.regmgr.popped) def test_no_routes_in_config_no_rootpolicy(self): options= {'reload_templates':True, 'debug_authorization':True} from repoze.bfg.tests import fixtureapp self.assertRaises(ValueError, self._callFUT, None, fixtureapp, options=options) def test_authorization_policy_no_authentication_policy(self): from repoze.bfg.interfaces import IAuthorizationPolicy authzpolicy = DummyContext() from repoze.bfg.tests import routesapp app = self._callFUT(None, routesapp, authorization_policy=authzpolicy) self.failIf(app.registry.queryUtility(IAuthorizationPolicy)) def test_authentication_policy_no_authorization_policy(self): from repoze.bfg.interfaces import IAuthorizationPolicy from repoze.bfg.interfaces import IAuthenticationPolicy from repoze.bfg.authorization import ACLAuthorizationPolicy authnpolicy = DummyContext() from repoze.bfg.tests import routesapp app = self._callFUT(None, routesapp, authentication_policy=authnpolicy) self.assertEqual(app.registry.getUtility(IAuthenticationPolicy), authnpolicy) self.assertEqual( app.registry.getUtility(IAuthorizationPolicy).__class__, ACLAuthorizationPolicy) def test_authentication_policy_and_authorization_policy(self): from repoze.bfg.interfaces import IAuthorizationPolicy from repoze.bfg.interfaces import IAuthenticationPolicy authnpolicy = DummyContext() authzpolicy = DummyContext() from repoze.bfg.tests import routesapp app = self._callFUT(None, routesapp, authentication_policy=authnpolicy, authorization_policy = authzpolicy) self.assertEqual(app.registry.getUtility(IAuthenticationPolicy), authnpolicy) self.assertEqual(app.registry.getUtility(IAuthorizationPolicy), authzpolicy) def test_secpol_BBB_registrations(self): from repoze.bfg.interfaces import IAuthorizationPolicy from repoze.bfg.interfaces import IAuthenticationPolicy from repoze.bfg.interfaces import ISecurityPolicy secpol = DummySecurityPolicy() from zope.component import getGlobalSiteManager gsm = getGlobalSiteManager() gsm.registerUtility(secpol, ISecurityPolicy) from repoze.bfg.tests import routesapp logger = DummyLogger() app = self._callFUT(None, routesapp, registry=gsm, debug_logger=logger) self.failUnless(app.registry.queryUtility(IAuthenticationPolicy)) self.failUnless(app.registry.queryUtility(IAuthorizationPolicy)) self.assertEqual(len(logger.messages), 1) self.failUnless('ISecurityPolicy' in logger.messages[0]) class TestDefaultForbiddenView(unittest.TestCase): def _callFUT(self, context, request): from repoze.bfg.router import default_forbidden_view return default_forbidden_view(context, request) def test_nomessage(self): request = DummyRequest({}) context = DummyContext() response = self._callFUT(context, request) self.failUnless('' in response.body) def test_withmessage(self): request = DummyRequest({'repoze.bfg.message':'abc&123'}) context = DummyContext() response = self._callFUT(context, request) self.failUnless('abc&123' in response.body) class DummyRegistryManager: def push(self, registry): self.pushed = True def pop(self): self.popped = True class DummyContext: pass def make_view(response): def view(context, request): return response return view def make_rootfactory(root): def rootpolicy(environ): return root return rootpolicy class DummyStartResponse: status = () headers = () def __call__(self, status, headers): self.status = status self.headers = headers class DummyResponse: status = '200 OK' headerlist = () app_iter = () class DummySecurityPolicy: pass class DummyRequest: def __init__(self, environ): self.environ = environ class DummyLogger: def __init__(self): self.messages = [] def info(self, msg): self.messages.append(msg) warn = info debug = info class DummyThreadLocalManager: def __init__(self): self.pushed = [] self.popped = [] def push(self, val): self.pushed.append(val) def pop(self): self.popped.append(True) class DummyAuthenticationPolicy: pass