6ebc45ac8ffd69945e77747b6238885af5c5dae7
[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         values = {
35             'discussion': discussion.id,
36             'name': "[%s] %s" % ('', USER.name),
37             'body': False,
38             'author': USER.id,
39             'size': 0,
40         }
41         self.env.invalidate_all()
42         result = self.Message.onchange(values, 'discussion', field_onchange)
43         self.assertLessEqual(set(['name']), set(result['value']))
44         self.assertEqual(result['value']['name'], "[%s] %s" % (discussion.name, USER.name))
45
46         values = {
47             'discussion': discussion.id,
48             'name': "[%s] %s" % (discussion.name, USER.name),
49             'body': BODY,
50             'author': USER.id,
51             'size': 0,
52         }
53         self.env.invalidate_all()
54         result = self.Message.onchange(values, 'body', field_onchange)
55         self.assertLessEqual(set(['size']), set(result['value']))
56         self.assertEqual(result['value']['size'], len(BODY))
57
58     def test_onchange_one2many(self):
59         """ test the effect of onchange() on one2many fields """
60         BODY = "What a beautiful day!"
61         USER = self.env.user
62
63         # create an independent message
64         message = self.Message.create({'body': BODY})
65         self.assertEqual(message.name, "[%s] %s" % ('', USER.name))
66
67         field_onchange = self.Discussion._onchange_spec()
68         self.assertEqual(field_onchange.get('name'), '1')
69         self.assertEqual(field_onchange.get('messages'), '1')
70
71         # FIXME: commented out because currently not supported by the client
72         # # modify messages
73         # values = {
74         #     'name': "Foo",
75         #     'categories': [],
76         #     'moderator': False,
77         #     'participants': [],
78         #     'messages': [
79         #         (0, 0, {
80         #             'name': "[%s] %s" % ('', USER.name),
81         #             'body': BODY,
82         #             'author': USER.id,
83         #             'size': len(BODY),
84         #         }),
85         #         (4, message.id),
86         #     ],
87         # }
88         # self.env.invalidate_all()
89         # result = self.Discussion.onchange(values, 'messages', field_onchange)
90         # self.assertLessEqual(set(['messages']), set(result['value']))
91         # self.assertItemsEqual(result['value']['messages'], [
92         #     (0, 0, {
93         #         'name': "[%s] %s" % ("Foo", USER.name),
94         #         'body': BODY,
95         #         'author': USER.id,
96         #         'size': len(BODY),
97         #     }),
98         #     (1, message.id, {
99         #         'name': "[%s] %s" % ("Foo", USER.name),
100         #         'body': BODY,
101         #         'author': USER.id,
102         #         'size': len(BODY),
103         #     }),
104         # ])
105
106         # modify discussion name
107         values = {
108             'name': "Foo",
109             'categories': [],
110             'moderator': False,
111             'participants': [],
112             'messages': [
113                 (0, 0, {
114                     'name': "[%s] %s" % ('', USER.name),
115                     'body': BODY,
116                     'author': USER.id,
117                     'size': len(BODY),
118                 }),
119                 (4, message.id),
120             ],
121         }
122         self.env.invalidate_all()
123         result = self.Discussion.onchange(values, 'name', field_onchange)
124         self.assertLessEqual(set(['messages']), set(result['value']))
125         self.assertItemsEqual(result['value']['messages'], [
126             (0, 0, {
127                 'name': "[%s] %s" % ("Foo", USER.name),
128                 'body': BODY,
129                 'author': USER.id,
130                 'size': len(BODY),
131             }),
132             (1, message.id, {
133                 'name': "[%s] %s" % ("Foo", USER.name),
134                 'body': BODY,
135                 'author': USER.id,
136                 'size': len(BODY),
137             }),
138         ])
139
140     def test_onchange_specific(self):
141         """ test the effect of field-specific onchange method """
142         discussion = self.env.ref('test_new_api.discussion_0')
143         demo = self.env.ref('base.user_demo')
144
145         field_onchange = self.Discussion._onchange_spec()
146         self.assertEqual(field_onchange.get('moderator'), '1')
147
148         # first remove demo user from participants
149         discussion.participants -= demo
150         self.assertNotIn(demo, discussion.participants)
151
152         # check that demo_user is added to participants when set as moderator
153         participants = [(4, usr.id) for usr in discussion.participants]
154         values = {
155             'name': discussion.name,
156             'moderator': demo.id,
157             'categories': [(4, cat.id) for cat in discussion.categories],
158             'messages': [(4, msg.id) for msg in discussion.messages],
159             'participants': participants,
160         }
161         self.env.invalidate_all()
162         result = discussion.onchange(values, 'moderator', field_onchange)
163
164         self.assertLessEqual(set(['participants']), set(result['value']))
165         self.assertItemsEqual(result['value']['participants'], participants + [(4, demo.id)])
166
167     def test_onchange_one2many_value(self):
168         """ test the value of the one2many field inside the onchange """
169         discussion = self.env.ref('test_new_api.discussion_0')
170         demo = self.env.ref('base.user_demo')
171
172         field_onchange = self.Discussion._onchange_spec()
173         self.assertEqual(field_onchange.get('messages'), '1')
174
175         self.assertEqual(len(discussion.messages), 3)
176         messages = [(4, msg.id) for msg in discussion.messages]
177         messages[0] = (1, messages[0][1], {'body': 'test onchange'})
178         values = {
179             'name': discussion.name,
180             'moderator': demo.id,
181             'categories': [(4, cat.id) for cat in discussion.categories],
182             'messages': messages,
183             'participants': [(4, usr.id) for usr in discussion.participants],
184             'message_changes': 0,
185         }
186         result = discussion.onchange(values, 'messages', field_onchange)
187         self.assertEqual(result['value'].get('message_changes', 0), len(discussion.messages))