diff --git a/.gitignore b/.gitignore index a089cd9..11d68a4 100644 --- a/.gitignore +++ b/.gitignore @@ -4,5 +4,6 @@ __pycache__ .tox .coverage .pytest_cache -/tests/output/* +/tests/data/output/* log/ +_auto_generated_odoo.cfg diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c555c71..5f9e7a2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -49,11 +49,14 @@ pytest: tests/cli_02_get_code_test.py tests/cli_03_docker_build_test.py tests/cli_04_run_test.py + tests/cli_05_execute_script_python_test.py tests/cli_06_execute_script_sql_test.py - # Disabled : calling OdooRPC on mounted container - # in a container (gitlab) does'nt seems to work. + tests/cli_07_upgrade_test.py - # - poetry run pytest --verbose --verbose tests/cli_05_execute_script_python_test.py - # - poetry run pytest --verbose --verbose - # - poetry run pytest --verbose --verbose tests/cli_07_upgrade_test.py - # - poetry run pytest --verbose --verbose tests/cli_08_generate_module_analysis_test.py + # Disabled test on gitlab-ci : + # The following tests should work locally but doesn't on gitlab-ci + # because calling OdooRPC on mounted container + # in a container (gitlab) doesn't work. + + # tests/cli_20_install_from_csv_test.py + # tests/cli_21_generate_module_analysis_test.py diff --git a/odoo_openupgrade_wizard/cli_execute_script_python.py b/odoo_openupgrade_wizard/cli_execute_script_python.py index 4a9b0c2..62e3cdc 100644 --- a/odoo_openupgrade_wizard/cli_execute_script_python.py +++ b/odoo_openupgrade_wizard/cli_execute_script_python.py @@ -7,9 +7,7 @@ from odoo_openupgrade_wizard.cli_options import ( get_migration_step_from_options, step_option, ) -from odoo_openupgrade_wizard.tools_odoo import ( - execute_python_files_post_migration, -) +from odoo_openupgrade_wizard.tools_odoo import execute_click_odoo_python_files @click.command() @@ -21,7 +19,6 @@ from odoo_openupgrade_wizard.tools_odoo import ( type=click.Path( exists=True, dir_okay=False, - resolve_path=True, ), help="List of python files that will be executed, replacing the default" " scripts placed in the migration step folder.", @@ -30,6 +27,6 @@ from odoo_openupgrade_wizard.tools_odoo import ( def execute_script_python(ctx, step, database, script_file_path): migration_step = get_migration_step_from_options(ctx, step) - execute_python_files_post_migration( + execute_click_odoo_python_files( ctx, database, migration_step, [Path(x) for x in script_file_path] ) diff --git a/odoo_openupgrade_wizard/cli_execute_script_sql.py b/odoo_openupgrade_wizard/cli_execute_script_sql.py index 693b3b4..23a2129 100644 --- a/odoo_openupgrade_wizard/cli_execute_script_sql.py +++ b/odoo_openupgrade_wizard/cli_execute_script_sql.py @@ -21,7 +21,6 @@ from odoo_openupgrade_wizard.tools_postgres import ( type=click.Path( exists=True, dir_okay=False, - resolve_path=True, ), help="List of SQL files that will be executed, replacing the default" " scripts placed in the migration step folder.", diff --git a/odoo_openupgrade_wizard/cli_upgrade.py b/odoo_openupgrade_wizard/cli_upgrade.py index a9a149b..f4a9b37 100644 --- a/odoo_openupgrade_wizard/cli_upgrade.py +++ b/odoo_openupgrade_wizard/cli_upgrade.py @@ -8,7 +8,7 @@ from odoo_openupgrade_wizard.cli_options import ( last_step_option, ) from odoo_openupgrade_wizard.tools_odoo import ( - execute_python_files_post_migration, + execute_click_odoo_python_files, kill_odoo, run_odoo, ) @@ -38,4 +38,4 @@ def upgrade(ctx, first_step, last_step, database): logger.info("Received Keyboard Interrupt or System Exiting...") finally: kill_odoo(ctx, migration_step) - execute_python_files_post_migration(ctx, database, migration_step) + execute_click_odoo_python_files(ctx, database, migration_step) diff --git a/odoo_openupgrade_wizard/configuration_version_dependant.py b/odoo_openupgrade_wizard/configuration_version_dependant.py index 8734001..3e1df4d 100644 --- a/odoo_openupgrade_wizard/configuration_version_dependant.py +++ b/odoo_openupgrade_wizard/configuration_version_dependant.py @@ -120,7 +120,7 @@ def skip_addon_path(migration_step: dict, path: Path) -> bool: ) and migration_step["release"] < 14.0 -def get_server_wide_modules_upgrade(migration_step: dict) -> str: +def get_server_wide_modules_upgrade(migration_step: dict) -> list: """return a list of modules to load, depending on the migration step.""" if ( migration_step["release"] >= 14.0 diff --git a/odoo_openupgrade_wizard/templates.py b/odoo_openupgrade_wizard/templates.py index 994e2a5..6161832 100644 --- a/odoo_openupgrade_wizard/templates.py +++ b/odoo_openupgrade_wizard/templates.py @@ -71,6 +71,7 @@ PYTHON_REQUIREMENTS_TXT_TEMPLATE = """ {{ python_librairy }} {% endfor %} odoorpc +click-odoo """ DEBIAN_REQUIREMENTS_TXT_TEMPLATE = """ @@ -111,8 +112,13 @@ USER odoo PRE_MIGRATION_SQL_TEMPLATE = "" POST_MIGRATION_PY_TEMPLATE = """ -def main(self): - pass +import logging + +_logger = logging.getLogger(__name__) +_logger.info("Executing post-migration.py script ...") + +env = env # noqa: F821 + """ GIT_IGNORE_CONTENT = """ @@ -123,6 +129,5 @@ GIT_IGNORE_CONTENT = """ MODULES_CSV_TEMPLATE = """ base,Base account,Account Module -product,Product web_responsive,Web Responsive Module """ diff --git a/odoo_openupgrade_wizard/tools_odoo.py b/odoo_openupgrade_wizard/tools_odoo.py index 69af808..c2c2b76 100644 --- a/odoo_openupgrade_wizard/tools_odoo.py +++ b/odoo_openupgrade_wizard/tools_odoo.py @@ -1,4 +1,4 @@ -import importlib.util +import configparser import os import sys import traceback @@ -15,7 +15,6 @@ from odoo_openupgrade_wizard.configuration_version_dependant import ( skip_addon_path, ) from odoo_openupgrade_wizard.tools_docker import kill_container, run_container -from odoo_openupgrade_wizard.tools_odoo_instance import OdooInstance from odoo_openupgrade_wizard.tools_postgres import get_postgres_container from odoo_openupgrade_wizard.tools_system import get_script_folder @@ -76,13 +75,6 @@ def get_odoo_version_from_migration_step(ctx, migration_step: dict) -> dict: raise Exception -def get_server_wide_modules(ctx, migration_step: dict) -> str: - # TODO, read from odoo.cfg file, the key server_wide_modules - modules = [] - modules += get_server_wide_modules_upgrade(migration_step) - return modules - - def generate_odoo_command( ctx, migration_step: dict, @@ -93,22 +85,12 @@ def generate_odoo_command( shell: bool, demo: bool, ) -> str: - addons_path = get_odoo_addons_path(ctx, Path("/odoo_env"), migration_step) - server_wide_modules = get_server_wide_modules(ctx, migration_step) - server_wide_modules_cmd = ( - server_wide_modules - and "--load %s" % ",".join(server_wide_modules) - or "" - ) database_cmd = database and "--database %s" % database or "" update_cmd = update and "--update %s" % update or "" init_cmd = init and "--init %s" % init or "" stop_after_init_cmd = stop_after_init and "--stop-after-init" or "" shell_cmd = shell and "shell" or "" demo_cmd = not demo and "--without-demo all" or "" - log_file = "/env/log/{}____{}.log".format( - ctx.obj["log_prefix"], migration_step["complete_name"] - ) command = ( Path("/odoo_env") / Path(get_odoo_folder(migration_step)) @@ -117,16 +99,7 @@ def generate_odoo_command( result = ( f" {command}" f" {shell_cmd}" - f" --db_host db" - f" --db_port 5432" - f" --db_user odoo" - f" --db_password odoo" - f" --workers 0" - f" --config /odoo_env/odoo.cfg" - f" --data-dir /env/filestore/" - f" --logfile {log_file}" - f" --addons-path {addons_path}" - f" {server_wide_modules_cmd}" + f" --config /odoo_env/_auto_generated_odoo.cfg" f" {demo_cmd}" f" {database_cmd}" f" {update_cmd}" @@ -136,6 +109,52 @@ def generate_odoo_command( return result +def generate_odoo_config_file(ctx, migration_step, log_file): + """Create a config file name _auto_generated_odoo.cfg + in the according environment (defined by migration_step) + This configuration file is a merge of the odoo.cfg file that can + contain custom values, and the values required to run the docker container. + """ + odoo_version = get_odoo_version_from_migration_step(ctx, migration_step) + odoo_env_path = get_odoo_env_path(ctx, odoo_version) + + custom_odoo_config_file = odoo_env_path / "odoo.cfg" + auto_generated_odoo_config_file = ( + odoo_env_path / "_auto_generated_odoo.cfg" + ) + + parser = configparser.RawConfigParser() + # Read custom file + parser.read(custom_odoo_config_file) + + # compute addons_path + addons_path = get_odoo_addons_path(ctx, Path("/odoo_env"), migration_step) + + # compute server wides modules + server_wide_modules = parser.get( + "options", "server_wide_modules", fallback=[] + ) + server_wide_modules += get_server_wide_modules_upgrade(migration_step) + + # Add required keys + if "options" not in parser: + parser.add_section("options") + parser.set("options", "db_host", "db") + parser.set("options", "db_port", 5432) + parser.set("options", "db_user", "odoo") + parser.set("options", "db_password", "odoo") + parser.set("options", "workers", 0) + parser.set("options", "data_dir", "/env/filestore/") + parser.set("options", "logfile", log_file) + parser.set("options", "addons_path", addons_path) + if server_wide_modules: + parser.set( + "options", "server_wide_modules", ",".join(server_wide_modules) + ) + + parser.write(open(auto_generated_odoo_config_file, "w")) + + def run_odoo( ctx, migration_step: dict, @@ -169,6 +188,10 @@ def run_odoo( odoo_version = get_odoo_version_from_migration_step(ctx, migration_step) env_path = ctx.obj["env_folder_path"] odoo_env_path = get_odoo_env_path(ctx, odoo_version) + log_file = "/env/log/{}____{}.log".format( + ctx.obj["log_prefix"], migration_step["complete_name"] + ) + generate_odoo_config_file(ctx, migration_step, log_file) command = generate_odoo_command( ctx, @@ -208,52 +231,69 @@ def kill_odoo(ctx, migration_step: dict): kill_container(get_docker_container_name(ctx, migration_step)) -def execute_python_files_post_migration( +def execute_click_odoo_python_files( ctx, database: str, migration_step: dict, python_files: list = [] ): - if not python_files: - script_folder = get_script_folder(ctx, migration_step) + if not python_files: + # Get post-migration python scripts to execute + script_folder = get_script_folder(ctx, migration_step) python_files = [ - script_folder / Path(f) + Path("scripts") / Path(migration_step["complete_name"]) / Path(f) for f in os.listdir(script_folder) if os.path.isfile(os.path.join(script_folder, f)) and f[-3:] == ".py" ] python_files = sorted(python_files) - try: - # Launch Odoo - run_odoo( - ctx, - migration_step, - detached_container=True, + # Prepare data information for docker + odoo_version = get_odoo_version_from_migration_step(ctx, migration_step) + links = {ctx.obj["config"]["postgres_container_name"]: "db"} + env_path = ctx.obj["env_folder_path"] + odoo_env_path = get_odoo_env_path(ctx, odoo_version) + + # Generate odoo config file + log_file = "/env/log/{}____{}__post_migration.log".format( + ctx.obj["log_prefix"], migration_step["complete_name"] + ) + generate_odoo_config_file(ctx, migration_step, log_file) + + for python_file in python_files: + # TODO, check if we should set python2 for old version of Odoo + # or just 'python' + command = ( + "click-odoo" + " --database {database}" + " --config /odoo_env/_auto_generated_odoo.cfg" + " /env/{python_file}" + ).format( database=database, + python_file=str(python_file), ) - - # Create Odoo instance via Odoo RPC - odoo_instance = OdooInstance(ctx, database) - - for python_file in python_files: - # Generate Python Script - - logger.info("Running Script Post (Python) %s" % python_file) - package_name = "script.%s.%s" % ( - migration_step["complete_name"], - python_file.name[:-3], + try: + logger.info( + "Executing script %s / %s" + % (migration_step["complete_name"], python_file) ) - module_spec = importlib.util.spec_from_file_location( - package_name, python_file + run_container( + get_docker_image_tag(ctx, odoo_version), + get_docker_container_name(ctx, migration_step), + command=command, + ports={}, + volumes={ + env_path: "/env/", + odoo_env_path: "/odoo_env/", + }, + links=links, + detach=False, + auto_remove=True, ) - module = importlib.util.module_from_spec(module_spec) - module_spec.loader.exec_module(module) - - module.main(odoo_instance) - except Exception as e: - logger.error( - "An error occured. Exiting. %s\n%s" - % (e, traceback.print_exception(*sys.exc_info())) - ) - raise e - finally: - kill_odoo(ctx, migration_step) + except Exception as e: + traceback.print_exc() + logger.error( + "An error occured. Exiting. %s\n%s" + % (e, traceback.print_exception(*sys.exc_info())) + ) + raise e + finally: + kill_odoo(ctx, migration_step) diff --git a/odoo_openupgrade_wizard/tools_system.py b/odoo_openupgrade_wizard/tools_system.py index 6e4cfda..5d1800a 100644 --- a/odoo_openupgrade_wizard/tools_system.py +++ b/odoo_openupgrade_wizard/tools_system.py @@ -80,7 +80,7 @@ def git_aggregate(folder_path: Path, config_path: Path): do_push=False, expand_env=False, env_file=None, - force=False, + force=True, ) with working_directory_keeper: os.chdir(folder_path) diff --git a/pytest.ini b/pytest.ini index 817daed..592b643 100644 --- a/pytest.ini +++ b/pytest.ini @@ -1,2 +1,2 @@ [pytest] -norecursedirs = tests/output/* +norecursedirs=tests/data/* diff --git a/tests/__init__.py b/tests/__init__.py index 4c6f984..ac9fe29 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1,8 +1,10 @@ import logging +import os from pathlib import Path import yaml from click.testing import CliRunner +from plumbum.cmd import mkdir from odoo_openupgrade_wizard.cli import main @@ -13,6 +15,19 @@ def assert_result_cli_invoke(result): pass +def move_to_test_folder(): + """function to call at the beginning at the tests + to change the current working directory. + Note : this function is idempotens, to avoid to generate errors + if many tests scripts are executed. + """ + if os.getcwd().endswith("tests/data/output"): + return + test_folder_path = Path("tests/data/output") + mkdir([test_folder_path, "--parents"]) + os.chdir(test_folder_path) + + def cli_runner_invoke(cmd): result = CliRunner().invoke( main, @@ -25,7 +40,9 @@ def cli_runner_invoke(cmd): assert result.exit_code == 0 -def build_ctx_from_config_file(env_folder_path) -> dict: +def build_ctx_from_config_file() -> dict: + env_folder_path = Path(".") + class context: pass diff --git a/tests/cli_01_init_test.py b/tests/cli_01_init_test.py index 12eb10c..01820ff 100644 --- a/tests/cli_01_init_test.py +++ b/tests/cli_01_init_test.py @@ -1,20 +1,16 @@ import filecmp from pathlib import Path -from plumbum.cmd import mkdir - -from . import cli_runner_invoke +from . import cli_runner_invoke, move_to_test_folder def test_cli_init(): - output_folder_path = Path("./tests/output").absolute() - expected_folder_path = Path("./tests/output_expected").absolute() - mkdir([output_folder_path, "--parents"]) + move_to_test_folder() + expected_folder_path = Path("../output_expected").absolute() cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "init", "--project-name=test-cli", "--initial-release=13.0", @@ -24,6 +20,6 @@ def test_cli_init(): ) assert filecmp.cmp( - output_folder_path / Path("config.yml"), + Path("config.yml"), expected_folder_path / Path("config.yml"), ) diff --git a/tests/cli_02_get_code_test.py b/tests/cli_02_get_code_test.py index 04579b4..aaf6ec5 100644 --- a/tests/cli_02_get_code_test.py +++ b/tests/cli_02_get_code_test.py @@ -1,31 +1,25 @@ from pathlib import Path -from . import cli_runner_invoke +from . import cli_runner_invoke, move_to_test_folder def test_cli_get_code(): - output_folder_path = Path("./tests/output").absolute() - + move_to_test_folder() cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "get-code", ] ) # Check V13 - openupgrade_path = output_folder_path / Path( - "./src/env_13.0/src/openupgrade" - ) + openupgrade_path = Path("./src/env_13.0/src/openupgrade") assert openupgrade_path.exists() assert (openupgrade_path / Path("odoo")).exists() # check V14 - openupgrade_path = output_folder_path / Path( - "./src/env_14.0/src/openupgrade" - ) + openupgrade_path = Path("./src/env_14.0/src/openupgrade") assert openupgrade_path.exists() diff --git a/tests/cli_03_docker_build_test.py b/tests/cli_03_docker_build_test.py index 00e26db..e0b026b 100644 --- a/tests/cli_03_docker_build_test.py +++ b/tests/cli_03_docker_build_test.py @@ -1,17 +1,13 @@ -from pathlib import Path - from odoo_openupgrade_wizard.tools_docker import get_docker_client -from . import cli_runner_invoke +from . import cli_runner_invoke, move_to_test_folder def test_cli_docker_build(): - output_folder_path = Path("./tests/output").absolute() - + move_to_test_folder() cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "docker-build", "--releases=13.0,14.0", ] diff --git a/tests/cli_04_run_test.py b/tests/cli_04_run_test.py index 0024179..e05fc01 100644 --- a/tests/cli_04_run_test.py +++ b/tests/cli_04_run_test.py @@ -3,17 +3,19 @@ from pathlib import Path from odoo_openupgrade_wizard.tools_docker import get_docker_client from odoo_openupgrade_wizard.tools_postgres import execute_sql_request -from . import build_ctx_from_config_file, cli_runner_invoke +from . import ( + build_ctx_from_config_file, + cli_runner_invoke, + move_to_test_folder, +) def test_cli_run(): - output_folder_path = Path("./tests/output").absolute() - ctx = build_ctx_from_config_file(output_folder_path) - db_name = "database_test_cli_run" + move_to_test_folder() + db_name = "database_test_cli___run" cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "run", "--step=1", "--database=%s" % db_name, @@ -23,12 +25,11 @@ def test_cli_run(): ) # Ensure that a subfolder filestore/DB_NAME has been created - db_filestore_path = output_folder_path / Path( - "./filestore/filestore/%s" % db_name - ) + db_filestore_path = Path("./filestore/filestore/%s" % db_name) assert db_filestore_path.exists() # Ensure that 'base' module is installed + ctx = build_ctx_from_config_file() request = ( "SELECT id" " FROM ir_module_module" diff --git a/tests/cli_05_execute_script_python_test.py b/tests/cli_05_execute_script_python_test.py index cc63f42..b5547b6 100644 --- a/tests/cli_05_execute_script_python_test.py +++ b/tests/cli_05_execute_script_python_test.py @@ -1,38 +1,58 @@ from pathlib import Path -from . import cli_runner_invoke +from plumbum.cmd import cp + +from odoo_openupgrade_wizard.tools_postgres import execute_sql_request + +from . import ( + build_ctx_from_config_file, + cli_runner_invoke, + move_to_test_folder, +) def test_cli_execute_script_python(): - output_folder_path = Path("./tests/output").absolute() + move_to_test_folder() + extra_script_path = Path("../extra_script/click_odoo_test.py").absolute() + cp( + extra_script_path, + Path("click_odoo_test.py"), + ) - extra_script_path = Path( - "./tests/extra_script/post-migration-custom_test.py" - ).absolute() + db_name = "database_test_cli___execute_script_python" - db_name = "database_test_cli_execute_script_python" - - # Install Odoo on V13 with product installed + # Install Odoo on V13 with base installed cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "run", "--step=1", "--database=%s" % db_name, - "--init-modules=product", + "--init-modules=base", "--stop-after-init", ] ) + # Compute partners quantity + ctx = build_ctx_from_config_file() + request = "SELECT count(*)" " FROM res_partner;" + partner_quantity_before = int( + execute_sql_request(ctx, request, database=db_name)[0][0] + ) + + # Execute Custom Python Script cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "execute-script-python", "--step=1", "--database=%s" % db_name, - "--script-file-path=%s" % extra_script_path, + "--script-file-path=click_odoo_test.py", ] ) - # TODO, add manually script + partner_quantity_after = int( + execute_sql_request(ctx, request, database=db_name)[0][0] + ) + + # Ensure that partners have been created by click_odoo_test.py + assert partner_quantity_after == (partner_quantity_before + 10) diff --git a/tests/cli_06_execute_script_sql_test.py b/tests/cli_06_execute_script_sql_test.py index e83a59d..932b7a2 100644 --- a/tests/cli_06_execute_script_sql_test.py +++ b/tests/cli_06_execute_script_sql_test.py @@ -1,32 +1,40 @@ -import shutil from pathlib import Path +from plumbum.cmd import cp + from odoo_openupgrade_wizard.tools_postgres import ( ensure_database, execute_sql_request, ) -from . import build_ctx_from_config_file, cli_runner_invoke +from . import ( + build_ctx_from_config_file, + cli_runner_invoke, + move_to_test_folder, +) def test_cli_execute_script_sql(): - output_folder_path = Path("./tests/output").absolute() - + move_to_test_folder() extra_script_path = Path( - "./tests/extra_script/pre-migration-custom_test.sql" + "../extra_script/pre-migration-custom_test.sql" ).absolute() - destination_path = output_folder_path / "scripts/step_01__update__13.0" - shutil.copy(extra_script_path, destination_path) - ctx = build_ctx_from_config_file(output_folder_path) - db_name = "database_test_cli_execute_script_sql" + # Deploy SQL Script + destination_path = Path("scripts/step_01__update__13.0") + cp([extra_script_path, destination_path]) + ctx = build_ctx_from_config_file() + + # Reset database + db_name = "database_test_cli___execute_script_sql" ensure_database(ctx, db_name, state="absent") ensure_database(ctx, db_name, state="present") + # TODO call with script-file-path + # to avoid to copy file in scripts/step_xxx folder cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "execute-script-sql", "--step=1", "--database=%s" % db_name, diff --git a/tests/cli_07_upgrade_test.py b/tests/cli_07_upgrade_test.py index 9368510..837009c 100644 --- a/tests/cli_07_upgrade_test.py +++ b/tests/cli_07_upgrade_test.py @@ -1,25 +1,26 @@ -from pathlib import Path - from odoo_openupgrade_wizard.tools_postgres import ( ensure_database, execute_sql_request, ) -from . import build_ctx_from_config_file, cli_runner_invoke +from . import ( + build_ctx_from_config_file, + cli_runner_invoke, + move_to_test_folder, +) def test_cli_upgrade(): - output_folder_path = Path("./tests/output").absolute() + move_to_test_folder() - db_name = "database_test_cli_upgrade" - - ctx = build_ctx_from_config_file(output_folder_path) + # Initialize database + db_name = "database_test_cli___upgrade" + ctx = build_ctx_from_config_file() ensure_database(ctx, db_name, state="absent") cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "run", "--step=1", "--database=%s" % db_name, @@ -42,7 +43,6 @@ def test_cli_upgrade(): cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "upgrade", "--database=%s" % db_name, "--first-step=1", diff --git a/tests/cli_20_install_from_csv_test.py b/tests/cli_20_install_from_csv_test.py new file mode 100644 index 0000000..72761e1 --- /dev/null +++ b/tests/cli_20_install_from_csv_test.py @@ -0,0 +1,39 @@ +from odoo_openupgrade_wizard.tools_postgres import ( + ensure_database, + execute_sql_request, +) + +from . import ( + build_ctx_from_config_file, + cli_runner_invoke, + move_to_test_folder, +) + + +def test_cli_install_from_csv(): + move_to_test_folder() + + # Initialize database + db_name = "database_test_cli___install_from_csv" + ctx = build_ctx_from_config_file() + ensure_database(ctx, db_name, state="absent") + + cli_runner_invoke( + [ + "--log-level=DEBUG", + "install-from-csv", + "--database=%s" % db_name, + ] + ) + + # Ensure that 'account' is installed + # and also 'product', by dependencies + request = ( + "SELECT count(*)" + " FROM ir_module_module" + " WHERE state ='installed'" + " AND name in ('product', 'account');" + ) + module_qty = int(execute_sql_request(ctx, request, database=db_name)[0][0]) + + assert module_qty == 2 diff --git a/tests/cli_08_generate_module_analysis_test.py b/tests/cli_21_generate_module_analysis_test.py similarity index 69% rename from tests/cli_08_generate_module_analysis_test.py rename to tests/cli_21_generate_module_analysis_test.py index cd5cbfd..89afbb7 100644 --- a/tests/cli_08_generate_module_analysis_test.py +++ b/tests/cli_21_generate_module_analysis_test.py @@ -2,16 +2,18 @@ from pathlib import Path from odoo_openupgrade_wizard.tools_odoo import get_odoo_env_path -from . import build_ctx_from_config_file, cli_runner_invoke +from . import ( + build_ctx_from_config_file, + cli_runner_invoke, + move_to_test_folder, +) def test_cli_generate_module_analysis(): - # TODO, fixme, this test is not working for the time being - return - output_folder_path = Path("./tests/output").absolute() - db_name = "database_test_cli_cli_generate_module_analysis" + move_to_test_folder() + db_name = "database_test_cli___generate_module_analysis" - ctx = build_ctx_from_config_file(output_folder_path) + ctx = build_ctx_from_config_file() # identify main analysis file of openupgrade analysis_file_path = get_odoo_env_path(ctx, {"release": 14.0}) / Path( "src/openupgrade/openupgrade_scripts/scripts" @@ -28,7 +30,6 @@ def test_cli_generate_module_analysis(): cli_runner_invoke( [ "--log-level=DEBUG", - "--env-folder=%s" % output_folder_path, "generate-module-analysis", "--step=2", "--database=%s" % db_name, diff --git a/tests/data/extra_script/click_odoo_test.py b/tests/data/extra_script/click_odoo_test.py new file mode 100644 index 0000000..f83a671 --- /dev/null +++ b/tests/data/extra_script/click_odoo_test.py @@ -0,0 +1,11 @@ +import logging + +_logger = logging.getLogger(__name__) +_logger.info("click_odoo_test.py : Begin of script ...") + +env = env # noqa: F821 + +for i in range(0, 10): + env["res.partner"].create({"name": "Partner #%d" % (i)}) + +_logger.info("click_odoo_test.py : End of script.") diff --git a/tests/data/extra_script/post-migration-custom_test.py b/tests/data/extra_script/post-migration-custom_test.py new file mode 100644 index 0000000..fffdd04 --- /dev/null +++ b/tests/data/extra_script/post-migration-custom_test.py @@ -0,0 +1,46 @@ +# Unused for the time being + +# def _check_orm_usage(self): +# # Classic ORM usage Checks +# partners = self.browse_by_search("res.partner") + +# self.browse_by_create("res.partner", {"name": "New Partner"}) + +# new_partners = self.browse_by_search("res.partner") + +# if len(partners) + 1 != len(new_partners): +# raise Exception("Creation of partner failed.") + + +# def _check_modules(self): +# if self.check_modules_installed("sale"): +# self.uninstall_modules("sale") + +# self.install_modules("sale") + +# if not self.check_modules_installed("sale"): +# raise Exception("'sale' module should be installed") + +# self.uninstall_modules(["product"]) + +# if self.check_modules_installed("sale"): +# raise Exception( +# "'sale' module should not be installed" +# " after uninstallation of product" +# ) + + +# def _check_models(self): +# if not self.check_models_present("res.partner"): +# raise Exception("'res.partner' model should be present.") + +# if self.check_models_present("res.partner.unexisting.model"): +# raise Exception( +# "'res.partner.unexisting.model' model" " should not be present." +# ) + + +# def main(self): +# _check_orm_usage(self) +# _check_modules(self) +# _check_models(self) diff --git a/tests/extra_script/pre-migration-custom_test.sql b/tests/data/extra_script/pre-migration-custom_test.sql similarity index 100% rename from tests/extra_script/pre-migration-custom_test.sql rename to tests/data/extra_script/pre-migration-custom_test.sql diff --git a/tests/output_expected/config.yml b/tests/data/output_expected/config.yml similarity index 100% rename from tests/output_expected/config.yml rename to tests/data/output_expected/config.yml diff --git a/tests/extra_script/post-migration-custom_test.py b/tests/extra_script/post-migration-custom_test.py deleted file mode 100644 index e9ffed1..0000000 --- a/tests/extra_script/post-migration-custom_test.py +++ /dev/null @@ -1,44 +0,0 @@ -def _check_orm_usage(self): - # Classic ORM usage Checks - partners = self.browse_by_search("res.partner") - - self.browse_by_create("res.partner", {"name": "New Partner"}) - - new_partners = self.browse_by_search("res.partner") - - if len(partners) + 1 != len(new_partners): - raise Exception("Creation of partner failed.") - - -def _check_modules(self): - if self.check_modules_installed("sale"): - self.uninstall_modules("sale") - - self.install_modules("sale") - - if not self.check_modules_installed("sale"): - raise Exception("'sale' module should be installed") - - self.uninstall_modules(["product"]) - - if self.check_modules_installed("sale"): - raise Exception( - "'sale' module should not be installed" - " after uninstallation of product" - ) - - -def _check_models(self): - if not self.check_models_present("res.partner"): - raise Exception("'res.partner' model should be present.") - - if self.check_models_present("res.partner.unexisting.model"): - raise Exception( - "'res.partner.unexisting.model' model" " should not be present." - ) - - -def main(self): - _check_orm_usage(self) - _check_modules(self) - _check_models(self)