1 # -*- coding: utf-8 -*-
3 from openerp.tests import common
5 class TestOnChange(common.TransactionCase):
8 super(TestOnChange, self).setUp()
9 self.Discussion = self.env['test_new_api.discussion']
10 self.Message = self.env['test_new_api.message']
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, {})
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()
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!"
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')
34 # changing 'discussion' should recompute 'name'
36 'discussion': discussion.id,
37 'name': "[%s] %s" % ('', USER.name),
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))
47 # changing 'body' should recompute 'size'
49 'discussion': discussion.id,
50 'name': "[%s] %s" % (discussion.name, USER.name),
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))
60 # changing 'body' should not recompute 'name', even if 'discussion' and
61 # 'name' are not consistent with each other
63 'discussion': discussion.id,
69 self.env.invalidate_all()
70 result = self.Message.onchange(values, 'body', field_onchange)
71 self.assertNotIn('name', result['value'])
73 def test_onchange_one2many(self):
74 """ test the effect of onchange() on one2many fields """
75 BODY = "What a beautiful day!"
78 # create an independent message
79 message = self.Message.create({'body': BODY})
80 self.assertEqual(message.name, "[%s] %s" % ('', USER.name))
82 field_onchange = self.Discussion._onchange_spec()
83 self.assertEqual(field_onchange.get('name'), '1')
84 self.assertEqual(field_onchange.get('messages'), '1')
86 # FIXME: commented out because currently not supported by the client
95 # 'name': "[%s] %s" % ('', USER.name),
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'], [
108 # 'name': "[%s] %s" % ("Foo", USER.name),
114 # 'name': "[%s] %s" % ("Foo", USER.name),
121 # modify discussion name
129 'name': "[%s] %s" % ('', USER.name),
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'], [
142 'name': "[%s] %s" % ("Foo", USER.name),
148 'name': "[%s] %s" % ("Foo", USER.name),
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')
160 field_onchange = self.Discussion._onchange_spec()
161 self.assertEqual(field_onchange.get('moderator'), '1')
163 # first remove demo user from participants
164 discussion.participants -= demo
165 self.assertNotIn(demo, discussion.participants)
167 # check that demo_user is added to participants when set as moderator
168 participants = [(4, usr.id) for usr in discussion.participants]
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,
176 self.env.invalidate_all()
177 result = discussion.onchange(values, 'moderator', field_onchange)
179 self.assertIn('participants', result['value'])
180 self.assertItemsEqual(result['value']['participants'], participants + [(4, demo.id)])
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')
187 field_onchange = self.Discussion._onchange_spec()
188 self.assertEqual(field_onchange.get('messages'), '1')
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'})
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,
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))