diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-01-27 21:57:11 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-01-27 21:57:11 +0000 |
| commit | e62e479e338e428f6cfd3b07790545982b7cb94f (patch) | |
| tree | c9784577f791d4a8ea5b80a9fce211ce86009712 /repoze/bfg/tests/test_urldispatch.py | |
| parent | 2301cf61977102b85279ea7c04797f76012202e5 (diff) | |
| download | pyramid-e62e479e338e428f6cfd3b07790545982b7cb94f.tar.gz pyramid-e62e479e338e428f6cfd3b07790545982b7cb94f.tar.bz2 pyramid-e62e479e338e428f6cfd3b07790545982b7cb94f.zip | |
Features
--------
- The ``repoze.bfg.url.model_url`` API now works against contexts
derived from Routes URL dispatch (``Routes.util.url_for`` is called
under the hood).
- "Virtual root" support for traversal-based applications has been
added. Virtual root support is useful when you'd like to host some
model in a :mod:`repoze.bfg` model graph as an application under a
URL pathname that does not include the model path itself. For more
information, see the (new) "Virtual Hosting" chapter in the
documentation.
- A ``repoze.bfg.traversal.virtual_root`` API has been added. When
called, it returns the virtual root object (or the physical root
object if no virtual root has been specified).
Implementation Changes
----------------------
- ``repoze.bfg.traversal.RoutesModelTraverser`` has been moved to
``repoze.bfg.urldispatch``.
- ``model_url`` URL generation is now performed via an adapter lookup
based on the context and the request.
- ZCML which registers two adapters for the ``IContextURL`` interface
has been added to the configure.zcml in ``repoze.bfg.includes``.
Diffstat (limited to 'repoze/bfg/tests/test_urldispatch.py')
| -rw-r--r-- | repoze/bfg/tests/test_urldispatch.py | 126 |
1 files changed, 125 insertions, 1 deletions
diff --git a/repoze/bfg/tests/test_urldispatch.py b/repoze/bfg/tests/test_urldispatch.py index 71ac78698..0fc828161 100644 --- a/repoze/bfg/tests/test_urldispatch.py +++ b/repoze/bfg/tests/test_urldispatch.py @@ -221,6 +221,130 @@ def make_get_root(result): return result return dummy_get_root +class RoutesModelTraverserTests(unittest.TestCase): + def _getTargetClass(self): + from repoze.bfg.urldispatch import RoutesModelTraverser + return RoutesModelTraverser - + def _makeOne(self, model): + klass = self._getTargetClass() + return klass(model) + + def test_class_conforms_to_ITraverser(self): + from zope.interface.verify import verifyClass + from repoze.bfg.interfaces import ITraverser + verifyClass(ITraverser, self._getTargetClass()) + + def test_instance_conforms_to_ITraverser(self): + from zope.interface.verify import verifyObject + from repoze.bfg.interfaces import ITraverser + verifyObject(ITraverser, self._makeOne(None)) + + def test_call_with_only_controller_bwcompat(self): + model = DummyContext() + model.controller = 'controller' + traverser = self._makeOne(model) + result = traverser({}) + self.assertEqual(result[0], model) + self.assertEqual(result[1], 'controller') + self.assertEqual(result[2], []) + + def test_call_with_only_view_name_bwcompat(self): + model = DummyContext() + model.view_name = 'view_name' + traverser = self._makeOne(model) + result = traverser({}) + self.assertEqual(result[0], model) + self.assertEqual(result[1], 'view_name') + self.assertEqual(result[2], []) + + def test_call_with_subpath_bwcompat(self): + model = DummyContext() + model.view_name = 'view_name' + model.subpath = '/a/b/c' + traverser = self._makeOne(model) + result = traverser({}) + self.assertEqual(result[0], model) + self.assertEqual(result[1], 'view_name') + self.assertEqual(result[2], ['a', 'b', 'c']) + + def test_call_with_no_view_name_or_controller_bwcompat(self): + model = DummyContext() + traverser = self._makeOne(model) + result = traverser({}) + self.assertEqual(result[0], model) + self.assertEqual(result[1], '') + self.assertEqual(result[2], []) + + def test_call_with_only_view_name(self): + model = DummyContext() + traverser = self._makeOne(model) + routing_args = ((), {'view_name':'view_name'}) + environ = {'wsgiorg.routing_args': routing_args} + result = traverser(environ) + self.assertEqual(result[0], model) + self.assertEqual(result[1], 'view_name') + self.assertEqual(result[2], []) + def test_call_with_view_name_and_subpath(self): + model = DummyContext() + traverser = self._makeOne(model) + routing_args = ((), {'view_name':'view_name', 'subpath':'/a/b/c'}) + environ = {'wsgiorg.routing_args': routing_args} + result = traverser(environ) + self.assertEqual(result[0], model) + self.assertEqual(result[1], 'view_name') + self.assertEqual(result[2], ['a', 'b','c']) + +class RoutesContextURLTests(unittest.TestCase): + def _getTargetClass(self): + from repoze.bfg.urldispatch import RoutesContextURL + return RoutesContextURL + + def _makeOne(self, context, request): + return self._getTargetClass()(context, request) + + def test_class_conforms_to_IContextURL(self): + from zope.interface.verify import verifyClass + from repoze.bfg.interfaces import IContextURL + verifyClass(IContextURL, self._getTargetClass()) + + def test_instance_conforms_to_IContextURL(self): + from zope.interface.verify import verifyObject + from repoze.bfg.interfaces import IContextURL + verifyObject(IContextURL, self._makeOne(None, None)) + + def test_get_virtual_root(self): + context_url = self._makeOne(1,2) + self.assertEqual(context_url.virtual_root(), 1) + + def test_call(self): + from routes import Mapper + mapper = Mapper(controller_scan=None, directory=None, + explicit=True, always_scan=False) + args = {'a':'1', 'b':'2', 'c':'3'} + mapper.connect(':a/:b/:c') + mapper.create_regs([]) + environ = {'SERVER_NAME':'example.com', 'wsgi.url_scheme':'http', + 'SERVER_PORT':'80', 'wsgiorg.routing_args':((), args)} + mapper.environ = environ + from routes import request_config + config = request_config() + config.environ = environ + config.mapper = mapper + config.mapper_dict = args + config.host = 'www.example.com' + config.protocol = 'https' + config.redirect = None + request = DummyRequest() + request.environ = environ + context_url = self._makeOne(None, request) + result = context_url() + self.assertEqual(result, '/1/2/3') + +class DummyContext(object): + """ """ + +class DummyRequest(object): + """ """ + |
