diff --git a/database_cleanup/tests/common.py b/database_cleanup/tests/common.py index 1cba6102b..2223ed4d9 100644 --- a/database_cleanup/tests/common.py +++ b/database_cleanup/tests/common.py @@ -1,14 +1,27 @@ # Copyright 2021 Camptocamp SA # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo.modules.registry import Registry -from odoo.tests.common import TransactionCase +from contextlib import contextmanager + +import odoo +from odoo.tests import common +from odoo.tests.common import BaseCase, tagged + +ADMIN_USER_ID = common.ADMIN_USER_ID -class Common(TransactionCase): +@contextmanager +def environment(): + """Return an environment with a new cursor for the current database; the + cursor is committed and closed after the context block. + """ + registry = odoo.registry(common.get_db_name()) + with registry.cursor() as cr: + yield odoo.api.Environment(cr, ADMIN_USER_ID, {}) + + +# Use post_install to get all models loaded more info: odoo/odoo#13458 +@tagged("post_install", "-at_install") +class Common(BaseCase): def setUp(self): - super(Common, self).setUp() - # this reloads our registry, and we don't want to run tests twice - # we also need the original registry for further tests, so save a - # reference to it - self.original_registry = Registry.registries[self.env.cr.dbname] + super().setUp() diff --git a/database_cleanup/tests/test_create_indexes.py b/database_cleanup/tests/test_create_indexes.py index 70f0403f5..52454c5eb 100644 --- a/database_cleanup/tests/test_create_indexes.py +++ b/database_cleanup/tests/test_create_indexes.py @@ -3,22 +3,24 @@ from odoo.tests.common import tagged -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCreateIndexesLine(Common): def setUp(self): - super(TestCreateIndexesLine, self).setUp() - # delete some index and check if our module recreated it - self.env.cr.execute("drop index res_partner_name_index") + super().setUp() + with environment() as env: + # delete some index and check if our module recreated it + env.cr.execute("drop index res_partner_name_index") def test_deleted_index(self): - wizard = self.env["cleanup.create_indexes.wizard"].create({}) - wizard.purge_all() - self.env.cr.execute( - "select indexname from pg_indexes where " - "indexname='res_partner_name_index' and tablename='res_partner' " - ) - self.assertEqual(self.env.cr.rowcount, 1) + with environment() as env: + wizard = env["cleanup.create_indexes.wizard"].create({}) + wizard.purge_all() + env.cr.execute( + "select indexname from pg_indexes where " + "indexname='res_partner_name_index' and tablename='res_partner' " + ) + self.assertEqual(env.cr.rowcount, 1) diff --git a/database_cleanup/tests/test_purge_columns.py b/database_cleanup/tests/test_purge_columns.py index 31dba2dcb..d8ddbada9 100644 --- a/database_cleanup/tests/test_purge_columns.py +++ b/database_cleanup/tests/test_purge_columns.py @@ -5,38 +5,43 @@ from psycopg2 import ProgrammingError from odoo.tests.common import tagged from odoo.tools import mute_logger -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCleanupPurgeLineColumn(Common): def setUp(self): - super(TestCleanupPurgeLineColumn, self).setUp() - # create an orphaned column - self.env.cr.execute( - "alter table res_partner add column database_cleanup_test int" - ) + super().setUp() + with environment() as env: + # create an orphaned column + env.cr.execute( + "alter table res_partner add column database_cleanup_test int" + ) def test_empty_column(self): - # We need use a model that is not blocked (Avoid use res.users) - partner_model = self.env["ir.model"].search( - [("model", "=", "res.partner")], limit=1 - ) - wizard = self.env["cleanup.purge.wizard.column"].create( - { - "purge_line_ids": [ - ( - 0, - 0, - {"model_id": partner_model.id, "name": "database_cleanup_test"}, - ) - ] - } - ) - wizard.purge_all() - # must be removed by the wizard - with self.assertRaises(ProgrammingError): - with self.env.registry.cursor() as cr: - with mute_logger("odoo.sql_db"): - cr.execute("select database_cleanup_test from res_partner") + with environment() as env: + # We need use a model that is not blocked (Avoid use res.users) + partner_model = env["ir.model"].search( + [("model", "=", "res.partner")], limit=1 + ) + wizard = env["cleanup.purge.wizard.column"].create( + { + "purge_line_ids": [ + ( + 0, + 0, + { + "model_id": partner_model.id, + "name": "database_cleanup_test", + }, + ) + ] + } + ) + wizard.purge_all() + # must be removed by the wizard + with self.assertRaises(ProgrammingError): + with env.registry.cursor() as cr: + with mute_logger("odoo.sql_db"): + cr.execute("select database_cleanup_test from res_partner") diff --git a/database_cleanup/tests/test_purge_data.py b/database_cleanup/tests/test_purge_data.py index b1f3f054c..4006568f4 100644 --- a/database_cleanup/tests/test_purge_data.py +++ b/database_cleanup/tests/test_purge_data.py @@ -3,28 +3,30 @@ from odoo.tests.common import tagged -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCleanupPurgeLineData(Common): def setUp(self): - super(TestCleanupPurgeLineData, self).setUp() - # create a data entry pointing nowhere - self.env.cr.execute("select max(id) + 1 from res_users") - self.env["ir.model.data"].create( - { - "module": "database_cleanup", - "name": "test_no_data_entry", - "model": "res.users", - "res_id": self.env.cr.fetchone()[0], - } - ) + super().setUp() + with environment() as env: + # create a data entry pointing nowhere + env.cr.execute("select max(id) + 1 from res_users") + env["ir.model.data"].create( + { + "module": "database_cleanup", + "name": "test_no_data_entry", + "model": "res.users", + "res_id": env.cr.fetchone()[0], + } + ) def test_pointing_nowhere(self): - wizard = self.env["cleanup.purge.wizard.data"].create({}) - wizard.purge_all() - # must be removed by the wizard - with self.assertRaises(ValueError): - self.env.ref("database_cleanup.test_no_data_entry") + with environment() as env: + wizard = env["cleanup.purge.wizard.data"].create({}) + wizard.purge_all() + # must be removed by the wizard + with self.assertRaises(ValueError): + env.ref("database_cleanup.test_no_data_entry") diff --git a/database_cleanup/tests/test_purge_menus.py b/database_cleanup/tests/test_purge_menus.py index 65112b807..81aaf158d 100644 --- a/database_cleanup/tests/test_purge_menus.py +++ b/database_cleanup/tests/test_purge_menus.py @@ -3,36 +3,38 @@ from odoo.tests.common import tagged -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCleanupPurgeLineMenu(Common): def setUp(self): - super(TestCleanupPurgeLineMenu, self).setUp() - # create a new empty menu - self.menu = self.env["ir.ui.menu"].create({"name": "database_cleanup_test"}) + super().setUp() + with environment() as env: + # create a new empty menu + self.menu = env["ir.ui.menu"].create({"name": "database_cleanup_test"}) def test_empty_menu(self): - wizard = self.env["cleanup.purge.wizard.menu"].create( - { - "purge_line_ids": [ - ( - 0, - 0, - { - "menu_id": self.menu.id, - }, - ) - ] - } - ) - wizard.purge_all() - self.assertFalse( - self.env["ir.ui.menu"].search( - [ - ("name", "=", "database_cleanup_test"), - ] + with environment() as env: + wizard = env["cleanup.purge.wizard.menu"].create( + { + "purge_line_ids": [ + ( + 0, + 0, + { + "menu_id": self.menu.id, + }, + ) + ] + } + ) + wizard.purge_all() + self.assertFalse( + env["ir.ui.menu"].search( + [ + ("name", "=", "database_cleanup_test"), + ] + ) ) - ) diff --git a/database_cleanup/tests/test_purge_models.py b/database_cleanup/tests/test_purge_models.py index 996066769..b37fccd98 100644 --- a/database_cleanup/tests/test_purge_models.py +++ b/database_cleanup/tests/test_purge_models.py @@ -3,42 +3,38 @@ from odoo.tests.common import tagged -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCleanupPurgeLineColumn(Common): def setUp(self): - super(TestCleanupPurgeLineColumn, self).setUp() - # create a nonexistent model - self.model_name = "x_database.cleanup.test.model" - self.model_values = { - "name": "Database cleanup test model", - "model": self.model_name, - } - self.model = self.env["ir.model"].create(self.model_values) - self.env.cr.execute( - "insert into ir_attachment (name, res_model, res_id, type) values " - "('test attachment', %s, 42, 'binary')", - [self.model_name], - ) - self.env.registry.models.pop(self.model_name) - - def tearDown(self): - """We recreate the model to avoid registry Exception at loading""" - super(TestCleanupPurgeLineColumn, self).tearDown() - # FIXME: issue origin is not clear but it must be addressed. - self.model = self.env["ir.model"].create(self.model_values) + super().setUp() + with environment() as env: + # create a nonexistent model + self.model_name = "x_database.cleanup.test.model" + self.model_values = { + "name": "Database cleanup test model", + "model": self.model_name, + } + self.model = env["ir.model"].create(self.model_values) + env.cr.execute( + "insert into ir_attachment (name, res_model, res_id, type) values " + "('test attachment', %s, 42, 'binary')", + [self.model_name], + ) + env.registry.models.pop(self.model_name) def test_empty_model(self): - wizard = self.env["cleanup.purge.wizard.model"].create({}) - wizard.purge_all() - # must be removed by the wizard - self.assertFalse( - self.env["ir.model"].search( - [ - ("model", "=", self.model_name), - ] + with environment() as env: + wizard = env["cleanup.purge.wizard.model"].create({}) + wizard.purge_all() + # must be removed by the wizard + self.assertFalse( + env["ir.model"].search( + [ + ("model", "=", self.model_name), + ] + ) ) - ) diff --git a/database_cleanup/tests/test_purge_modules.py b/database_cleanup/tests/test_purge_modules.py index c361f7c61..46a659ffb 100644 --- a/database_cleanup/tests/test_purge_modules.py +++ b/database_cleanup/tests/test_purge_modules.py @@ -3,25 +3,27 @@ from odoo.tests.common import tagged -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCleanupPurgeLineModule(Common): def setUp(self): - super(TestCleanupPurgeLineModule, self).setUp() - # create a nonexistent module - self.module = self.env["ir.module.module"].create( - { - "name": "database_cleanup_test", - "state": "to upgrade", - } - ) + super().setUp() + with environment() as env: + # create a nonexistent module + self.module = env["ir.module.module"].create( + { + "name": "database_cleanup_test", + "state": "to upgrade", + } + ) def test_remove_to_upgrade_module(self): - wizard = self.env["cleanup.purge.wizard.module"].create({}) - module_names = wizard.purge_line_ids.filtered(lambda x: not x.purged).mapped( - "name" - ) - self.assertTrue("database_cleanup_test" in module_names) + with environment() as env: + wizard = env["cleanup.purge.wizard.module"].create({}) + module_names = wizard.purge_line_ids.filtered( + lambda x: not x.purged + ).mapped("name") + self.assertTrue("database_cleanup_test" in module_names) diff --git a/database_cleanup/tests/test_purge_properties.py b/database_cleanup/tests/test_purge_properties.py index 6cde440cc..2377ad5c8 100644 --- a/database_cleanup/tests/test_purge_properties.py +++ b/database_cleanup/tests/test_purge_properties.py @@ -3,41 +3,44 @@ from odoo.tests.common import tagged -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCleanupPurgeLineProperty(Common): def setUp(self): - super(TestCleanupPurgeLineProperty, self).setUp() - # Create one property for tests - self.partner_name_field_id = self.env["ir.model.fields"].search( - [("name", "=", "name"), ("model_id.model", "=", "res.partner")], limit=1 - ) + super().setUp() + with environment() as env: + # Create one property for tests + self.partner_name_field_id = env["ir.model.fields"].search( + [("name", "=", "name"), ("model_id.model", "=", "res.partner")], limit=1 + ) def test_property_to_not_removed(self): - self.property = self.env["ir.property"].create( - { - "fields_id": self.partner_name_field_id.id, - "type": "char", - "value_text": "My default partner name", - "res_id": False, - } - ) - wizard = self.env["cleanup.purge.wizard.property"].create({}) - wizard.purge_all() - self.assertTrue(self.property.exists()) + with environment() as env: + self.property = env["ir.property"].create( + { + "fields_id": self.partner_name_field_id.id, + "type": "char", + "value_text": "My default partner name", + "res_id": False, + } + ) + wizard = env["cleanup.purge.wizard.property"].create({}) + wizard.purge_all() + self.assertTrue(self.property.exists()) def test_property_no_value(self): - self.property = self.env["ir.property"].create( - { - "fields_id": self.partner_name_field_id.id, - "type": "char", - "value_text": False, - "res_id": False, - } - ) - wizard = self.env["cleanup.purge.wizard.property"].create({}) - wizard.purge_all() - self.assertFalse(self.property.exists()) + with environment() as env: + self.property = env["ir.property"].create( + { + "fields_id": self.partner_name_field_id.id, + "type": "char", + "value_text": False, + "res_id": False, + } + ) + wizard = env["cleanup.purge.wizard.property"].create({}) + wizard.purge_all() + self.assertFalse(self.property.exists()) diff --git a/database_cleanup/tests/test_purge_tables.py b/database_cleanup/tests/test_purge_tables.py index 7b1119d04..a7bda839c 100644 --- a/database_cleanup/tests/test_purge_tables.py +++ b/database_cleanup/tests/test_purge_tables.py @@ -5,21 +5,19 @@ from psycopg2 import ProgrammingError from odoo.tests.common import tagged from odoo.tools import mute_logger -from .common import Common +from .common import Common, environment # Use post_install to get all models loaded more info: odoo/odoo#13458 @tagged("post_install", "-at_install") class TestCleanupPurgeLineTable(Common): - def setUp(self): - super(TestCleanupPurgeLineTable, self).setUp() - # create an orphaned table - self.env.cr.execute("create table database_cleanup_test (test int)") - def test_empty_table(self): - wizard = self.env["cleanup.purge.wizard.table"].create({}) - wizard.purge_all() - with self.assertRaises(ProgrammingError): - with self.env.registry.cursor() as cr: - with mute_logger("odoo.sql_db"): - cr.execute("select * from database_cleanup_test") + with environment() as env: + # create an orphaned table + env.cr.execute("create table database_cleanup_test (test int)") + wizard = env["cleanup.purge.wizard.table"].create({}) + wizard.purge_all() + with self.assertRaises(ProgrammingError): + with env.registry.cursor() as cr: + with mute_logger("odoo.sql_db"): + cr.execute("select * from database_cleanup_test")