da28bdf0c1b8180bdbeba2ce88b5afaa298024cc
[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                 'body': BODY,
144                 'author': USER.id,
145                 'size': len(BODY),
146             }),
147             (1, message.id, {
148                 'name': "[%s] %s" % ("Foo", USER.name),
149                 'body': BODY,
150                 'author': USER.id,
151                 'size': len(BODY),
152             }),
153         ])
154
155     def test_onchange_specific(self):
156         """ test the effect of field-specific onchange method """
157         discussion = self.env.ref('test_new_api.discussion_0')
158         demo = self.env.ref('base.user_demo')
159
160         field_onchange = self.Discussion._onchange_spec()
161         self.assertEqual(field_onchange.get('moderator'), '1')
162
163         # first remove demo user from participants
164         discussion.participants -= demo
165         self.assertNotIn(demo, discussion.participants)
166
167         # check that demo_user is added to participants when set as moderator
168         participants = [(4, usr.id) for usr in discussion.participants]
169         values = {
170             'name': discussion.name,
171             'moderator': demo.id,
172             'categories': [(4, cat.id) for cat in discussion.categories],
173             'messages': [(4, msg.id) for msg in discussion.messages],
174             'participants': participants,
175         }
176         self.env.invalidate_all()
177         result = discussion.onchange(values, 'moderator', field_onchange)
178
179         self.assertIn('participants', result['value'])
180         self.assertItemsEqual(result['value']['participants'], participants + [(4, demo.id)])
181
182     def test_onchange_one2many_value(self):
183         """ test the value of the one2many field inside the onchange """
184         discussion = self.env.ref('test_new_api.discussion_0')
185         demo = self.env.ref('base.user_demo')
186
187         field_onchange = self.Discussion._onchange_spec()
188         self.assertEqual(field_onchange.get('messages'), '1')
189
190         self.assertEqual(len(discussion.messages), 3)
191         messages = [(4, msg.id) for msg in discussion.messages]
192         messages[0] = (1, messages[0][1], {'body': 'test onchange'})
193         values = {
194             'name': discussion.name,
195             'moderator': demo.id,
196             'categories': [(4, cat.id) for cat in discussion.categories],
197             'messages': messages,
198             'participants': [(4, usr.id) for usr in discussion.participants],
199             'message_changes': 0,
200         }
201         result = discussion.onchange(values, 'messages', field_onchange)
202         self.assertIn('message_changes', result['value'])
203         self.assertEqual(result['value']['message_changes'], len(discussion.messages))