This commit is contained in:
parent
43a909e17f
commit
7577dc2324
0
tests/__init__.py
Normal file
0
tests/__init__.py
Normal file
97
tests/common.py
Normal file
97
tests/common.py
Normal file
@ -0,0 +1,97 @@
|
||||
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 "",
|
||||
)
|
0
tests/data/addons/addon_success/__init__.py
Normal file
0
tests/data/addons/addon_success/__init__.py
Normal file
4
tests/data/addons/addon_success/__manifest__.py
Normal file
4
tests/data/addons/addon_success/__manifest__.py
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "addon with successful test",
|
||||
"version": "1.0.0",
|
||||
}
|
1
tests/data/addons/addon_success/tests/__init__.py
Normal file
1
tests/data/addons/addon_success/tests/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import test_success
|
6
tests/data/addons/addon_success/tests/test_success.py
Normal file
6
tests/data/addons/addon_success/tests/test_success.py
Normal file
@ -0,0 +1,6 @@
|
||||
from odoo.tests.common import TransactionCase
|
||||
|
||||
|
||||
class Test(TransactionCase):
|
||||
def test_success(self):
|
||||
pass
|
0
tests/data/addons/addon_warning/__init__.py
Normal file
0
tests/data/addons/addon_warning/__init__.py
Normal file
4
tests/data/addons/addon_warning/__manifest__.py
Normal file
4
tests/data/addons/addon_warning/__manifest__.py
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"name": "addon that generates warnings",
|
||||
"version": "1.0.0",
|
||||
}
|
1
tests/data/addons/addon_warning/tests/__init__.py
Normal file
1
tests/data/addons/addon_warning/tests/__init__.py
Normal file
@ -0,0 +1 @@
|
||||
from . import test_warning
|
9
tests/data/addons/addon_warning/tests/test_warning.py
Normal file
9
tests/data/addons/addon_warning/tests/test_warning.py
Normal file
@ -0,0 +1,9 @@
|
||||
import logging
|
||||
from odoo.tests.common import TransactionCase
|
||||
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
class Test(TransactionCase):
|
||||
def test_log_warning(self):
|
||||
_logger.warning("This is a warning")
|
0
tests/data/addons/addon_with_deb_dep/__init__.py
Normal file
0
tests/data/addons/addon_with_deb_dep/__init__.py
Normal file
8
tests/data/addons/addon_with_deb_dep/__manifest__.py
Normal file
8
tests/data/addons/addon_with_deb_dep/__manifest__.py
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"name": "addon_with_deb_dep",
|
||||
"summary": "Depends on 'nano' debian dependency.",
|
||||
"version": "1.0.0",
|
||||
"external_dependencies": {
|
||||
"deb": ["nano"],
|
||||
}
|
||||
}
|
0
tests/data/addons/addon_with_deb_dep2/__init__.py
Normal file
0
tests/data/addons/addon_with_deb_dep2/__init__.py
Normal file
11
tests/data/addons/addon_with_deb_dep2/__manifest__.py
Normal file
11
tests/data/addons/addon_with_deb_dep2/__manifest__.py
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "addon_with_deb_dep2",
|
||||
"summary": "Depends on 'curl' debian dependency, and on addon_with_deb_dep.",
|
||||
"version": "1.0.0",
|
||||
"depends": [
|
||||
"addon_with_deb_dep",
|
||||
],
|
||||
"external_dependencies": {
|
||||
"deb": ["curl"],
|
||||
}
|
||||
}
|
5
tests/data/addons/uninstallable_addon/__manifest__.py
Normal file
5
tests/data/addons/uninstallable_addon/__manifest__.py
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"name": "uninstallable_addon",
|
||||
"version": "1.0.0",
|
||||
"installable": False,
|
||||
}
|
20
tests/docker-compose.yml
Normal file
20
tests/docker-compose.yml
Normal file
@ -0,0 +1,20 @@
|
||||
services:
|
||||
test:
|
||||
image: registry.ethumada.com/odoo/odoo17co:latest
|
||||
# build:
|
||||
# context: ..
|
||||
# args:
|
||||
# codename: jammy
|
||||
# python_version: "3.10"
|
||||
# odoo_version: "16.0"
|
||||
volumes:
|
||||
- ..:/mnt/odoo
|
||||
working_dir: /mnt/odoo/tests
|
||||
depends_on:
|
||||
- postgres
|
||||
postgres:
|
||||
image: postgres
|
||||
environment:
|
||||
POSTGRES_USER: odoo
|
||||
POSTGRES_PASSWORD: odoo
|
||||
POSTGRES_DB: odoo
|
2
tests/requirements.txt
Normal file
2
tests/requirements.txt
Normal file
@ -0,0 +1,2 @@
|
||||
# test requirements
|
||||
pytest
|
16
tests/runtests.sh
Normal file
16
tests/runtests.sh
Normal file
@ -0,0 +1,16 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Run pytest on the tests directory,
|
||||
# which is assumed to be mounted somewhere in the docker image.
|
||||
|
||||
here=$(dirname $0)
|
||||
|
||||
testvenv=/tmp/testvenv
|
||||
/usr/bin/python3 -m venv $testvenv
|
||||
$testvenv/bin/pip install -r $here/requirements.txt
|
||||
|
||||
export PATH=$here/../bin:$PATH
|
||||
|
||||
$testvenv/bin/pytest --color=yes --ignore $here/data $here "$@"
|
19
tests/test_addons_path.py
Normal file
19
tests/test_addons_path.py
Normal file
@ -0,0 +1,19 @@
|
||||
import os
|
||||
import subprocess
|
||||
from pathlib import Path
|
||||
|
||||
from .common import install_test_addons
|
||||
|
||||
|
||||
def test_addons_path():
|
||||
"""Test must not fail where there are no installable addons."""
|
||||
assert (
|
||||
Path(os.environ["ODOO_RC"]).read_text()
|
||||
== "[options]\n"
|
||||
)
|
||||
with install_test_addons(["addon_success"]):
|
||||
assert (
|
||||
Path(os.environ["ODOO_RC"]).read_text()
|
||||
== "[options]\naddons_path=/opt/odoo/addons,.\n"
|
||||
)
|
||||
subprocess.check_call(["python", "-c", "import odoo.cli"])
|
26
tests/test_checklog.py
Normal file
26
tests/test_checklog.py
Normal file
@ -0,0 +1,26 @@
|
||||
import os
|
||||
import subprocess
|
||||
from .common import install_test_addons, dropdb, did_run_test_module
|
||||
|
||||
|
||||
def test_checklog_enabled():
|
||||
"""Test addon_warning with checklog enabled."""
|
||||
with install_test_addons(["addon_warning"]) as addons_dir:
|
||||
dropdb()
|
||||
subprocess.check_call(["oca_init_test_database"], cwd=addons_dir)
|
||||
os.environ["OCA_ENABLE_CHECKLOG_ODOO"] = "1"
|
||||
result = subprocess.run(
|
||||
["oca_run_tests"], cwd=addons_dir, text=True, capture_output=True
|
||||
)
|
||||
os.environ["OCA_ENABLE_CHECKLOG_ODOO"] = ""
|
||||
assert result.returncode == 1 and "Error: Errors detected in log." in result.stderr
|
||||
|
||||
def test_checklog_disabled():
|
||||
"""Test addon_warning with checklog disabled."""
|
||||
with install_test_addons(["addon_warning"]) as addons_dir:
|
||||
dropdb()
|
||||
subprocess.check_call(["oca_init_test_database"], cwd=addons_dir)
|
||||
result = subprocess.check_output(
|
||||
["oca_run_tests"], cwd=addons_dir, text=True
|
||||
)
|
||||
assert did_run_test_module(result, "addon_warning.tests.test_warning")
|
58
tests/test_list_addons_to_test_as_url_reqs.py
Normal file
58
tests/test_list_addons_to_test_as_url_reqs.py
Normal file
@ -0,0 +1,58 @@
|
||||
import subprocess
|
||||
import textwrap
|
||||
|
||||
from .common import make_addons_dir, make_addon_dist_name
|
||||
|
||||
|
||||
def test_oca_list_addons_to_test_as_url_reqs__basic():
|
||||
"""Basic successful test."""
|
||||
with make_addons_dir(
|
||||
["addon_success", "addon_with_deb_dep", "uninstallable_addon"]
|
||||
) as addons_dir:
|
||||
result = subprocess.check_output(
|
||||
["oca_list_addons_to_test_as_url_reqs"], cwd=addons_dir, text=True
|
||||
)
|
||||
assert result == textwrap.dedent(
|
||||
f"""\
|
||||
{make_addon_dist_name('addon_success')} @ {addons_dir.as_uri()}/addon_success
|
||||
{make_addon_dist_name('addon_with_deb_dep')} @ {addons_dir.as_uri()}/addon_with_deb_dep
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def test_oca_list_addons_to_test_as_url_reqs__editable():
|
||||
"""Basic successful test with editables."""
|
||||
with make_addons_dir(
|
||||
["addon_success", "addon_with_deb_dep", "uninstallable_addon"]
|
||||
) as addons_dir:
|
||||
result = subprocess.check_output(
|
||||
["oca_list_addons_to_test_as_url_reqs", "--editable"],
|
||||
cwd=addons_dir,
|
||||
text=True,
|
||||
)
|
||||
assert result == textwrap.dedent(
|
||||
f"""\
|
||||
-e {addons_dir.as_uri()}/addon_success#egg={make_addon_dist_name('addon_success')}
|
||||
-e {addons_dir.as_uri()}/addon_with_deb_dep#egg={make_addon_dist_name('addon_with_deb_dep')}
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
def test_oca_list_addons_to_test_as_url_reqs__skip_test_requirement():
|
||||
"""Basic successful test."""
|
||||
with make_addons_dir(
|
||||
["addon_success", "addon_with_deb_dep", "uninstallable_addon"]
|
||||
) as addons_dir:
|
||||
# add URL reference to addon_success
|
||||
addons_dir.joinpath("test-requirements.txt").write_text(
|
||||
f"{make_addon_dist_name('addon_success')} @ git+https://github.com/oca/dummy@refs/pull/123/head"
|
||||
)
|
||||
result = subprocess.check_output(
|
||||
["oca_list_addons_to_test_as_url_reqs"], cwd=addons_dir, text=True
|
||||
)
|
||||
# addon_success should not be in result because it is already in test-requirements.txt
|
||||
assert result == textwrap.dedent(
|
||||
f"""\
|
||||
{make_addon_dist_name('addon_with_deb_dep')} @ {addons_dir.as_uri()}/addon_with_deb_dep
|
||||
"""
|
||||
)
|
24
tests/test_list_external_dependencies.py
Normal file
24
tests/test_list_external_dependencies.py
Normal file
@ -0,0 +1,24 @@
|
||||
from pathlib import Path
|
||||
import os
|
||||
import subprocess
|
||||
from .common import make_addons_dir, preserve_odoo_rc
|
||||
|
||||
|
||||
def test_list_external_dependencies():
|
||||
with make_addons_dir(["addon_with_deb_dep"]) as addons_dir:
|
||||
res = subprocess.check_output(
|
||||
["oca_list_external_dependencies", "deb"], cwd=addons_dir
|
||||
)
|
||||
assert res == b"nano\n"
|
||||
|
||||
|
||||
def test_list_external_dependencies_transitive():
|
||||
"""Test that transitive external dependencies are returned."""
|
||||
with preserve_odoo_rc(), make_addons_dir(
|
||||
["addon_with_deb_dep"]
|
||||
) as dep_addons_dir, make_addons_dir(["addon_with_deb_dep2"]) as addons_dir:
|
||||
Path(os.getenv("ODOO_RC")).write_text(f"[options]\naddons_path={dep_addons_dir}\n")
|
||||
res = subprocess.check_output(
|
||||
["oca_list_external_dependencies", "deb"], cwd=addons_dir
|
||||
)
|
||||
assert res == b"curl\nnano\n"
|
9
tests/test_no_addons.py
Normal file
9
tests/test_no_addons.py
Normal file
@ -0,0 +1,9 @@
|
||||
import subprocess
|
||||
from .common import install_test_addons
|
||||
|
||||
|
||||
def test_no_addons():
|
||||
"""Test must not fail where there are no installable addons."""
|
||||
with install_test_addons(["uninstallable_addon"]) as addons_dir:
|
||||
# no need to initialize test database because tests will not be attempted
|
||||
subprocess.check_call(["oca_run_tests"], cwd=addons_dir)
|
83
tests/test_oca_git_push_if_remote_did_not_change.py
Normal file
83
tests/test_oca_git_push_if_remote_did_not_change.py
Normal file
@ -0,0 +1,83 @@
|
||||
from pathlib import Path
|
||||
import subprocess
|
||||
|
||||
import pytest
|
||||
|
||||
|
||||
@pytest.fixture(scope="module")
|
||||
def repo_dir(tmp_path_factory) -> str:
|
||||
repo_path = tmp_path_factory.mktemp("repo")
|
||||
subprocess.check_call(["git", "init"], cwd=repo_path)
|
||||
subprocess.check_call(
|
||||
["git", "config", "user.email", "test@example.com"],
|
||||
cwd=repo_path,
|
||||
)
|
||||
subprocess.check_call(
|
||||
["git", "config", "user.name", "test"],
|
||||
cwd=repo_path,
|
||||
)
|
||||
(repo_path / "README").touch()
|
||||
subprocess.check_call(["git", "add", "."], cwd=repo_path)
|
||||
subprocess.check_call(["git", "commit", "-m", "initial commit"], cwd=repo_path)
|
||||
bare_repo_path = tmp_path_factory.mktemp("bare_repo")
|
||||
subprocess.check_call(
|
||||
["git", "clone", "--bare", str(repo_path), str(bare_repo_path)]
|
||||
)
|
||||
return str(bare_repo_path)
|
||||
|
||||
|
||||
@pytest.fixture()
|
||||
def git_clone_path(repo_dir: str, tmp_path) -> Path:
|
||||
clone_path = tmp_path / "clone"
|
||||
subprocess.check_call(
|
||||
["git", "clone", "--depth=1", "file://" + repo_dir, str(clone_path)]
|
||||
)
|
||||
subprocess.check_call(
|
||||
["git", "config", "user.email", "test@example.com"],
|
||||
cwd=clone_path,
|
||||
)
|
||||
subprocess.check_call(
|
||||
["git", "config", "user.name", "test"],
|
||||
cwd=clone_path,
|
||||
)
|
||||
return clone_path
|
||||
|
||||
|
||||
def test_no_change(git_clone_path: Path):
|
||||
output = subprocess.check_output(
|
||||
["oca_git_push_if_remote_did_not_change", "origin"],
|
||||
cwd=git_clone_path,
|
||||
text=True,
|
||||
)
|
||||
assert "No local change to push" in output
|
||||
|
||||
|
||||
def test_local_change(git_clone_path: Path):
|
||||
(git_clone_path / "local-change-1").touch()
|
||||
subprocess.check_call(["git", "add", "."], cwd=git_clone_path)
|
||||
subprocess.check_call(["git", "commit", "-m", "local-change-1"], cwd=git_clone_path)
|
||||
output = subprocess.check_output(
|
||||
["oca_git_push_if_remote_did_not_change", "origin"],
|
||||
cwd=git_clone_path,
|
||||
text=True,
|
||||
)
|
||||
assert "Pushing changes" in output
|
||||
|
||||
|
||||
def test_remote_change(git_clone_path: Path):
|
||||
# push a change and reset
|
||||
(git_clone_path / "remote-change").touch()
|
||||
subprocess.check_call(["git", "add", "."], cwd=git_clone_path)
|
||||
subprocess.check_call(["git", "commit", "-m", "remote-change"], cwd=git_clone_path)
|
||||
subprocess.check_call(["git", "push"], cwd=git_clone_path)
|
||||
subprocess.check_call(["git", "reset", "--hard", "HEAD^"], cwd=git_clone_path)
|
||||
# create a local change
|
||||
(git_clone_path / "local-change-2").touch()
|
||||
subprocess.check_call(["git", "add", "."], cwd=git_clone_path)
|
||||
subprocess.check_call(["git", "commit", "-m", "local-change-2"], cwd=git_clone_path)
|
||||
output = subprocess.check_output(
|
||||
["oca_git_push_if_remote_did_not_change", "origin"],
|
||||
cwd=git_clone_path,
|
||||
text=True,
|
||||
)
|
||||
assert "Remote has evolved since we cloned, not pushing" in output
|
76
tests/test_preinstalled.py
Normal file
76
tests/test_preinstalled.py
Normal file
@ -0,0 +1,76 @@
|
||||
"""Various test that the Dockerfile did what the README promises."""
|
||||
|
||||
import os
|
||||
import shutil
|
||||
import subprocess
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
|
||||
from .common import odoo_bin, make_addons_dir
|
||||
|
||||
|
||||
def test_odoo_bin_in_path():
|
||||
assert shutil.which(odoo_bin)
|
||||
|
||||
|
||||
def test_wkhtomtopdf_in_path():
|
||||
assert shutil.which("wkhtmltopdf")
|
||||
|
||||
|
||||
def test_python_in_path():
|
||||
assert shutil.which("python")
|
||||
assert Path(shutil.which("python")).parent == Path(shutil.which(odoo_bin)).parent
|
||||
|
||||
|
||||
def test_pip_in_path():
|
||||
assert shutil.which("pip")
|
||||
assert Path(shutil.which("pip")).parent == Path(shutil.which(odoo_bin)).parent
|
||||
|
||||
|
||||
def test_addons_dir():
|
||||
assert os.environ["ADDONS_DIR"] == "."
|
||||
|
||||
|
||||
def test_odoo_rc():
|
||||
odoo_rc = Path(os.environ["ODOO_RC"])
|
||||
assert odoo_rc.exists()
|
||||
assert odoo_rc.read_text() == "[options]\n"
|
||||
|
||||
|
||||
def test_openerp_server_rc():
|
||||
assert os.environ["OPENERP_SERVER"] == os.environ["ODOO_RC"]
|
||||
|
||||
|
||||
def test_import_odoo():
|
||||
subprocess.check_call(["python", "-c", "import odoo; odoo.addons.__path__"])
|
||||
subprocess.check_call(["python", "-c", "import odoo.cli"])
|
||||
|
||||
|
||||
def _target_python_version():
|
||||
version = subprocess.check_output(
|
||||
["python", "-c", "import platform; print(platform.python_version())"],
|
||||
universal_newlines=True,
|
||||
)
|
||||
major, minor = version.split(".")[:2]
|
||||
return int(major), int(minor)
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
_target_python_version() < (3, 7), reason="Whool requires python3.7 or higher"
|
||||
)
|
||||
def test_import_odoo_after_addon_install():
|
||||
with make_addons_dir(["addon_success"]) as addons_dir:
|
||||
addon_dir = addons_dir / "addon_success"
|
||||
subprocess.check_call(["git", "init"], cwd=addon_dir)
|
||||
subprocess.check_call(["git", "add", "."], cwd=addon_dir)
|
||||
subprocess.check_call(["git", "config", "user.email", "..."], cwd=addon_dir)
|
||||
subprocess.check_call(
|
||||
["git", "config", "user.name", "me@example.com"], cwd=addon_dir
|
||||
)
|
||||
subprocess.check_call(["git", "commit", "-m", "..."], cwd=addon_dir)
|
||||
subprocess.check_call(
|
||||
["python", "-m", "pip", "install", addons_dir / "addon_success"]
|
||||
)
|
||||
subprocess.check_call(["python", "-c", "import odoo.cli"])
|
13
tests/test_success.py
Normal file
13
tests/test_success.py
Normal file
@ -0,0 +1,13 @@
|
||||
import subprocess
|
||||
from .common import install_test_addons, dropdb, did_run_test_module
|
||||
|
||||
|
||||
def test_success():
|
||||
"""Basic successful test."""
|
||||
with install_test_addons(["addon_success"]) as addons_dir:
|
||||
dropdb()
|
||||
subprocess.check_call(["oca_init_test_database"], cwd=addons_dir)
|
||||
result = subprocess.check_output(
|
||||
["oca_run_tests"], cwd=addons_dir, text=True
|
||||
)
|
||||
assert did_run_test_module(result, "addon_success.tests.test_success")
|
Loading…
x
Reference in New Issue
Block a user