summaryrefslogtreecommitdiff
path: root/odoo/addons/test_new_api/tests/test_new_fields.py
diff options
context:
space:
mode:
authorRaphael Collet <rco@odoo.com>2020-07-02 08:56:08 +0000
committerRaphael Collet <rco@odoo.com>2020-07-08 11:58:33 +0000
commitdd8a6b8a8299afaac699d04f2ed886ff85c685fe (patch)
tree6352a86a099bdcf8e0252364c0f0a670018feb9f /odoo/addons/test_new_api/tests/test_new_fields.py
parent04250d80163bb785b674b85fe24354c9d999efea (diff)
[ADD] test_new_api: tests on queries made by create with computed fields
closes odoo/odoo#54209 Related: odoo/upgrade#1464 Signed-off-by: Raphael Collet (rco) <rco@openerp.com>
Diffstat (limited to 'odoo/addons/test_new_api/tests/test_new_fields.py')
-rw-r--r--odoo/addons/test_new_api/tests/test_new_fields.py107
1 files changed, 106 insertions, 1 deletions
diff --git a/odoo/addons/test_new_api/tests/test_new_fields.py b/odoo/addons/test_new_api/tests/test_new_fields.py
index a42ce7a9d85..b071e043414 100644
--- a/odoo/addons/test_new_api/tests/test_new_fields.py
+++ b/odoo/addons/test_new_api/tests/test_new_fields.py
@@ -322,7 +322,7 @@ class TestFields(TransactionCaseWithUserDemo):
def test_11_stored_protected(self):
""" test protection against recomputation """
- model = self.env['test_new_api.compute.protected']
+ model = self.env['test_new_api.compute.readonly']
field = model._fields['bar']
record = model.create({'foo': 'unprotected #1'})
@@ -2826,3 +2826,108 @@ class TestSelectionOndeleteAdvanced(common.TransactionCase):
with self.assertRaises(ValueError):
self.registry.setup_models(self.env.cr)
+
+
+def insert(model, *fnames):
+ """ Return the expected query string to INSERT the given columns. """
+ columns = ['create_uid', 'create_date', 'write_uid', 'write_date'] + sorted(fnames)
+ return 'INSERT INTO "{}" ("id", {}) VALUES (nextval(%s), {}) RETURNING id'.format(
+ model._table,
+ ", ".join('"{}"'.format(column) for column in columns),
+ ", ".join('%s' for column in columns),
+ )
+
+
+def update(model, *fnames):
+ """ Return the expected query string to UPDATE the given columns. """
+ columns = sorted(fnames) + ['write_uid', 'write_date']
+ return 'UPDATE "{}" SET {} WHERE id IN %s'.format(
+ model._table,
+ ", ".join('"{}" = %s'.format(column) for column in columns),
+ )
+
+
+class TestComputeQueries(common.TransactionCase):
+ """ Test the queries made by create() with computed fields. """
+
+ def test_compute_readonly(self):
+ model = self.env['test_new_api.compute.readonly']
+ model.create({})
+
+ # no value, no default
+ with self.assertQueries([insert(model, 'foo'), update(model, 'bar')]):
+ record = model.create({'foo': 'Foo'})
+ self.assertEqual(record.bar, 'Foo')
+
+ # some value, no default
+ with self.assertQueries([insert(model, 'foo', 'bar'), update(model, 'bar')]):
+ record = model.create({'foo': 'Foo', 'bar': 'Bar'})
+ self.assertEqual(record.bar, 'Foo')
+
+ model = model.with_context(default_bar='Def')
+
+ # no value, some default
+ with self.assertQueries([insert(model, 'foo', 'bar'), update(model, 'bar')]):
+ record = model.create({'foo': 'Foo'})
+ self.assertEqual(record.bar, 'Foo')
+
+ # some value, some default
+ with self.assertQueries([insert(model, 'foo', 'bar'), update(model, 'bar')]):
+ record = model.create({'foo': 'Foo', 'bar': 'Bar'})
+ self.assertEqual(record.bar, 'Foo')
+
+ def test_compute_readwrite(self):
+ model = self.env['test_new_api.compute.readwrite']
+ model.create({})
+
+ # no value, no default
+ with self.assertQueries([insert(model, 'foo'), update(model, 'bar')]):
+ record = model.create({'foo': 'Foo'})
+ self.assertEqual(record.bar, 'Foo')
+
+ # some value, no default
+ with self.assertQueries([insert(model, 'foo', 'bar')]):
+ record = model.create({'foo': 'Foo', 'bar': 'Bar'})
+ self.assertEqual(record.bar, 'Bar')
+
+ model = model.with_context(default_bar='Def')
+
+ # no value, some default
+ with self.assertQueries([insert(model, 'foo', 'bar')]):
+ record = model.create({'foo': 'Foo'})
+ self.assertEqual(record.bar, 'Def')
+
+ # some value, some default
+ with self.assertQueries([insert(model, 'foo', 'bar')]):
+ record = model.create({'foo': 'Foo', 'bar': 'Bar'})
+ self.assertEqual(record.bar, 'Bar')
+
+ def test_compute_inverse(self):
+ model = self.env['test_new_api.compute.inverse']
+ model.create({})
+
+ # no value, no default
+ with self.assertQueries([insert(model, 'foo'), update(model, 'bar')]):
+ record = model.create({'foo': 'Foo'})
+ self.assertEqual(record.foo, 'Foo')
+ self.assertEqual(record.bar, 'Foo')
+
+ # some value, no default
+ with self.assertQueries([insert(model, 'foo', 'bar'), update(model, 'foo')]):
+ record = model.create({'foo': 'Foo', 'bar': 'Bar'})
+ self.assertEqual(record.foo, 'Bar')
+ self.assertEqual(record.bar, 'Bar')
+
+ model = model.with_context(default_bar='Def')
+
+ # no value, some default
+ with self.assertQueries([insert(model, 'foo', 'bar'), update(model, 'foo')]):
+ record = model.create({'foo': 'Foo'})
+ self.assertEqual(record.foo, 'Def')
+ self.assertEqual(record.bar, 'Def')
+
+ # some value, some default
+ with self.assertQueries([insert(model, 'foo', 'bar'), update(model, 'foo')]):
+ record = model.create({'foo': 'Foo', 'bar': 'Bar'})
+ self.assertEqual(record.foo, 'Bar')
+ self.assertEqual(record.bar, 'Bar')