98 lines
2.9 KiB
Python
98 lines
2.9 KiB
Python
import ast
|
|
import contextlib
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import tempfile
|
|
import textwrap
|
|
from pathlib import Path
|
|
|
|
ODOO_VENV = "/opt/odoo-venv"
|
|
|
|
test_addons_dir = Path(__file__).parent / "data" / "addons"
|
|
|
|
odoo_version_info = tuple(map(int, os.environ["ODOO_VERSION"].split(".")))
|
|
|
|
odoo_bin = "odoo"
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def preserve_odoo_rc():
|
|
odoo_rc_path = Path(os.environ["ODOO_RC"])
|
|
odoo_rc = odoo_rc_path.read_bytes()
|
|
try:
|
|
yield
|
|
finally:
|
|
odoo_rc_path.write_bytes(odoo_rc)
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def preserve_odoo_venv():
|
|
subprocess.check_call(["cp", "-arl", ODOO_VENV, ODOO_VENV + ".org"])
|
|
try:
|
|
yield
|
|
finally:
|
|
subprocess.check_call(["rm", "-r", ODOO_VENV])
|
|
subprocess.check_call(["mv", ODOO_VENV + ".org", ODOO_VENV])
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def make_addons_dir(test_addons):
|
|
"""Copy test addons to a temporary directory.
|
|
|
|
Adjust the addons version to match the Odoo version being tested.
|
|
Rename __manifest__.py to __openerp__.py for older Odoo versions.
|
|
Add pyproject.toml.
|
|
"""
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
|
tmppath = Path(tmpdir)
|
|
for addon_name in test_addons:
|
|
shutil.copytree(test_addons_dir / addon_name, tmppath / addon_name)
|
|
# prefix Odoo version
|
|
manifest_path = tmppath / addon_name / "__manifest__.py"
|
|
manifest = ast.literal_eval(manifest_path.read_text())
|
|
manifest["version"] = os.environ["ODOO_VERSION"] + "." + manifest["version"]
|
|
manifest_path.write_text(repr(manifest))
|
|
if odoo_version_info < (10, 0):
|
|
manifest_path.rename(manifest_path.parent / "__openerp__.py")
|
|
pyproject_toml_path = tmppath / addon_name / "pyproject.toml"
|
|
pyproject_toml_path.write_text(
|
|
textwrap.dedent(
|
|
"""\
|
|
[build-system]
|
|
requires = ["whool"]
|
|
build-backend = "whool.buildapi"
|
|
"""
|
|
)
|
|
)
|
|
yield tmppath
|
|
|
|
|
|
@contextlib.contextmanager
|
|
def install_test_addons(test_addons):
|
|
with preserve_odoo_rc(), preserve_odoo_venv(), make_addons_dir(
|
|
test_addons
|
|
) as addons_dir:
|
|
subprocess.check_call(["oca_install_addons"], cwd=addons_dir)
|
|
yield addons_dir
|
|
|
|
|
|
def dropdb():
|
|
subprocess.check_call(["dropdb", "--if-exists", os.environ["PGDATABASE"]])
|
|
|
|
|
|
def did_run_test_module(output, test_module):
|
|
"""Check that a test did run by looking in the Odoo log.
|
|
|
|
test_module is the full name of the test (addon_name.tests.test_module).
|
|
"""
|
|
return "odoo.addons." + test_module in output
|
|
|
|
|
|
def make_addon_dist_name(addon_name):
|
|
odoo_series = int(os.getenv("ODOO_VERSION").partition(".")[0])
|
|
return "odoo{odoo_series}-addon-{name}".format(
|
|
name=addon_name,
|
|
odoo_series=odoo_series if odoo_series < 15 else "",
|
|
)
|