From 00cdfb2c71242de77d1e94be26dc4dd297f5dcd5 Mon Sep 17 00:00:00 2001 From: Maksym Yankin Date: Thu, 9 Feb 2023 14:39:14 +0200 Subject: [PATCH] [IMP] database_cleanup: improve tests --- database_cleanup/tests/common.py | 38 +++++++----- database_cleanup/tests/test_create_indexes.py | 27 ++++---- database_cleanup/tests/test_purge_columns.py | 62 ++++++++++--------- database_cleanup/tests/test_purge_data.py | 39 ++++++------ database_cleanup/tests/test_purge_menus.py | 53 ++++++++-------- database_cleanup/tests/test_purge_models.py | 60 ++++++++---------- database_cleanup/tests/test_purge_modules.py | 33 +++++----- .../tests/test_purge_properties.py | 62 ++++++++++--------- database_cleanup/tests/test_purge_tables.py | 23 +++---- 9 files changed, 201 insertions(+), 196 deletions(-) diff --git a/database_cleanup/tests/common.py b/database_cleanup/tests/common.py index 98b7c8ca2..2223ed4d9 100644 --- a/database_cleanup/tests/common.py +++ b/database_cleanup/tests/common.py @@ -1,23 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # 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 - cls.original_registry = Registry.registries[cls.env.cr.dbname] +@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, {}) - @classmethod - def tearDownClass(cls): - super().tearDownClass() - # Force rollback to avoid unstable test database - cls.env.cr.rollback() - # reset afterwards - Registry.registries[cls.env.cr.dbname] = cls.original_registry + +# 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().setUp() diff --git a/database_cleanup/tests/test_create_indexes.py b/database_cleanup/tests/test_create_indexes.py index f92196056..52454c5eb 100644 --- a/database_cleanup/tests/test_create_indexes.py +++ b/database_cleanup/tests/test_create_indexes.py @@ -3,23 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # delete some index and check if our module recreated it - cls.env.cr.execute("drop index res_partner_name_index") + def setUp(self): + 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 331bf54ce..d8ddbada9 100644 --- a/database_cleanup/tests/test_purge_columns.py +++ b/database_cleanup/tests/test_purge_columns.py @@ -5,39 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # create an orphaned column - cls.env.cr.execute( - "alter table res_partner add column database_cleanup_test int" - ) + def setUp(self): + 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 1abce0e47..4006568f4 100644 --- a/database_cleanup/tests/test_purge_data.py +++ b/database_cleanup/tests/test_purge_data.py @@ -3,29 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # create a data entry pointing nowhere - cls.env.cr.execute("select max(id) + 1 from res_users") - cls.env["ir.model.data"].create( - { - "module": "database_cleanup", - "name": "test_no_data_entry", - "model": "res.users", - "res_id": cls.env.cr.fetchone()[0], - } - ) + def setUp(self): + 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 f3718bc36..81aaf158d 100644 --- a/database_cleanup/tests/test_purge_menus.py +++ b/database_cleanup/tests/test_purge_menus.py @@ -3,37 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # create a new empty menu - cls.menu = cls.env["ir.ui.menu"].create({"name": "database_cleanup_test"}) + def setUp(self): + 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 25457b4d5..b37fccd98 100644 --- a/database_cleanup/tests/test_purge_models.py +++ b/database_cleanup/tests/test_purge_models.py @@ -3,44 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # create a nonexistent model - cls.model_name = "x_database.cleanup.test.model" - cls.model_values = { - "name": "Database cleanup test model", - "model": cls.model_name, - } - cls.model = cls.env["ir.model"].create(cls.model_values) - cls.env.cr.execute( - "insert into ir_attachment (name, res_model, res_id, type) values " - "('test attachment', %s, 42, 'binary')", - [cls.model_name], - ) - cls.env.registry.models.pop(cls.model_name) - - @classmethod - def tearDownClass(cls): - """We recreate the model to avoid registry Exception at loading""" - super().tearDownClass() - # FIXME: issue origin is not clear but it must be addressed. - cls.model = cls.env["ir.model"].create(cls.model_values) + def setUp(self): + 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 36ddc1531..46a659ffb 100644 --- a/database_cleanup/tests/test_purge_modules.py +++ b/database_cleanup/tests/test_purge_modules.py @@ -3,26 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # create a nonexistent module - cls.module = cls.env["ir.module.module"].create( - { - "name": "database_cleanup_test", - "state": "to upgrade", - } - ) + def setUp(self): + 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 23094bd9f..2377ad5c8 100644 --- a/database_cleanup/tests/test_purge_properties.py +++ b/database_cleanup/tests/test_purge_properties.py @@ -3,42 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # Create one property for tests - cls.partner_name_field_id = cls.env["ir.model.fields"].search( - [("name", "=", "name"), ("model_id.model", "=", "res.partner")], limit=1 - ) + def setUp(self): + 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 4b1552c58..a7bda839c 100644 --- a/database_cleanup/tests/test_purge_tables.py +++ b/database_cleanup/tests/test_purge_tables.py @@ -5,22 +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): - @classmethod - def setUpClass(cls): - super().setUpClass() - # create an orphaned table - cls.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")