From 68e4357e4716fb7b16fe57b28255067107c2baff Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 21 Mar 2011 17:29:04 +0100 Subject: [PATCH 1/2] [FIX] root dispatcher should raise a 404 error when a controller is not found bzr revid: xmo@openerp.com-20110321162904-33ai6lqaty0unhro --- openerpweb/openerpweb.py | 2 +- openerpweb/tests/test_model.py | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index f966501f72c..89706a9366c 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -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..d84f3a36c5d 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,20 @@ class OpenERPModelTest(unittest2.TestCase): Model.read([42]) session.execute.assert_called_once_with( 'a.b', 'read', [42]) + +class DispatcherTest(unittest2.case.TestCase): + 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') + From e49be016f309553cbcba3277c6d725808879eba3 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 21 Mar 2011 18:03:57 +0100 Subject: [PATCH 2/2] [ADD] tests for the root dispatcher, fix dispatching: start from the *end* of the url and walk backwards to try to find a dispatcher and its method bzr revid: xmo@openerp.com-20110321170357-6k9f7qjww1s2wj3g --- openerpweb/openerpweb.py | 2 +- openerpweb/tests/test_model.py | 45 +++++++++++++++++++++++++++++++++- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 89706a9366c..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] diff --git a/openerpweb/tests/test_model.py b/openerpweb/tests/test_model.py index d84f3a36c5d..4272d1fe796 100644 --- a/openerpweb/tests/test_model.py +++ b/openerpweb/tests/test_model.py @@ -20,7 +20,36 @@ class OpenERPModelTest(unittest2.TestCase): session.execute.assert_called_once_with( 'a.b', 'read', [42]) -class DispatcherTest(unittest2.case.TestCase): +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, @@ -30,9 +59,23 @@ class DispatcherTest(unittest2.case.TestCase): 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()