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),
149 # Note: size is computed because it was not provided beforehand
154 def test_onchange_specific(self):
155 """ test the effect of field-specific onchange method """
156 discussion = self.env.ref('test_new_api.discussion_0')
157 demo = self.env.ref('base.user_demo')
159 field_onchange = self.Discussion._onchange_spec()
160 self.assertEqual(field_onchange.get('moderator'), '1')
162 # first remove demo user from participants
163 discussion.participants -= demo
164 self.assertNotIn(demo, discussion.participants)
166 # check that demo_user is added to participants when set as moderator
167 participants = [(4, usr.id) for usr in discussion.participants]
169 'name': discussion.name,
170 'moderator': demo.id,
171 'categories': [(4, cat.id) for cat in discussion.categories],
172 'messages': [(4, msg.id) for msg in discussion.messages],
173 'participants': participants,
175 self.env.invalidate_all()
176 result = discussion.onchange(values, 'moderator', field_onchange)
178 self.assertIn('participants', result['value'])
179 self.assertItemsEqual(result['value']['participants'], participants + [(4, demo.id)])
181 def test_onchange_one2many_value(self):
182 """ test the value of the one2many field inside the onchange """
183 discussion = self.env.ref('test_new_api.discussion_0')
184 demo = self.env.ref('base.user_demo')
186 field_onchange = self.Discussion._onchange_spec()
187 self.assertEqual(field_onchange.get('messages'), '1')
189 self.assertEqual(len(discussion.messages), 3)
190 messages = [(4, msg.id) for msg in discussion.messages]
191 messages[0] = (1, messages[0][1], {'body': 'test onchange'})
193 'name': discussion.name,
194 'moderator': demo.id,
195 'categories': [(4, cat.id) for cat in discussion.categories],
196 'messages': messages,
197 'participants': [(4, usr.id) for usr in discussion.participants],
198 'message_changes': 0,
200 result = discussion.onchange(values, 'messages', field_onchange)
201 self.assertIn('message_changes', result['value'])
202 self.assertEqual(result['value']['message_changes'], len(discussion.messages))