[ADD] tests for base.controllers.main.Menu.load

* Make model factory pluggable in OpenERPSession (so it's possible to mock the models handler)
* Split load between the JSON-RPC handler and the actual logic
* Add some docstring to Menu.do_load

bzr revid: xmo@openerp.com-20110321104735-9hmrsyoccueya9fh
This commit is contained in:
Xavier Morel 2011-03-21 11:47:35 +01:00
parent f201393fa4
commit 3d02b3f804
4 changed files with 118 additions and 5 deletions

View File

@ -118,6 +118,16 @@ class Menu(openerpweb.Controller):
@openerpweb.jsonrequest
def load(self, req):
return {'data': self.do_load(req)}
def do_load(self, req):
""" Loads all menu items (all applications and their sub-menus).
:param req: A request object, with an OpenERP session attribute
:type req: < session -> OpenERPSession >
:return: the menu root
:rtype: dict('children': menu_nodes)
"""
Menus = req.session.model('ir.ui.menu')
# menus are loaded fully unlike a regular tree view, cause there are
# less than 512 items
@ -132,14 +142,15 @@ class Menu(openerpweb.Controller):
if not menu_item['parent_id']: continue
parent = menu_item['parent_id'][0]
if parent in menu_items_map:
menu_items_map[parent].set_default('children', []).append(menu_item)
menu_items_map[parent].setdefault(
'children', []).append(menu_item)
# sort by sequence a tree using parent_id
for menu_item in menu_items:
menu_item.set_default('children', []).sort(
menu_item.setdefault('children', []).sort(
key=lambda x:x["sequence"])
return {'data': menu_root}
return menu_root
@openerpweb.jsonrequest
def action(self, req, menu_id):

View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

View File

@ -0,0 +1,99 @@
# -*- coding: utf-8 -*-
import mock
import unittest2
import base.controllers.main
import openerpweb.openerpweb
class Placeholder(object):
def __init__(self, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
class LoadTest(unittest2.TestCase):
def setUp(self):
self.menu = base.controllers.main.Menu()
self.menus_mock = mock.Mock()
self.request = Placeholder(
session=openerpweb.openerpweb.OpenERPSession(
model_factory=lambda _session, _name: self.menus_mock))
def tearDown(self):
del self.request
del self.menus_mock
del self.menu
def test_empty(self):
self.menus_mock.search = mock.Mock(return_value=[])
self.menus_mock.read = mock.Mock(return_value=[])
root = self.menu.do_load(self.request)
self.menus_mock.search.assert_called_with([])
self.menus_mock.read.assert_called_with(
[], ['name', 'sequence', 'parent_id'])
self.assertListEqual(
root['children'],
[])
def test_applications_sort(self):
self.menus_mock.search = mock.Mock(return_value=[1, 2, 3])
self.menus_mock.read = mock.Mock(return_value=[
{'id': 2, 'sequence': 3, 'parent_id': [False, '']},
{'id': 3, 'sequence': 2, 'parent_id': [False, '']},
{'id': 1, 'sequence': 1, 'parent_id': [False, '']},
])
root = self.menu.do_load(self.request)
self.menus_mock.read.assert_called_with(
[1, 2, 3], ['name', 'sequence', 'parent_id'])
self.assertEqual(
root['children'],
[{
'id': 1, 'sequence': 1,
'parent_id': [False, ''], 'children': []
}, {
'id': 3, 'sequence': 2,
'parent_id': [False, ''], 'children': []
}, {
'id': 2, 'sequence': 3,
'parent_id': [False, ''], 'children': []
}])
def test_deep(self):
self.menus_mock.search = mock.Mock(return_value=[1, 2, 3, 4])
self.menus_mock.read = mock.Mock(return_value=[
{'id': 1, 'sequence': 1, 'parent_id': [False, '']},
{'id': 2, 'sequence': 2, 'parent_id': [1, '']},
{'id': 3, 'sequence': 1, 'parent_id': [2, '']},
{'id': 4, 'sequence': 2, 'parent_id': [2, '']},
])
root = self.menu.do_load(self.request)
self.assertEqual(
root['children'],
[{
'id': 1,
'sequence': 1,
'parent_id': [False, ''],
'children': [{
'id': 2,
'sequence': 2,
'parent_id': [1, ''],
'children': [{
'id': 3,
'sequence': 1,
'parent_id': [2, ''],
'children': []
}, {
'id': 4,
'sequence': 2,
'parent_id': [2, ''],
'children': []
}]
}]
}]
)

View File

@ -39,13 +39,15 @@ class OpenERPModel(object):
class OpenERPSession(object):
def __init__(self, server='127.0.0.1', port=8069):
def __init__(self, server='127.0.0.1', port=8069,
model_factory=OpenERPModel):
self._server = server
self._port = port
self._db = False
self._uid = False
self._login = False
self._password = False
self.model_factory = model_factory
def proxy(self, service):
s = xmlrpctimeout.TimeoutServerProxy('http://%s:%s/xmlrpc/%s' % (self._server, self._port, service), timeout=5)
@ -69,7 +71,7 @@ class OpenERPSession(object):
return r
def model(self, model):
return OpenERPModel(self, model)
return self.model_factory(self, model)
#----------------------------------------------------------
# OpenERP Web RequestHandler