diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-07 04:44:57 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-07 04:44:57 +0000 |
| commit | 7de404bb4af2744a64c13e31a780fc0229b8f9e5 (patch) | |
| tree | 49f0b91b005777071050bf72732300f3bcd8d3ad /repoze/bfg/tests | |
| parent | 93a4f5df2f74e4cbefc70733f2c0258859207106 (diff) | |
| download | pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.tar.gz pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.tar.bz2 pyramid-7de404bb4af2744a64c13e31a780fc0229b8f9e5.zip | |
Look up a view after traversal; adapt it to IWSGIApplication.
Diffstat (limited to 'repoze/bfg/tests')
| -rw-r--r-- | repoze/bfg/tests/test_router.py | 263 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_traversal.py | 72 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_wsgiadapter.py | 75 |
3 files changed, 257 insertions, 153 deletions
diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index c684e06b5..bfa72fe41 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -9,12 +9,24 @@ class RouterTests(unittest.TestCase, PlacelessSetup): def tearDown(self): PlacelessSetup.tearDown(self) - def _registerFactory(self, app, name, *for_): + def _registerTraverserFactory(self, app, name, *for_): + import zope.component + gsm = zope.component.getGlobalSiteManager() + from repoze.bfg.interfaces import IPublishTraverserFactory + gsm.registerAdapter(app, for_, IPublishTraverserFactory, name) + + def _registerViewFactory(self, app, name, *for_): + import zope.component + gsm = zope.component.getGlobalSiteManager() + from repoze.bfg.interfaces import IViewFactory + gsm.registerAdapter(app, for_, IViewFactory, name) + + def _registerWSGIFactory(self, app, name, *for_): import zope.component gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import IWSGIApplicationFactory gsm.registerAdapter(app, for_, IWSGIApplicationFactory, name) - + def _getTargetClass(self): from repoze.bfg.router import Router return Router @@ -33,151 +45,166 @@ class RouterTests(unittest.TestCase, PlacelessSetup): environ.update(extras) return environ - def test_call_no_app_registered(self): - statii = [] - headerii = [] - def rootpolicy(environ): - return None - def traversalpolicy(environ, root): - return DummyContext(), 'foo', [] - def securitypolicy(environ, context, name): - return None - def start_response(status, headers): - statii[:] = [status] - headerii[:] = [headers] + def test_call_no_view_registered(self): + rootpolicy = make_rootpolicy(None) environ = self._makeEnviron() - router = self._makeOne(rootpolicy, traversalpolicy, securitypolicy) + context = DummyContext() + traversalfactory = make_traversal_factory(context, '', []) + self._registerTraverserFactory(traversalfactory, '', None, None) + router = self._makeOne(rootpolicy) + start_response = DummyStartResponse() result = router(environ, start_response) - headers = headerii[0] + headers = start_response.headers self.assertEqual(len(headers), 2) - status = statii[0] + status = start_response.status self.assertEqual(status, '404 Not Found') self.failUnless('http://localhost:8080' in result[0], result) - def test_call_securitypolicy_denies(self): - statii = [] - headerii = [] - def rootpolicy(environ): - return None - def traversalpolicy(environ, root): - return DummyContext(), 'foo', [] - def securitypolicy(environ, context, name): - from webob.exc import HTTPUnauthorized - return HTTPUnauthorized() - def start_response(status, headers): - statii[:] = [status] - headerii[:] = [headers] - environ = self._makeEnviron() - router = self._makeOne(rootpolicy, traversalpolicy, securitypolicy) - result = router(environ, start_response) - headers = headerii[0] - self.assertEqual(len(headers), 2) - status = statii[0] - self.assertEqual(status, '401 Unauthorized') - - def test_call_app_registered_nonspecific_default_path(self): - def rootpolicy(environ): - return None + def test_call_view_registered_nonspecific_default_path(self): + rootpolicy = make_rootpolicy(None) context = DummyContext() - def traversalpolicy(environ, root): - return context, '', [] - def start_response(status, headers): - pass - def securitypolicy(environ, context, name): - return None + traversalfactory = make_traversal_factory(context, '', []) + response = DummyResponse() + viewfactory = make_view_factory(response) + wsgifactory = make_wsgi_factory('200 OK', (), ['Hello world']) environ = self._makeEnviron() - self._registerFactory(DummyWSGIApplicationFactory, '', None, None) - router = self._makeOne(rootpolicy, traversalpolicy, securitypolicy) + self._registerTraverserFactory(traversalfactory, '', None, None) + self._registerViewFactory(viewfactory, '', None, None) + self._registerWSGIFactory(wsgifactory, '', None, None) + router = self._makeOne(rootpolicy) + start_response = DummyStartResponse() result = router(environ, start_response) - self.failUnless(result[0] is context) - import webob - self.failUnless(isinstance(result[1], webob.Request)) - self.assertEqual(environ['repoze.bfg.subpath'], []) - - def test_call_app_registered_nonspecific_nondefault_path_and_subpath(self): - def rootpolicy(environ): - return None + self.assertEqual(result, ['Hello world']) + self.assertEqual(start_response.headers, ()) + self.assertEqual(start_response.status, '200 OK') + request = environ['request'] + self.assertEqual(environ['request'].subpath, []) + self.assertEqual(environ['view'].context, context) + + def test_call_view_registered_nonspecific_nondefault_path_and_subpath(self): + rootpolicy = make_rootpolicy(None) context = DummyContext() - def traversalpolicy(environ, root): - return context, 'foo', ['bar', 'baz'] - def start_response(status, headers): - pass - def securitypolicy(environ, context, name): - return None + traversalfactory = make_traversal_factory(context, 'foo', ['bar']) + response = DummyResponse() + viewfactory = make_view_factory(response) + wsgifactory = make_wsgi_factory('200 OK', (), ['Hello world']) environ = self._makeEnviron() - self._registerFactory(DummyWSGIApplicationFactory, 'foo', None, None) - router = self._makeOne(rootpolicy, traversalpolicy, securitypolicy) + self._registerTraverserFactory(traversalfactory, '', None, None) + self._registerViewFactory(viewfactory, 'foo', None, None) + self._registerWSGIFactory(wsgifactory, '', None, None) + router = self._makeOne(rootpolicy) + start_response = DummyStartResponse() result = router(environ, start_response) - self.failUnless(result[0] is context) - import webob - self.failUnless(isinstance(result[1], webob.Request)) - self.assertEqual(environ['repoze.bfg.subpath'], ['bar', 'baz']) - - def test_call_app_registered_specific_success(self): - def rootpolicy(environ): - return None - context = DummyContext() + self.assertEqual(result, ['Hello world']) + self.assertEqual(start_response.headers, ()) + self.assertEqual(start_response.status, '200 OK') + request = environ['request'] + self.assertEqual(environ['request'].subpath, ['bar']) + self.assertEqual(environ['view'].context, context) + + def test_call_view_registered_specific_success(self): + rootpolicy = make_rootpolicy(None) 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) - def traversalpolicy(environ, root): - return context, 'foo', ['bar', 'baz'] - def start_response(status, headers): - pass - def securitypolicy(environ, context, name): - return None + traversalfactory = make_traversal_factory(context, '', []) + response = DummyResponse() + viewfactory = make_view_factory(response) + wsgifactory = make_wsgi_factory('200 OK', (), ['Hello world']) environ = self._makeEnviron() - from repoze.bfg.interfaces import IWebObRequest - self._registerFactory(DummyWSGIApplicationFactory, 'foo', IContext, - IWebObRequest) - router = self._makeOne(rootpolicy, traversalpolicy, securitypolicy) + self._registerTraverserFactory(traversalfactory, '', None, None) + self._registerViewFactory(viewfactory, '', IContext, IRequest) + self._registerWSGIFactory(wsgifactory, '', None, None) + router = self._makeOne(rootpolicy) + start_response = DummyStartResponse() result = router(environ, start_response) - self.failUnless(result[0] is context) - import webob - self.failUnless(isinstance(result[1], webob.Request)) - self.assertEqual(environ['repoze.bfg.subpath'], ['bar', 'baz']) + self.assertEqual(result, ['Hello world']) + self.assertEqual(start_response.headers, ()) + self.assertEqual(start_response.status, '200 OK') + request = environ['request'] + self.assertEqual(environ['request'].subpath, []) + self.assertEqual(environ['view'].context, context) - def test_call_app_registered_specific_fail(self): - context = DummyContext() + def test_call_view_registered_specific_fail(self): + rootpolicy = make_rootpolicy(None) from zope.interface import Interface from zope.interface import directlyProvides - class INotContext(Interface): - pass class IContext(Interface): pass + class INotContext(Interface): + pass + from repoze.bfg.interfaces import IRequest + context = DummyContext() directlyProvides(context, INotContext) - statii = [] - headerii = [] - def rootpolicy(environ): - return None - def traversalpolicy(environ, root): - return context, 'foo', [] - def start_response(status, headers): - statii[:] = [status] - headerii[:] = [headers] - def securitypolicy(environ, context, name): - return None + traversalfactory = make_traversal_factory(context, '', ['']) + response = DummyResponse() + viewfactory = make_view_factory(response) + wsgifactory = make_wsgi_factory('200 OK', (), ['Hello world']) environ = self._makeEnviron() - from repoze.bfg.interfaces import IWebObRequest - self._registerFactory(DummyWSGIApplicationFactory, 'foo', IContext, - IWebObRequest) - router = self._makeOne(rootpolicy, traversalpolicy, securitypolicy) + self._registerTraverserFactory(traversalfactory, '', None, None) + self._registerViewFactory(viewfactory, '', IContext, IRequest) + self._registerWSGIFactory(wsgifactory, '', None, None) + router = self._makeOne(rootpolicy) + start_response = DummyStartResponse() result = router(environ, start_response) - headers = headerii[0] - self.assertEqual(len(headers), 2) - status = statii[0] - self.assertEqual(status, '404 Not Found') - self.failUnless('http://localhost:8080' in result[0], result) + self.failUnless('404' in result[0]) + self.assertEqual(start_response.status, '404 Not Found') class DummyContext: pass -class DummyWSGIApplicationFactory: - def __init__(self, context, request): - self.context = context - self.request = request +def make_wsgi_factory(status, headers, app_iter): + class DummyWSGIApplicationFactory: + def __init__(self, view, request): + self.view = view + self.request = request + + def __call__(self, environ, start_response): + environ['view'] = self.view + environ['request'] = self.request + start_response(status, headers) + return app_iter + + return DummyWSGIApplicationFactory + +def make_view_factory(response): + class DummyViewFactory: + def __init__(self, context, request): + self.context = context + self.request = request + + def __call__(self): + return response + return DummyViewFactory - def __call__(self, environ, start_response): - return self.context, self.request +def make_traversal_factory(context, name, subpath): + class DummyTraversalFactory: + def __init__(self, root, request): + self.root = root + self.request = request + + def __call__(self, path): + return context, name, subpath + return DummyTraversalFactory + +def make_rootpolicy(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 = () + diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py index bb0b98b79..115086b8b 100644 --- a/repoze/bfg/tests/test_traversal.py +++ b/repoze/bfg/tests/test_traversal.py @@ -36,62 +36,61 @@ class NaivePolicyTests(unittest.TestCase, PlacelessSetup): PlacelessSetup.tearDown(self) def _getTargetClass(self): - from repoze.bfg.traversal import NaiveTraversalPolicy - return NaiveTraversalPolicy + from repoze.bfg.traversal import NaivePublishTraverser + return NaivePublishTraverser def _makeOne(self, *arg, **kw): import zope.component gsm = zope.component.getGlobalSiteManager() - from repoze.bfg.interfaces import ITraverser - gsm.registerAdapter(DummyTraverser, (None,), ITraverser, '') klass = self._getTargetClass() return klass(*arg, **kw) - def test_class_conforms_to_ITraversalPolicy(self): + def test_class_conforms_to_IPublishTraverser(self): from zope.interface.verify import verifyClass - from repoze.bfg.interfaces import ITraversalPolicy - verifyClass(ITraversalPolicy, self._getTargetClass()) + from repoze.bfg.interfaces import IPublishTraverser + verifyClass(IPublishTraverser, self._getTargetClass()) - def test_instance_conforms_to_ITraversalPolicy(self): + def test_instance_conforms_to_IPublishTraverser(self): from zope.interface.verify import verifyObject - from repoze.bfg.interfaces import ITraversalPolicy - verifyObject(ITraversalPolicy, self._makeOne()) + from repoze.bfg.interfaces import IPublishTraverser + context = DummyContext() + request = DummyRequest() + verifyObject(IPublishTraverser, self._makeOne(context, request)) - def test_call_nonkeyerror_raises(self): - policy = self._makeOne() - environ = {'PATH_INFO':'/foo'} - root = None - self.assertRaises(TypeError, policy, environ, root) + def test_call_pathel_with_no_getitem(self): + request = DummyRequest() + policy = self._makeOne(None, request) + ctx, name, subpath = policy('/foo/bar') + self.assertEqual(ctx, None) + self.assertEqual(name, 'foo') + self.assertEqual(subpath, ['bar']) def test_call_withconn_getitem_emptypath_nosubpath(self): - policy = self._makeOne() - context = DummyContext() - environ = {'PATH_INFO':''} - root = context - ctx, name, subpath = policy(environ, root) - self.assertEqual(context, ctx) + root = DummyContext() + request = DummyRequest() + policy = self._makeOne(root, request) + ctx, name, subpath = policy('') + self.assertEqual(ctx, root) self.assertEqual(name, '') self.assertEqual(subpath, []) def test_call_withconn_getitem_withpath_nosubpath(self): - policy = self._makeOne() - context = DummyContext() - context2 = DummyContext(context) - environ = {'PATH_INFO':'/foo/bar'} - root = context - ctx, name, subpath = policy(environ, root) - self.assertEqual(context, ctx) + foo = DummyContext() + root = DummyContext(foo) + request = DummyRequest() + policy = self._makeOne(root, request) + ctx, name, subpath = policy('/foo/bar') + self.assertEqual(ctx, foo) self.assertEqual(name, 'bar') self.assertEqual(subpath, []) def test_call_withconn_getitem_withpath_withsubpath(self): - policy = self._makeOne() - context = DummyContext() - context2 = DummyContext(context) - environ = {'PATH_INFO':'/foo/bar/baz/buz'} - root = context - ctx, name, subpath = policy(environ, root) - self.assertEqual(context, ctx) + foo = DummyContext() + request = DummyRequest() + root = DummyContext(foo) + policy = self._makeOne(root, request) + ctx, name, subpath = policy('/foo/bar/baz/buz') + self.assertEqual(ctx, foo) self.assertEqual(name, 'bar') self.assertEqual(subpath, ['baz', 'buz']) @@ -103,6 +102,9 @@ class DummyContext: if self.next is None: raise KeyError, name return self.next + +class DummyRequest: + pass class DummyTraverser: def __init__(self, context): diff --git a/repoze/bfg/tests/test_wsgiadapter.py b/repoze/bfg/tests/test_wsgiadapter.py new file mode 100644 index 000000000..71e2f5c81 --- /dev/null +++ b/repoze/bfg/tests/test_wsgiadapter.py @@ -0,0 +1,75 @@ +import unittest + +class NaiveWSGIAdapterTests(unittest.TestCase): + def _getTargetClass(self): + from repoze.bfg.wsgiadapter import NaiveWSGIViewAdapter + return NaiveWSGIViewAdapter + + def _makeOne(self, *arg, **kw): + klass = self._getTargetClass() + return klass(*arg, **kw) + + def test_view_takes_no_args(self): + response = DummyResponse() + response.app_iter = ['Hello world'] + def view(): + return response + request = DummyRequest() + adapter = self._makeOne(view, request) + environ = {} + start_response = DummyStartResponse() + result = adapter(environ, start_response) + self.assertEqual(result, ['Hello world']) + self.assertEqual(start_response.headers, ()) + self.assertEqual(start_response.status, '200 OK') + + def test_view_takes_pep_333_args(self): + response = DummyResponse() + response.app_iter = ['Hello world'] + def view(environ, start_response): + response.environ = environ + response.start_response = start_response + return response + request = DummyRequest() + adapter = self._makeOne(view, request) + environ = {} + start_response = DummyStartResponse() + result = adapter(environ, start_response) + self.assertEqual(result, ['Hello world']) + self.assertEqual(start_response.headers, ()) + self.assertEqual(start_response.status, '200 OK') + self.assertEqual(response.environ, environ) + self.assertEqual(response.start_response, start_response) + + def test_view_takes_zopey_args(self): + request = DummyRequest() + response = DummyResponse() + response.app_iter = ['Hello world'] + def view(request): + response.request = request + return response + adapter = self._makeOne(view, request) + environ = {} + start_response = DummyStartResponse() + result = adapter(environ, start_response) + self.assertEqual(result, ['Hello world']) + self.assertEqual(start_response.headers, ()) + self.assertEqual(start_response.status, '200 OK') + self.assertEqual(response.request, request) + +class DummyRequest: + pass + +class DummyResponse: + status = '200 OK' + headerlist = () + app_iter = () + +class DummyStartResponse: + status = None + headers = None + def __call__(self, status, headers): + self.status = status + self.headers = headers + + |
