203 lines
7.6 KiB
Python
203 lines
7.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from openerp.tests import common
|
|
|
|
class TestOnChange(common.TransactionCase):
|
|
|
|
def setUp(self):
|
|
super(TestOnChange, self).setUp()
|
|
self.Discussion = self.env['test_new_api.discussion']
|
|
self.Message = self.env['test_new_api.message']
|
|
|
|
def test_default_get(self):
|
|
""" checking values returned by default_get() """
|
|
fields = ['name', 'categories', 'participants', 'messages']
|
|
values = self.Discussion.default_get(fields)
|
|
self.assertEqual(values, {})
|
|
|
|
def test_get_field(self):
|
|
""" checking that accessing an unknown attribute does nothing special """
|
|
with self.assertRaises(AttributeError):
|
|
self.Discussion.not_really_a_method()
|
|
|
|
def test_onchange(self):
|
|
""" test the effect of onchange() """
|
|
discussion = self.env.ref('test_new_api.discussion_0')
|
|
BODY = "What a beautiful day!"
|
|
USER = self.env.user
|
|
|
|
field_onchange = self.Message._onchange_spec()
|
|
self.assertEqual(field_onchange.get('author'), '1')
|
|
self.assertEqual(field_onchange.get('body'), '1')
|
|
self.assertEqual(field_onchange.get('discussion'), '1')
|
|
|
|
# changing 'discussion' should recompute 'name'
|
|
values = {
|
|
'discussion': discussion.id,
|
|
'name': "[%s] %s" % ('', USER.name),
|
|
'body': False,
|
|
'author': USER.id,
|
|
'size': 0,
|
|
}
|
|
self.env.invalidate_all()
|
|
result = self.Message.onchange(values, 'discussion', field_onchange)
|
|
self.assertIn('name', result['value'])
|
|
self.assertEqual(result['value']['name'], "[%s] %s" % (discussion.name, USER.name))
|
|
|
|
# changing 'body' should recompute 'size'
|
|
values = {
|
|
'discussion': discussion.id,
|
|
'name': "[%s] %s" % (discussion.name, USER.name),
|
|
'body': BODY,
|
|
'author': USER.id,
|
|
'size': 0,
|
|
}
|
|
self.env.invalidate_all()
|
|
result = self.Message.onchange(values, 'body', field_onchange)
|
|
self.assertIn('size', result['value'])
|
|
self.assertEqual(result['value']['size'], len(BODY))
|
|
|
|
# changing 'body' should not recompute 'name', even if 'discussion' and
|
|
# 'name' are not consistent with each other
|
|
values = {
|
|
'discussion': discussion.id,
|
|
'name': False,
|
|
'body': BODY,
|
|
'author': USER.id,
|
|
'size': 0,
|
|
}
|
|
self.env.invalidate_all()
|
|
result = self.Message.onchange(values, 'body', field_onchange)
|
|
self.assertNotIn('name', result['value'])
|
|
|
|
def test_onchange_one2many(self):
|
|
""" test the effect of onchange() on one2many fields """
|
|
BODY = "What a beautiful day!"
|
|
USER = self.env.user
|
|
|
|
# create an independent message
|
|
message = self.Message.create({'body': BODY})
|
|
self.assertEqual(message.name, "[%s] %s" % ('', USER.name))
|
|
|
|
field_onchange = self.Discussion._onchange_spec()
|
|
self.assertEqual(field_onchange.get('name'), '1')
|
|
self.assertEqual(field_onchange.get('messages'), '1')
|
|
|
|
# FIXME: commented out because currently not supported by the client
|
|
# # modify messages
|
|
# values = {
|
|
# 'name': "Foo",
|
|
# 'categories': [],
|
|
# 'moderator': False,
|
|
# 'participants': [],
|
|
# 'messages': [
|
|
# (0, 0, {
|
|
# 'name': "[%s] %s" % ('', USER.name),
|
|
# 'body': BODY,
|
|
# 'author': USER.id,
|
|
# 'size': len(BODY),
|
|
# }),
|
|
# (4, message.id),
|
|
# ],
|
|
# }
|
|
# self.env.invalidate_all()
|
|
# result = self.Discussion.onchange(values, 'messages', field_onchange)
|
|
# self.assertIn('messages', result['value'])
|
|
# self.assertItemsEqual(result['value']['messages'], [
|
|
# (0, 0, {
|
|
# 'name': "[%s] %s" % ("Foo", USER.name),
|
|
# 'body': BODY,
|
|
# 'author': USER.id,
|
|
# 'size': len(BODY),
|
|
# }),
|
|
# (1, message.id, {
|
|
# 'name': "[%s] %s" % ("Foo", USER.name),
|
|
# 'body': BODY,
|
|
# 'author': USER.id,
|
|
# 'size': len(BODY),
|
|
# }),
|
|
# ])
|
|
|
|
# modify discussion name
|
|
values = {
|
|
'name': "Foo",
|
|
'categories': [],
|
|
'moderator': False,
|
|
'participants': [],
|
|
'messages': [
|
|
(0, 0, {
|
|
'name': "[%s] %s" % ('', USER.name),
|
|
'body': BODY,
|
|
'author': USER.id,
|
|
'size': len(BODY),
|
|
}),
|
|
(4, message.id),
|
|
],
|
|
}
|
|
self.env.invalidate_all()
|
|
result = self.Discussion.onchange(values, 'name', field_onchange)
|
|
self.assertIn('messages', result['value'])
|
|
self.assertItemsEqual(result['value']['messages'], [
|
|
(0, 0, {
|
|
'name': "[%s] %s" % ("Foo", USER.name),
|
|
'body': BODY,
|
|
'author': USER.id,
|
|
'size': len(BODY),
|
|
}),
|
|
(1, message.id, {
|
|
'name': "[%s] %s" % ("Foo", USER.name),
|
|
# Note: size is computed because it was not provided beforehand
|
|
'size': len(BODY),
|
|
}),
|
|
])
|
|
|
|
def test_onchange_specific(self):
|
|
""" test the effect of field-specific onchange method """
|
|
discussion = self.env.ref('test_new_api.discussion_0')
|
|
demo = self.env.ref('base.user_demo')
|
|
|
|
field_onchange = self.Discussion._onchange_spec()
|
|
self.assertEqual(field_onchange.get('moderator'), '1')
|
|
|
|
# first remove demo user from participants
|
|
discussion.participants -= demo
|
|
self.assertNotIn(demo, discussion.participants)
|
|
|
|
# check that demo_user is added to participants when set as moderator
|
|
participants = [(4, usr.id) for usr in discussion.participants]
|
|
values = {
|
|
'name': discussion.name,
|
|
'moderator': demo.id,
|
|
'categories': [(4, cat.id) for cat in discussion.categories],
|
|
'messages': [(4, msg.id) for msg in discussion.messages],
|
|
'participants': participants,
|
|
}
|
|
self.env.invalidate_all()
|
|
result = discussion.onchange(values, 'moderator', field_onchange)
|
|
|
|
self.assertIn('participants', result['value'])
|
|
self.assertItemsEqual(result['value']['participants'], participants + [(4, demo.id)])
|
|
|
|
def test_onchange_one2many_value(self):
|
|
""" test the value of the one2many field inside the onchange """
|
|
discussion = self.env.ref('test_new_api.discussion_0')
|
|
demo = self.env.ref('base.user_demo')
|
|
|
|
field_onchange = self.Discussion._onchange_spec()
|
|
self.assertEqual(field_onchange.get('messages'), '1')
|
|
|
|
self.assertEqual(len(discussion.messages), 3)
|
|
messages = [(4, msg.id) for msg in discussion.messages]
|
|
messages[0] = (1, messages[0][1], {'body': 'test onchange'})
|
|
values = {
|
|
'name': discussion.name,
|
|
'moderator': demo.id,
|
|
'categories': [(4, cat.id) for cat in discussion.categories],
|
|
'messages': messages,
|
|
'participants': [(4, usr.id) for usr in discussion.participants],
|
|
'message_changes': 0,
|
|
}
|
|
result = discussion.onchange(values, 'messages', field_onchange)
|
|
self.assertIn('message_changes', result['value'])
|
|
self.assertEqual(result['value']['message_changes'], len(discussion.messages))
|