# -*- coding: utf-8 -*- import collections import mock import unittest2 from ..controllers import main 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 = main.Menu() self.request = mock.Mock() # Have self.request.session.model() return a different mock object for # each model (but always the same mock for a given model name) models = collections.defaultdict(mock.Mock) model = self.request.session.model.side_effect = \ lambda model_name: models[model_name] self.MockMenus = model('ir.ui.menu') # Mock the absence of custom menu model('res.users').read.return_value = [{ 'menu_id': False }] def tearDown(self): del self.request del self.MockMenus del self.menu def test_empty(self): self.MockMenus.search.return_value = [] self.MockMenus.read.return_value = [] root = self.menu.do_load(self.request) self.MockMenus.search.assert_called_with( [], 0, False, False, self.request.context) self.MockMenus.read.assert_called_with( [], ['name', 'sequence', 'parent_id', 'action', 'needaction_enabled', 'needaction_counter'], self.request.context) self.assertListEqual( root['children'], []) def test_applications_sort(self): self.MockMenus.search.return_value = [1, 2, 3] self.MockMenus.read.side_effect = lambda *args: [ {'id': 1, 'sequence': 1, 'parent_id': False}, {'id': 3, 'sequence': 2, 'parent_id': False}, {'id': 2, 'sequence': 3, 'parent_id': False}, ] root = self.menu.do_load(self.request) self.MockMenus.read.assert_called_with( [1, 2, 3], ['name', 'sequence', 'parent_id', 'action', 'needaction_enabled', 'needaction_counter'], self.request.context) 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.MockMenus.search.side_effect = lambda domain, *args: ( [1] if domain == [('parent_id', '=', False)] else [1, 2, 3, 4]) root = {'id': 1, 'sequence': 1, 'parent_id': False} self.MockMenus.read.side_effect = lambda ids, *args: ( [root] if ids == [1] else [ {'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': [] }] }] }] ) class ActionMungerTest(unittest2.TestCase): def setUp(self): self.menu = main.Menu() def test_actual_treeview(self): action = { "views": [[False, "tree"], [False, "form"], [False, "calendar"]], "view_type": "tree", "view_id": False, "view_mode": "tree,form,calendar" } changed = action.copy() del action['view_type'] main.fix_view_modes(changed) self.assertEqual(changed, action) def test_list_view(self): action = { "views": [[False, "tree"], [False, "form"], [False, "calendar"]], "view_type": "form", "view_id": False, "view_mode": "tree,form,calendar" } main.fix_view_modes(action) self.assertEqual(action, { "views": [[False, "list"], [False, "form"], [False, "calendar"]], "view_id": False, "view_mode": "list,form,calendar" }) def test_redundant_views(self): action = { "views": [[False, "tree"], [False, "form"], [False, "calendar"], [42, "tree"]], "view_type": "form", "view_id": False, "view_mode": "tree,form,calendar" } main.fix_view_modes(action) self.assertEqual(action, { "views": [[False, "list"], [False, "form"], [False, "calendar"], [42, "list"]], "view_id": False, "view_mode": "list,form,calendar" })