from __future__ import annotations import importlib.util import sys from pathlib import Path MODULE_NAME = "sandbox_provisioner_app_for_test" def _find_module_path() -> Path: current = Path(__file__).resolve() for parent in current.parents: candidate = parent / "docker" / "sandbox_provisioner" / "app.py" if candidate.exists(): return candidate raise FileNotFoundError("docker/sandbox_provisioner/app.py not found from test path") MODULE_PATH = _find_module_path() def _load_module(): existing = sys.modules.get(MODULE_NAME) if existing is not None: return existing spec = importlib.util.spec_from_file_location(MODULE_NAME, MODULE_PATH) assert spec is not None assert spec.loader is not None module = importlib.util.module_from_spec(spec) sys.modules[MODULE_NAME] = module spec.loader.exec_module(module) return module def test_canonical_backend_name(monkeypatch): monkeypatch.setenv("PROVISIONER_BACKEND", "memory") module = _load_module() assert module.canonical_backend_name("docker") == "docker" assert module.canonical_backend_name("kubernetes") == "kubernetes" def test_merged_sandbox_env_user_values_override_global(monkeypatch): monkeypatch.setenv("PROVISIONER_BACKEND", "memory") module = _load_module() assert module.merged_sandbox_env( {"SHARED": "global", "GLOBAL_ONLY": "value"}, {"SHARED": "user", "USER_ONLY": "value"}, ) == { "SHARED": "user", "GLOBAL_ONLY": "value", "USER_ONLY": "value", } def test_normalize_env_converts_values_to_strings(monkeypatch): monkeypatch.setenv("PROVISIONER_BACKEND", "memory") module = _load_module() assert module.normalize_env({"A": 1, "B": None, "": "ignored"}) == {"A": "1", "B": ""}