summaryrefslogtreecommitdiff
path: root/repoze/bfg/tests/test_zcml.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-05-21 16:01:58 +0000
committerChris McDonough <chrism@agendaless.com>2009-05-21 16:01:58 +0000
commit5a11e2ad0828b7c763d0c81211f686a85bc0324c (patch)
tree750deaa5086279a1cd0baa28c0d5bdaa17414463 /repoze/bfg/tests/test_zcml.py
parent385084582eeff5f2f1a93f3b90c091dc1a4ad50e (diff)
downloadpyramid-5a11e2ad0828b7c763d0c81211f686a85bc0324c.tar.gz
pyramid-5a11e2ad0828b7c763d0c81211f686a85bc0324c.tar.bz2
pyramid-5a11e2ad0828b7c763d0c81211f686a85bc0324c.zip
- Class objects may now be used as view callables (both via ZCML and
via use of the ``bfg_view`` decorator in Python 2.6 as a class decorator). The calling semantics when using a class as a view callable is similar to that of using a class as a Zope "browser view": the class' ``__init__`` must accept two positional parameters (conventionally named ``context``, and ``request``). The resulting instance must be callable (it must have a ``__call__`` method). When called, the instance should return a response. For example:: from webob import Response class MyView(object): def __init__(self, context, request): self.context = context self.request = request def __call__(self): return Response('hello from %s!' % self.context) See the "Views" chapter in the documentation and the ``repoze.bfg.view`` API documentation for more information.
Diffstat (limited to 'repoze/bfg/tests/test_zcml.py')
-rw-r--r--repoze/bfg/tests/test_zcml.py53
1 files changed, 52 insertions, 1 deletions
diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py
index c2703f7c1..e44fe1307 100644
--- a/repoze/bfg/tests/test_zcml.py
+++ b/repoze/bfg/tests/test_zcml.py
@@ -19,7 +19,7 @@ class TestViewDirective(unittest.TestCase):
self.assertRaises(ConfigurationError, self._callFUT, context,
'repoze.view', None)
- def test_only_view(self):
+ def test_view_as_function(self):
context = DummyContext()
class IFoo:
pass
@@ -58,6 +58,57 @@ class TestViewDirective(unittest.TestCase):
self.assertEqual(regadapt['args'][4], '')
self.assertEqual(regadapt['args'][5], None)
+ def test_view_as_oldstyle_class(self):
+ context = DummyContext()
+ class IFoo:
+ pass
+ class view:
+ def __init__(self, context, request):
+ self.context = context
+ self.request = request
+
+ def __call__(self):
+ return self
+ self._callFUT(context, 'repoze.view', IFoo, view=view)
+ actions = context.actions
+ from repoze.bfg.interfaces import IRequest
+ from repoze.bfg.interfaces import IView
+ from repoze.bfg.interfaces import IViewPermission
+ from repoze.bfg.security import ViewPermissionFactory
+ from repoze.bfg.zcml import handler
+
+ self.assertEqual(len(actions), 2)
+
+ permission = actions[0]
+ permission_discriminator = ('permission', IFoo, '', IRequest,
+ IViewPermission)
+ self.assertEqual(permission['discriminator'], permission_discriminator)
+ self.assertEqual(permission['callable'], handler)
+ self.assertEqual(permission['args'][0], 'registerAdapter')
+ self.failUnless(isinstance(permission['args'][1],ViewPermissionFactory))
+ self.assertEqual(permission['args'][1].permission_name, 'repoze.view')
+ self.assertEqual(permission['args'][2], (IFoo, IRequest))
+ self.assertEqual(permission['args'][3], IViewPermission)
+ self.assertEqual(permission['args'][4], '')
+ self.assertEqual(permission['args'][5], None)
+
+ regadapt = actions[1]
+ regadapt_discriminator = ('view', IFoo, '', IRequest, IView)
+ self.assertEqual(regadapt['discriminator'], regadapt_discriminator)
+ self.assertEqual(regadapt['callable'], handler)
+ self.assertEqual(regadapt['args'][0], 'registerAdapter')
+ wrapper = regadapt['args'][1]
+ self.assertEqual(wrapper.__module__, view.__module__)
+ self.assertEqual(wrapper.__name__, view.__name__)
+ self.assertEqual(wrapper.__doc__, view.__doc__)
+ result = wrapper(None, None)
+ self.assertEqual(result.context, None)
+ self.assertEqual(result.request, None)
+ self.assertEqual(regadapt['args'][2], (IFoo, IRequest))
+ self.assertEqual(regadapt['args'][3], IView)
+ self.assertEqual(regadapt['args'][4], '')
+ self.assertEqual(regadapt['args'][5], None)
+
def test_request_type(self):
context = DummyContext()
class IFoo: