diff --git a/pytest_abra/coordinator.py b/pytest_abra/coordinator.py index 6704360..ca75f98 100644 --- a/pytest_abra/coordinator.py +++ b/pytest_abra/coordinator.py @@ -112,6 +112,11 @@ class Coordinator: load_json_to_environ(test_credentials_path) + @staticmethod + def add_to_sys(path: Path): + # this is a function so that it can be monkeypatched + sys.path.append(path.as_posix()) + @staticmethod def create_runner_dict(recipes_dir: Path) -> dict[str, type[Runner]]: """Creates a dictionary holding all the RunnerClasses that can be discovered in recipes_dir @@ -131,7 +136,7 @@ class Coordinator: runner_discovery_pattern = re.compile("Runner.+") # make it possible to import modules from recipes_dir - sys.path.append(recipes_dir.as_posix()) + Coordinator.add_to_sys(recipes_dir) for module_path in recipes_dir.rglob("*/runner_*.py"): rel_path = module_path.relative_to(recipes_dir).as_posix().replace("/", ".").replace(".py", "") diff --git a/tests/test_coordinator.py b/tests/test_coordinator.py index 3c00ed6..a587d97 100644 --- a/tests/test_coordinator.py +++ b/tests/test_coordinator.py @@ -1,5 +1,6 @@ import os import shutil +import sys from pathlib import Path import pytest @@ -41,3 +42,25 @@ def test_runner_runner_dict_import(tmp_recipes: Path): RUNNER_DICT = Coordinator.create_runner_dict(tmp_recipes) assert len(RUNNER_DICT.keys()) > 0 + + +@pytest.fixture +def clear_sys_path(): + """clear sys.path before test, restore after""" + syspath_copy = sys.path.copy() + sys.path.clear() + yield + sys.path.extend(syspath_copy) + + +def test_runner_runner_dict_import_failing(tmp_recipes: Path, clear_sys_path, monkeypatch): + """import from recipes dict should work, because create_runner_dict has sys.path.append""" + + monkeypatch.setattr( + Coordinator, + "add_to_sys", + lambda x: x, + ) + + with pytest.raises(ModuleNotFoundError): + Coordinator.create_runner_dict(tmp_recipes)