709e07f555170dc8346d980bfc64737ad9a6bbea
[odoo/odoo.git] / openerp / addons / test_new_api / tests / test_onchange.py
1 # -*- coding: utf-8 -*-
2
3 from openerp.tests import common
4
5 class TestOnChange(common.TransactionCase):
6
7     def setUp(self):
8         super(TestOnChange, self).setUp()
9         self.Discussion = self.env['test_new_api.discussion']
10         self.Message = self.env['test_new_api.message']
11
12     def test_default_get(self):
13         """ checking values returned by default_get() """
14         fields = ['name', 'categories', 'participants', 'messages']
15         values = self.Discussion.default_get(fields)
16         self.assertEqual(values, {})
17
18     def test_get_field(self):
19         """ checking that accessing an unknown attribute does nothing special """
20         with self.assertRaises(AttributeError):
21             self.Discussion.not_really_a_method()
22
23     def test_onchange(self):
24         """ test the effect of onchange() """
25         discussion = self.env.ref('test_new_api.discussion_0')
26         BODY = "What a beautiful day!"
27         USER = self.env.user
28
29         field_onchange = self.Message._onchange_spec()
30         self.assertEqual(field_onchange.get('author'), '1')
31         self.assertEqual(field_onchange.get('body'), '1')
32         self.assertEqual(field_onchange.get('discussion'), '1')
33
34         # changing 'discussion' should recompute 'name'
35         values = {
36             'discussion': discussion.id,
37             'name': "[%s] %s" % ('', USER.name),
38             'body': False,
39             'author': USER.id,
40             'size': 0,
41         }
42         self.env.invalidate_all()
43         result = self.Message.onchange(values, 'discussion', field_onchange)
44         self.assertIn('name', result['value'])
45         self.assertEqual(result['value']['name'], "[%s] %s" % (discussion.name, USER.name))
46
47         # changing 'body' should recompute 'size'
48         values = {
49             'discussion': discussion.id,
50             'name': "[%s] %s" % (discussion.name, USER.name),
51             'body': BODY,
52             'author': USER.id,
53             'size': 0,
54         }
55         self.env.invalidate_all()
56         result = self.Message.onchange(values, 'body', field_onchange)
57         self.assertIn('size', result['value'])
58         self.assertEqual(result['value']['size'], len(BODY))
59
60         # changing 'body' should not recompute 'name', even if 'discussion' and
61         # 'name' are not consistent with each other
62         values = {
63             'discussion': discussion.id,
64             'name': False,
65             'body': BODY,
66             'author': USER.id,
67             'size': 0,
68         }
69         self.env.invalidate_all()
70         result = self.Message.onchange(values, 'body', field_onchange)
71         self.assertNotIn('name', result['value'])
72
73     def test_onchange_one2many(self):
74         """ test the effect of onchange() on one2many fields """
75         BODY = "What a beautiful day!"
76         USER = self.env.user
77
78         # create an independent message
79         message = self.Message.create({'body': BODY})
80         self.assertEqual(message.name, "[%s] %s" % ('', USER.name))
81
82         field_onchange = self.Discussion._onchange_spec()
83         self.assertEqual(field_onchange.get('name'), '1')
84         self.assertEqual(field_onchange.get('messages'), '1')
85
86         # FIXME: commented out because currently not supported by the client
87         # # modify messages
88         # values = {
89         #     'name': "Foo",
90         #     'categories': [],
91         #     'moderator': False,
92         #     'participants': [],
93         #     'messages': [
94         #         (0, 0, {
95         #             'name': "[%s] %s" % ('', USER.name),
96         #             'body': BODY,
97         #             'author': USER.id,
98         #             'size': len(BODY),
99         #         }),
100         #         (4, message.id),
101         #     ],
102         # }
103         # self.env.invalidate_all()
104         # result = self.Discussion.onchange(values, 'messages', field_onchange)
105         # self.assertIn('messages', result['value'])
106         # self.assertItemsEqual(result['value']['messages'], [
107         #     (0, 0, {
108         #         'name': "[%s] %s" % ("Foo", USER.name),
109         #         'body': BODY,
110         #         'author': USER.id,
111         #         'size': len(BODY),
112         #     }),
113         #     (1, message.id, {
114         #         'name': "[%s] %s" % ("Foo", USER.name),
115         #         'body': BODY,
116         #         'author': USER.id,
117         #         'size': len(BODY),
118         #     }),
119         # ])
120
121         # modify discussion name
122         values = {
123             'name': "Foo",
124             'categories': [],
125             'moderator': False,
126             'participants': [],
127             'messages': [
128                 (0, 0, {
129                     'name': "[%s] %s" % ('', USER.name),
130                     'body': BODY,
131                     'author': USER.id,
132                     'size': len(BODY),
133                 }),
134                 (4, message.id),
135             ],
136         }
137         self.env.invalidate_all()
138         result = self.Discussion.onchange(values, 'name', field_onchange)
139         self.assertIn('messages', result['value'])
140         self.assertItemsEqual(result['value']['messages'], [
141             (0, 0, {
142                 'name': "[%s] %s" % ("Foo", USER.name),
143             }),
144             (1, message.id, {
145                 'name': "[%s] %s" % ("Foo", USER.name),
146                 # Note: size is computed because it was not provided beforehand
147                 'size': len(BODY),
148             }),
149         ])
150
151     def test_onchange_specific(self):
152         """ test the effect of field-specific onchange method """
153         discussion = self.env.ref('test_new_api.discussion_0')
154         demo = self.env.ref('base.user_demo')
155
156         field_onchange = self.Discussion._onchange_spec()
157         self.assertEqual(field_onchange.get('moderator'), '1')
158
159         # first remove demo user from participants
160         discussion.participants -= demo
161         self.assertNotIn(demo, discussion.participants)
162
163         # check that demo_user is added to participants when set as moderator
164         participants = [(4, usr.id) for usr in discussion.participants]
165         values = {
166             'name': discussion.name,
167             'moderator': demo.id,
168             'categories': [(4, cat.id) for cat in discussion.categories],
169             'messages': [(4, msg.id) for msg in discussion.messages],
170             'participants': participants,
171         }
172         self.env.invalidate_all()
173         result = discussion.onchange(values, 'moderator', field_onchange)
174
175         self.assertIn('participants', result['value'])
176         self.assertItemsEqual(result['value']['participants'], participants + [(4, demo.id)])
177
178     def test_onchange_one2many_value(self):
179         """ test the value of the one2many field inside the onchange """
180         discussion = self.env.ref('test_new_api.discussion_0')
181         demo = self.env.ref('base.user_demo')
182
183         field_onchange = self.Discussion._onchange_spec()
184         self.assertEqual(field_onchange.get('messages'), '1')
185
186         self.assertEqual(len(discussion.messages), 3)
187         messages = [(4, msg.id) for msg in discussion.messages]
188         messages[0] = (1, messages[0][1], {'body': 'test onchange'})
189         values = {
190             'name': discussion.name,
191             'moderator': demo.id,
192             'categories': [(4, cat.id) for cat in discussion.categories],
193             'messages': messages,
194             'participants': [(4, usr.id) for usr in discussion.participants],
195             'message_changes': 0,
196         }
197         result = discussion.onchange(values, 'messages', field_onchange)
198         self.assertIn('message_changes', result['value'])
199         self.assertEqual(result['value']['message_changes'], len(discussion.messages))