diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index f966501f72c..f858ff61aa5 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -255,7 +255,7 @@ class Root(object): p = os.path.normpath(os.path.join(*l)) return cherrypy.lib.static.serve_file(os.path.join(path_addons, p)) elif len(l) > 1: - for i in range(1, len(l) + 1): + for i in range(len(l), 1, -1): ps = "/" + "/".join(l[0:i]) if ps in controllers_path: c = controllers_path[ps] @@ -265,7 +265,7 @@ class Root(object): if getattr(m, 'exposed', 0): print "Calling", ps, c, meth, m return m(**kw) - + raise cherrypy.NotFound('/' + '/'.join(l)) else: raise cherrypy.HTTPRedirect('/base/static/openerp/base.html', 301) default.exposed = True diff --git a/openerpweb/tests/test_model.py b/openerpweb/tests/test_model.py index 1d0d058b092..4272d1fe796 100644 --- a/openerpweb/tests/test_model.py +++ b/openerpweb/tests/test_model.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import cherrypy import mock import unittest2 import openerpweb.openerpweb @@ -18,3 +19,63 @@ class OpenERPModelTest(unittest2.TestCase): Model.read([42]) session.execute.assert_called_once_with( 'a.b', 'read', [42]) + +class FakeController(object): + pass + +class DispatcherTest(unittest2.TestCase): + def setUp(self): + controller = FakeController() + self.mock_method = mock.Mock() + controller.method = self.mock_method + self.mock_method.exposed = True + + self.mock_index = mock.Mock() + controller.index = self.mock_index + self.mock_index.exposed = True + + self.patcher = mock.patch.dict( + openerpweb.openerpweb.controllers_path, + {'/some/controller/path': controller}) + self.patcher.start() + + controller2 = FakeController() + controller2.index = self.mock_index + self.patcher2 = mock.patch.dict( + openerpweb.openerpweb.controllers_path, + {'/some/other/controller': FakeController(), + '/some/other/controller/2': controller2}) + self.patcher2.start() + def tearDown(self): + self.patcher2.stop() + self.patcher.stop() + + def test_default_redirect(self): + self.assertRaises( + cherrypy.HTTPRedirect, + openerpweb.openerpweb.Root().default) + def test_serve_static_missing(self): + self.assertRaises( + cherrypy.NotFound, + openerpweb.openerpweb.Root().default, + 'does-not-exist', 'static', 'bar') + + def test_serve_controller_missing(self): + self.assertRaises( + cherrypy.NotFound, + openerpweb.openerpweb.Root().default, + 'controller', 'does', 'not', 'exist') + + def test_find_controller_method(self): + openerpweb.openerpweb.Root().default( + 'some', 'controller', 'path', 'method') + self.mock_method.assert_called_once_with() + def test_find_controller_index(self): + openerpweb.openerpweb.Root().default( + 'some', 'controller', 'path') + self.mock_index.assert_called_once_with() + + def test_nested_paths(self): + openerpweb.openerpweb.Root().default( + 'some', 'other', 'controller', '2') + self.mock_index.assert_called_once_with()