From c8cf2256655ee4b34ec501325b9016608b5cce5f Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Thu, 15 Jan 2009 00:20:04 +0000 Subject: - Instead of invariably using ``webob.Request`` as the "request factory" (e.g. in the ``Router`` class) and ``webob.Response`` and the "response factory" (e.g. in ``render_template_to_response``), allow both to be overridden via a ZCML utility hook. See the "Using ZCML Hooks" chapter of the documentation for more information. --- repoze/bfg/tests/test_chameleon_genshi.py | 59 +++++++------------ repoze/bfg/tests/test_chameleon_text.py | 43 +++++--------- repoze/bfg/tests/test_chameleon_zpt.py | 59 +++++++------------ repoze/bfg/tests/test_router.py | 98 ++++++++++++++++++------------- repoze/bfg/tests/test_view.py | 16 +++++ repoze/bfg/tests/test_wsgi.py | 29 +++++++++ repoze/bfg/tests/test_xslt.py | 22 +++++++ 7 files changed, 183 insertions(+), 143 deletions(-) (limited to 'repoze/bfg/tests') diff --git a/repoze/bfg/tests/test_chameleon_genshi.py b/repoze/bfg/tests/test_chameleon_genshi.py index 3b0c05b34..9b210e1ad 100644 --- a/repoze/bfg/tests/test_chameleon_genshi.py +++ b/repoze/bfg/tests/test_chameleon_genshi.py @@ -1,13 +1,13 @@ import unittest -from zope.component.testing import PlacelessSetup +from zope.testing.cleanup import cleanUp -class Base(PlacelessSetup): +class Base(object): def setUp(self): - PlacelessSetup.setUp(self) + cleanUp() def tearDown(self): - PlacelessSetup.tearDown(self) + cleanUp() def _zcmlConfigure(self): import repoze.bfg.includes @@ -20,13 +20,7 @@ class Base(PlacelessSetup): here = os.path.abspath(os.path.dirname(__file__)) return os.path.join(here, 'fixtures', name) -class GenshiTemplateRendererTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class GenshiTemplateRendererTests(Base, unittest.TestCase): def _getTargetClass(self): from repoze.bfg.chameleon_genshi import GenshiTemplateRenderer return GenshiTemplateRenderer @@ -64,13 +58,7 @@ class GenshiTemplateRendererTests(unittest.TestCase, Base): self.assertEqual(result, '
\n
') -class RenderTemplateTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class RenderTemplateTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_genshi import render_template return render_template @@ -83,13 +71,7 @@ class RenderTemplateTests(unittest.TestCase, Base): self.assertEqual(result, '
\n
') -class RenderTemplateToResponseTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class RenderTemplateToResponseTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_genshi import render_template_to_response return render_template_to_response @@ -105,13 +87,20 @@ class RenderTemplateToResponseTests(unittest.TestCase, Base): self.assertEqual(result.status, '200 OK') self.assertEqual(len(result.headerlist), 2) -class GetRendererTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) + def test_iresponsefactory_override(self): + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() + from webob import Response + class Response2(Response): + pass + from repoze.bfg.interfaces import IResponseFactory + gsm.registerUtility(Response2, IResponseFactory) + minimal = self._getTemplatePath('minimal.genshi') + render = self._getFUT() + result = render(minimal) + self.failUnless(isinstance(result, Response2)) +class GetRendererTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_genshi import get_renderer return get_renderer @@ -160,13 +149,7 @@ class GetRendererTests(unittest.TestCase, Base): self.failUnless(result is utility) -class GetTemplateTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class GetTemplateTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_genshi import get_template return get_template diff --git a/repoze/bfg/tests/test_chameleon_text.py b/repoze/bfg/tests/test_chameleon_text.py index f61cfe963..992957d0e 100644 --- a/repoze/bfg/tests/test_chameleon_text.py +++ b/repoze/bfg/tests/test_chameleon_text.py @@ -20,13 +20,7 @@ class Base: here = os.path.abspath(os.path.dirname(__file__)) return os.path.join(here, 'fixtures', name) -class TextTemplateRendererTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class TextTemplateRendererTests(Base, unittest.TestCase): def _getTargetClass(self): from repoze.bfg.chameleon_text import TextTemplateRenderer return TextTemplateRenderer @@ -70,13 +64,7 @@ class TextTemplateRendererTests(unittest.TestCase, Base): self.failUnless(isinstance(result, str)) self.assertEqual(result, 'Hello.\n') -class RenderTemplateTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class RenderTemplateTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_text import render_template return render_template @@ -89,13 +77,7 @@ class RenderTemplateTests(unittest.TestCase, Base): self.failUnless(isinstance(result, str)) self.assertEqual(result, 'Hello.\n') -class RenderTemplateToResponseTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class RenderTemplateToResponseTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_text import render_template_to_response return render_template_to_response @@ -111,13 +93,20 @@ class RenderTemplateToResponseTests(unittest.TestCase, Base): self.assertEqual(result.status, '200 OK') self.assertEqual(len(result.headerlist), 2) -class GetRendererTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) + def test_iresponsefactory_override(self): + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() + from webob import Response + class Response2(Response): + pass + from repoze.bfg.interfaces import IResponseFactory + gsm.registerUtility(Response2, IResponseFactory) + minimal = self._getTemplatePath('minimal.txt') + render = self._getFUT() + result = render(minimal) + self.failUnless(isinstance(result, Response2)) +class GetRendererTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_text import get_renderer return get_renderer diff --git a/repoze/bfg/tests/test_chameleon_zpt.py b/repoze/bfg/tests/test_chameleon_zpt.py index 995dd92e1..088930069 100644 --- a/repoze/bfg/tests/test_chameleon_zpt.py +++ b/repoze/bfg/tests/test_chameleon_zpt.py @@ -1,13 +1,13 @@ import unittest -from zope.component.testing import PlacelessSetup +from zope.testing.cleanup import cleanUp -class Base(PlacelessSetup): +class Base(object): def setUp(self): - PlacelessSetup.setUp(self) + cleanUp() def tearDown(self): - PlacelessSetup.tearDown(self) + cleanUp() def _zcmlConfigure(self): import repoze.bfg.includes @@ -20,13 +20,7 @@ class Base(PlacelessSetup): here = os.path.abspath(os.path.dirname(__file__)) return os.path.join(here, 'fixtures', name) -class ZPTTemplateRendererTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class ZPTTemplateRendererTests(Base, unittest.TestCase): def _getTargetClass(self): from repoze.bfg.chameleon_zpt import ZPTTemplateRenderer return ZPTTemplateRenderer @@ -65,13 +59,7 @@ class ZPTTemplateRendererTests(unittest.TestCase, Base): '
\n
') -class RenderTemplateTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class RenderTemplateTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_zpt import render_template return render_template @@ -85,13 +73,7 @@ class RenderTemplateTests(unittest.TestCase, Base): self.assertEqual(result, '
\n
') -class RenderTemplateToResponseTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class RenderTemplateToResponseTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_zpt import render_template_to_response return render_template_to_response @@ -108,13 +90,20 @@ class RenderTemplateToResponseTests(unittest.TestCase, Base): self.assertEqual(result.status, '200 OK') self.assertEqual(len(result.headerlist), 2) -class GetRendererTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) + def test_iresponsefactory_override(self): + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() + from webob import Response + class Response2(Response): + pass + from repoze.bfg.interfaces import IResponseFactory + gsm.registerUtility(Response2, IResponseFactory) + minimal = self._getTemplatePath('minimal.pt') + render = self._getFUT() + result = render(minimal) + self.failUnless(isinstance(result, Response2)) +class GetRendererTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_zpt import get_renderer return get_renderer @@ -162,13 +151,7 @@ class GetRendererTests(unittest.TestCase, Base): result = get('foo') self.failUnless(result is utility) -class GetTemplateTests(unittest.TestCase, Base): - def setUp(self): - Base.setUp(self) - - def tearDown(self): - Base.tearDown(self) - +class GetTemplateTests(Base, unittest.TestCase): def _getFUT(self): from repoze.bfg.chameleon_zpt import get_template return get_template diff --git a/repoze/bfg/tests/test_router.py b/repoze/bfg/tests/test_router.py index 298065d9b..e0d27b332 100644 --- a/repoze/bfg/tests/test_router.py +++ b/repoze/bfg/tests/test_router.py @@ -1,17 +1,15 @@ import unittest -from zope.component.testing import PlacelessSetup +from zope.testing.cleanup import cleanUp -class RouterTests(unittest.TestCase, PlacelessSetup): +class RouterTests(unittest.TestCase): def setUp(self): - PlacelessSetup.setUp(self) + cleanUp() def tearDown(self): - PlacelessSetup.tearDown(self) + cleanUp() def _registerLogger(self): - import zope.component - gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import ILogger class Logger: def __init__(self): @@ -20,12 +18,12 @@ class RouterTests(unittest.TestCase, PlacelessSetup): self.messages.append(msg) debug = info logger = Logger() + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() gsm.registerUtility(logger, ILogger, name='repoze.bfg.debug') return logger def _registerSettings(self, **kw): - import zope.component - gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import ISettings class Settings: def __init__(self, **kw): @@ -34,41 +32,47 @@ class RouterTests(unittest.TestCase, PlacelessSetup): defaultkw = {'debug_authorization':False, 'debug_notfound':False} defaultkw.update(kw) settings = Settings(**defaultkw) + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() gsm.registerUtility(settings, ISettings) def _registerTraverserFactory(self, app, name, *for_): - import zope.component - gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import ITraverserFactory + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() gsm.registerAdapter(app, for_, ITraverserFactory, name) def _registerView(self, app, name, *for_): - import zope.component - gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import IView + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() gsm.registerAdapter(app, for_, IView, name) def _registerPermission(self, permission, name, *for_): - import zope.component - gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import IViewPermission + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() gsm.registerAdapter(permission, for_, IViewPermission, name) def _registerSecurityPolicy(self, secpol): - import zope.component - gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import ISecurityPolicy + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() gsm.registerUtility(secpol, ISecurityPolicy) - def _registerEventListener(self, listener, iface): - import zope.component - gsm = zope.component.getGlobalSiteManager() + def _registerEventListener(self, iface): + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() + L = [] + def listener(event): + L.append(event) gsm.registerHandler(listener, (iface,)) + return L def _registerRootFactory(self, root_factory): - import zope.component - gsm = zope.component.getGlobalSiteManager() from repoze.bfg.interfaces import IRootFactory + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() gsm.registerUtility(root_factory, IRootFactory) def _getTargetClass(self): @@ -424,14 +428,8 @@ class RouterTests(unittest.TestCase, PlacelessSetup): self._registerView(view, '', None, None) from repoze.bfg.interfaces import INewRequest from repoze.bfg.interfaces import INewResponse - request_events = [] - response_events = [] - def handle_request(event): - request_events.append(event) - def handle_response(event): - response_events.append(event) - self._registerEventListener(handle_request, INewRequest) - self._registerEventListener(handle_response, INewResponse) + request_events = self._registerEventListener(INewRequest) + response_events = self._registerEventListener(INewResponse) self._registerRootFactory(rootfactory) router = self._makeOne(None) start_response = DummyStartResponse() @@ -458,10 +456,7 @@ class RouterTests(unittest.TestCase, PlacelessSetup): self._registerRootFactory(rootfactory) router = self._makeOne(None) start_response = DummyStartResponse() - request_events = [] - def handle_request(event): - request_events.append(event) - self._registerEventListener(handle_request, INewRequest) + request_events = self._registerEventListener(INewRequest) result = router(environ, start_response) request = request_events[0].request self.failUnless(IPOSTRequest.providedBy(request)) @@ -485,22 +480,45 @@ class RouterTests(unittest.TestCase, PlacelessSetup): self._registerRootFactory(rootfactory) router = self._makeOne(None) start_response = DummyStartResponse() - request_events = [] - def handle_request(event): - request_events.append(event) - self._registerEventListener(handle_request, INewRequest) + 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_irequestfactory_override(self): + from repoze.bfg.interfaces import INewRequest + from repoze.bfg.interfaces import IRequestFactory + from webob import Request + class Request2(Request): + pass + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() + gsm.registerUtility(Request2, IRequestFactory) + rootfactory = make_rootfactory(None) + context = DummyContext() + traversalfactory = make_traversal_factory(context, '', []) + response = DummyResponse() + response.app_iter = ['Hello world'] + view = make_view(response) + environ = self._makeEnviron() + self._registerTraverserFactory(traversalfactory, '', None) + self._registerView(view, '', None, None) + self._registerRootFactory(rootfactory) + router = self._makeOne(None) + start_response = DummyStartResponse() + request_events = self._registerEventListener(INewRequest) + result = router(environ, start_response) + request = request_events[0].request + self.failUnless(isinstance(request, Request2)) -class MakeAppTests(unittest.TestCase, PlacelessSetup): +class MakeAppTests(unittest.TestCase): def setUp(self): - PlacelessSetup.setUp(self) + cleanUp() def tearDown(self): - PlacelessSetup.tearDown(self) + cleanUp() def _callFUT(self, *arg, **kw): from repoze.bfg.router import make_app diff --git a/repoze/bfg/tests/test_view.py b/repoze/bfg/tests/test_view.py index 389c00cc5..6f16da28e 100644 --- a/repoze/bfg/tests/test_view.py +++ b/repoze/bfg/tests/test_view.py @@ -468,6 +468,22 @@ class TestStaticView(unittest.TestCase, BaseTest): filedata = open(os.path.join(static_dir, '__init__.py')).read() self.assertEqual(result, filedata) + def test_it_with_alternate_iresponsefactory(self): + view = self._makeOne() + context = DummyContext() + request = DummyRequest() + request.subpath = ['__init__.py'] + request.environ = self._makeEnviron() + from repoze.bfg.interfaces import IResponseFactory + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() + from webob import Response + class Response2(Response): + pass + gsm.registerUtility(Response2, IResponseFactory) + response = view(context, request) + self.failUnless(isinstance(response, Response2)) + class DummyContext: pass diff --git a/repoze/bfg/tests/test_wsgi.py b/repoze/bfg/tests/test_wsgi.py index 4c36850b6..ac02ec49f 100644 --- a/repoze/bfg/tests/test_wsgi.py +++ b/repoze/bfg/tests/test_wsgi.py @@ -1,6 +1,13 @@ import unittest +from zope.testing.cleanup import cleanUp class WSGIAppTests(unittest.TestCase): + def setUp(self): + cleanUp() + + def tearDown(self): + cleanUp() + def test_decorator(self): body = 'Unauthorized' headerlist = [ ('Content-Type', 'text/plain'), @@ -18,6 +25,28 @@ class WSGIAppTests(unittest.TestCase): self.assertEqual(response.headerlist, headerlist) self.assertEqual(response.app_iter, [body]) + def test_decorator_alternate_iresponsefactory(self): + body = 'Unauthorized' + headerlist = [ ('Content-Type', 'text/plain'), + ('Content-Length', len(body)) ] + status = '401 Unauthorized' + def real_wsgiapp(environ, start_response): + start_response(status, headerlist) + return [body] + from repoze.bfg.wsgi import wsgiapp + wrapped = wsgiapp(real_wsgiapp) + context = DummyContext() + request = DummyRequest({}) + from repoze.bfg.interfaces import IResponseFactory + from zope.component import getGlobalSiteManager + from webob import Response + class Response2(Response): + pass + gsm = getGlobalSiteManager() + gsm.registerUtility(Response2, IResponseFactory) + response = wrapped(context, request) + self.failUnless(isinstance(response, Response2)) + def test_decorator_startresponse_uncalled(self): body = 'Unauthorized' headerlist = [ ('Content-Type', 'text/plain'), diff --git a/repoze/bfg/tests/test_xslt.py b/repoze/bfg/tests/test_xslt.py index 3755ad8a5..38e693937 100644 --- a/repoze/bfg/tests/test_xslt.py +++ b/repoze/bfg/tests/test_xslt.py @@ -137,6 +137,28 @@ class RenderTransformToResponseTests(Base, unittest.TestCase): self.assertEqual(len(result.headerlist), 2) self.assertEqual(queryUtility(INodeTemplateRenderer, minimal), utility) + def test_alternate_iresponse_factory(self): + self._zcmlConfigure() + from repoze.bfg.interfaces import IResponseFactory + from zope.component import getGlobalSiteManager + gsm = getGlobalSiteManager() + from webob import Response + class Response2(Response): + pass + gsm.registerUtility(Response2, IResponseFactory) + from zope.component import getGlobalSiteManager + from repoze.bfg.xslt import XSLTemplateRenderer + from repoze.bfg.interfaces import INodeTemplateRenderer + minimal = self._getTemplatePath('minimal.xsl') + utility = XSLTemplateRenderer(minimal) + gsm = getGlobalSiteManager() + gsm.registerUtility(utility, INodeTemplateRenderer, name=minimal) + from lxml import etree + info = etree.Element("info") + result = self._callFUT(minimal, node=info) + self.failUnless(isinstance(result, Response2)) + + class RenderTransformTests(Base, unittest.TestCase): def _callFUT(self, path, node): from repoze.bfg.xslt import render_transform -- cgit v1.2.3