[IMP] tests: allow post-install tests to play real transactions

Move the post-install tests execution outside `Registry.new`, and add a flag on
class `HttpCase` to enable/disable the registry "test mode".

This allows a test to run actual transactions that will reload the registry,
which may be used to test the creation of `ir.model` instances, etc.
This commit is contained in:
mge-odoo
2017-02-08 16:13:01 +01:00
committed by Raphael Collet
parent 854759b5b1
commit ff2f188d20
4 changed files with 26 additions and 21 deletions
+3 -13
View File
@@ -19,8 +19,7 @@ import odoo.modules.registry
import odoo.tools as tools
from odoo import api, SUPERUSER_ID
from odoo.modules.module import adapt_version, initialize_sys_path, \
load_openerp_module, runs_post_install
from odoo.modules.module import adapt_version, initialize_sys_path, load_openerp_module
_logger = logging.getLogger(__name__)
_test_logger = logging.getLogger('odoo.tests')
@@ -416,18 +415,9 @@ def load_modules(db, force_demo=False, status=None, update_module=False):
for model in env.values():
model._register_hook()
# STEP 9: Run the post-install tests
# STEP 9: save installed/updated modules for post-install tests
registry.updated_modules += processed_modules
cr.commit()
t0 = time.time()
t0_sql = odoo.sql_db.sql_counter
if odoo.tools.config['test_enable']:
if update_module:
cr.execute("SELECT name FROM ir_module_module WHERE state='installed' and name = ANY(%s)", (processed_modules,))
else:
cr.execute("SELECT name FROM ir_module_module WHERE state='installed'")
for module_name in cr.fetchall():
report.record_result(odoo.modules.module.run_unit_tests(module_name[0], cr.dbname, position=runs_post_install))
_logger.log(25, "All post-tested in %.2fs, %s queries", time.time() - t0, odoo.sql_db.sql_counter - t0_sql)
finally:
cr.close()
+1
View File
@@ -109,6 +109,7 @@ class Registry(Mapping):
# modules fully loaded (maintained during init phase by `loading` module)
self._init_modules = set()
self.updated_modules = [] # installed/updated modules
self.db_name = db_name
self._db = odoo.sql_db.db_connect(db_name)
+18 -3
View File
@@ -36,6 +36,7 @@ except ImportError:
setproctitle = lambda x: None
import odoo
from odoo.modules.module import run_unit_tests, runs_post_install
from odoo.modules.registry import Registry
from odoo.release import nt_service_name
import odoo.tools.config as config
@@ -888,16 +889,16 @@ def load_test_file_py(registry, test_file):
def preload_registries(dbnames):
""" Preload a registries, possibly run a test file."""
# TODO: move all config checks to args dont check tools.config here
config = odoo.tools.config
test_file = config['test_file']
dbnames = dbnames or []
rc = 0
for dbname in dbnames:
try:
update_module = config['init'] or config['update']
registry = Registry.new(dbname, update_module=update_module)
# run test_file if provided
if test_file:
if config['test_file']:
test_file = config['test_file']
_logger.info('loading test file %s', test_file)
with odoo.api.Environment.manage():
if test_file.endswith('yml'):
@@ -905,6 +906,20 @@ def preload_registries(dbnames):
elif test_file.endswith('py'):
load_test_file_py(registry, test_file)
# run post-install tests
if config['test_enable']:
t0 = time.time()
t0_sql = odoo.sql_db.sql_counter
module_names = (registry.updated_modules if update_module else
registry._init_modules)
with odoo.api.Environment.manage():
for module_name in module_names:
result = run_unit_tests(module_name, registry.db_name,
position=runs_post_install)
registry._assertion_report.record_result(result)
_logger.info("All post-tested in %.2fs, %s queries",
time.time() - t0, odoo.sql_db.sql_counter - t0_sql)
if registry._assertion_report.failures:
rc += 1
except Exception:
+4 -5
View File
@@ -232,6 +232,7 @@ class RedirectHandler(urllib2.HTTPRedirectHandler):
class HttpCase(TransactionCase):
""" Transactional HTTP TestCase with url_open and phantomjs helpers.
"""
registry_test_mode = True
def __init__(self, methodName='runTest'):
super(HttpCase, self).__init__(methodName)
@@ -243,7 +244,9 @@ class HttpCase(TransactionCase):
def setUp(self):
super(HttpCase, self).setUp()
self.registry.enter_test_mode()
if self.registry_test_mode:
self.registry.enter_test_mode()
self.addCleanup(self.registry.leave_test_mode)
# setup a magic session_id that will be rollbacked
self.session = odoo.http.root.session_store.new()
self.session_id = self.session.sid
@@ -258,10 +261,6 @@ class HttpCase(TransactionCase):
self.opener.add_handler(RedirectHandler())
self.opener.addheaders.append(('Cookie', 'session_id=%s' % self.session_id))
def tearDown(self):
self.registry.leave_test_mode()
super(HttpCase, self).tearDown()
def url_open(self, url, data=None, timeout=10):
if url.startswith('/'):
url = "http://%s:%s%s" % (HOST, PORT, url)