From dd8a6b8a8299afaac699d04f2ed886ff85c685fe Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Thu, 2 Jul 2020 08:56:08 +0000 Subject: [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) --- odoo/addons/test_new_api/tests/test_new_fields.py | 107 +++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) (limited to 'odoo/addons/test_new_api/tests/test_new_fields.py') 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') -- cgit v1.2.3