[FIX] cleanup m2o field events when reloading m2o fields
[odoo/odoo.git] / addons / web / tests / test_menu.py
1 # -*- coding: utf-8 -*-
2 import collections
3 import mock
4 import unittest2
5
6 from ..controllers import main
7
8 class Placeholder(object):
9     def __init__(self, **kwargs):
10         for k, v in kwargs.iteritems():
11             setattr(self, k, v)
12
13 class LoadTest(unittest2.TestCase):
14     def setUp(self):
15         self.menu = main.Menu()
16         self.request = mock.Mock()
17
18         # Have self.request.session.model() return a different mock object for
19         # each model (but always the same mock for a given model name)
20         models = collections.defaultdict(mock.Mock)
21         model = self.request.session.model.side_effect = \
22             lambda model_name: models[model_name]
23
24         self.MockMenus = model('ir.ui.menu')
25         # Mock the absence of custom menu
26         model('res.users').read.return_value = [{
27             'menu_id': False
28         }]
29
30     def tearDown(self):
31         del self.request
32         del self.MockMenus
33         del self.menu
34
35     def test_empty(self):
36         self.MockMenus.search.return_value = []
37         self.MockMenus.read.return_value = []
38
39         root = self.menu.load(self.request)
40
41         self.MockMenus.search.assert_called_with(
42             [('parent_id','=', False)], 0, False, False,
43             self.request.context)
44
45         self.assertEqual(root['all_menu_ids'], [])
46
47         self.assertListEqual(
48             root['children'],
49             [])
50
51     def test_applications_sort(self):
52         self.MockMenus.search.return_value = [1, 2, 3]
53         self.MockMenus.read.side_effect = lambda *args: [
54             {'id': 1, 'sequence': 1, 'parent_id': False},
55             {'id': 3, 'sequence': 2, 'parent_id': False},
56             {'id': 2, 'sequence': 3, 'parent_id': False},
57         ]
58
59         root = self.menu.load(self.request)
60
61         self.MockMenus.search.assert_called_with(
62             [('id','child_of', [1, 2, 3])], 0, False, False,
63             self.request.context)
64
65         self.MockMenus.read.assert_called_with(
66             [1, 2, 3], ['name', 'sequence', 'parent_id',
67                         'action'],
68             self.request.context)
69
70         self.assertEqual(root['all_menu_ids'], [1, 2, 3])
71
72         self.assertEqual(
73             root['children'],
74             [{
75                 'id': 1, 'sequence': 1,
76                 'parent_id': False, 'children': []
77             }, {
78                 'id': 3, 'sequence': 2,
79                 'parent_id': False, 'children': []
80             }, {
81                 'id': 2, 'sequence': 3,
82                 'parent_id': False, 'children': []
83             }])
84
85     def test_deep(self):
86         self.MockMenus.search.side_effect = lambda domain, *args: (
87             [1] if domain == [('parent_id', '=', False)] else [1, 2, 3, 4])
88
89         root = {'id': 1, 'sequence': 1, 'parent_id': False}
90         self.MockMenus.read.side_effect = lambda ids, *args: (
91             [root] if ids == [1] else [
92                 {'id': 1, 'sequence': 1, 'parent_id': False},
93                 {'id': 2, 'sequence': 2, 'parent_id': [1, '']},
94                 {'id': 3, 'sequence': 1, 'parent_id': [2, '']},
95                 {'id': 4, 'sequence': 2, 'parent_id': [2, '']},
96             ])
97
98         root = self.menu.load(self.request)
99
100         self.MockMenus.search.assert_called_with(
101             [('id','child_of', [1])], 0, False, False,
102             self.request.context)
103
104         self.assertEqual(root['all_menu_ids'], [1, 2, 3, 4])
105
106         self.assertEqual(
107             root['children'],
108             [{
109                  'id': 1,
110                  'sequence': 1,
111                  'parent_id': False,
112                  'children': [{
113                      'id': 2,
114                      'sequence': 2,
115                      'parent_id': [1, ''],
116                      'children': [{
117                          'id': 3,
118                          'sequence': 1,
119                          'parent_id': [2, ''],
120                          'children': []
121                      }, {
122                          'id': 4,
123                          'sequence': 2,
124                          'parent_id': [2, ''],
125                          'children': []
126                      }]
127                  }]
128             }]
129         )
130
131 class ActionMungerTest(unittest2.TestCase):
132     def setUp(self):
133         self.menu = main.Menu()
134     def test_actual_treeview(self):
135         action = {
136             "views": [[False, "tree"], [False, "form"],
137                       [False, "calendar"]],
138             "view_type": "tree",
139             "view_id": False,
140             "view_mode": "tree,form,calendar"
141         }
142         changed = action.copy()
143         del action['view_type']
144         main.fix_view_modes(changed)
145
146         self.assertEqual(changed, action)
147
148     def test_list_view(self):
149         action = {
150             "views": [[False, "tree"], [False, "form"],
151                       [False, "calendar"]],
152             "view_type": "form",
153             "view_id": False,
154             "view_mode": "tree,form,calendar"
155         }
156         main.fix_view_modes(action)
157
158         self.assertEqual(action, {
159             "views": [[False, "list"], [False, "form"],
160                       [False, "calendar"]],
161             "view_id": False,
162             "view_mode": "list,form,calendar"
163         })
164
165     def test_redundant_views(self):
166
167         action = {
168             "views": [[False, "tree"], [False, "form"],
169                       [False, "calendar"], [42, "tree"]],
170             "view_type": "form",
171             "view_id": False,
172             "view_mode": "tree,form,calendar"
173         }
174         main.fix_view_modes(action)
175
176         self.assertEqual(action, {
177             "views": [[False, "list"], [False, "form"],
178                       [False, "calendar"], [42, "list"]],
179             "view_id": False,
180             "view_mode": "list,form,calendar"
181         })