refactor(tests): reuse CLI loader in more tests (#2571)

This commit is contained in:
Alexandre Teixeira
2026-06-05 02:42:10 +01:00
committed by GitHub
parent ae48ea7064
commit 51e668ce60
9 changed files with 19 additions and 121 deletions

View File

@@ -1,25 +1,12 @@
import importlib.machinery
import importlib.util
import io
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[1]
def _load_cli():
path = ROOT / "scripts" / "odysseus-cookbook"
loader = importlib.machinery.SourceFileLoader("odysseus_cookbook_cli", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
from tests.helpers.cli_loader import load_script
def test_state_set_rejects_non_object_json(tmp_path, monkeypatch, capsys):
cli = _load_cli()
cli = load_script("odysseus-cookbook")
cli._STATE_PATH = tmp_path / "cookbook_state.json"
monkeypatch.setattr(cli.sys, "stdin", io.StringIO("[]"))

View File

@@ -4,22 +4,10 @@
(e.g. None) raised TypeError once any *.log file existed. Non-strings now
return None (no match).
"""
import importlib.machinery
import importlib.util
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
def _load():
loader = importlib.machinery.SourceFileLoader("odysseus_logs_cli", str(ROOT / "scripts" / "odysseus-logs"))
spec = importlib.util.spec_from_loader(loader.name, loader)
m = importlib.util.module_from_spec(spec)
loader.exec_module(m)
return m
from tests.helpers.cli_loader import load_script
def test_non_string_name_returns_none():
cli = _load()
cli = load_script("odysseus-logs")
assert cli._resolve(None) is None
assert cli._resolve(123) is None

View File

@@ -1,24 +1,15 @@
import importlib.machinery
import importlib.util
import sys
import types
from pathlib import Path
from unittest.mock import MagicMock
ROOT = Path(__file__).resolve().parents[1]
from tests.helpers.cli_loader import load_script
def _load_cli(monkeypatch):
svc = types.ModuleType("services.memory.memory")
svc.MemoryManager = MagicMock()
monkeypatch.setitem(sys.modules, "services.memory.memory", svc)
path = ROOT / "scripts" / "odysseus-memory"
loader = importlib.machinery.SourceFileLoader("odysseus_memory_cli", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
return load_script("odysseus-memory")
def test_memory_entries_skips_invalid_rows(monkeypatch):

View File

@@ -1,19 +1,8 @@
import importlib.machinery
import importlib.util
from pathlib import Path
def _load_dispatcher():
path = Path(__file__).resolve().parent.parent / "scripts" / "odysseus"
loader = importlib.machinery.SourceFileLoader("odysseus_dispatcher_under_test", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
from tests.helpers.cli_loader import load_script
def test_is_runnable_subcommand_requires_executable_file(tmp_path):
cli = _load_dispatcher()
cli = load_script("odysseus")
sub = tmp_path / "odysseus-demo"
sub.write_text("#!/bin/sh\n")
sub.chmod(0o644)

View File

@@ -1,24 +1,15 @@
import importlib.machinery
import importlib.util
import sys
import types
from pathlib import Path
from unittest.mock import MagicMock
ROOT = Path(__file__).resolve().parents[1]
from tests.helpers.cli_loader import load_script
def _load_cli(monkeypatch):
personal_docs = types.ModuleType("src.personal_docs")
personal_docs.PersonalDocsManager = MagicMock()
monkeypatch.setitem(sys.modules, "src.personal_docs", personal_docs)
path = ROOT / "scripts" / "odysseus-personal"
loader = importlib.machinery.SourceFileLoader("odysseus_personal_cli", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
return load_script("odysseus-personal")
def test_file_rows_skips_invalid_rows(monkeypatch):

View File

@@ -1,19 +1,8 @@
import importlib.machinery
import importlib.util
from pathlib import Path
def _load_preset_cli():
path = Path(__file__).resolve().parent.parent / "scripts" / "odysseus-preset"
loader = importlib.machinery.SourceFileLoader("odysseus_preset_invalid_entries", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
from tests.helpers.cli_loader import load_script
def test_entry_or_fail_rejects_non_object_entries():
cli = _load_preset_cli()
cli = load_script("odysseus-preset")
try:
cli._entry_or_fail({"broken": "raw prompt"}, "broken")
@@ -24,6 +13,6 @@ def test_entry_or_fail_rejects_non_object_entries():
def test_entry_or_fail_returns_valid_entry():
cli = _load_preset_cli()
cli = load_script("odysseus-preset")
assert cli._entry_or_fail({"ok": {"name": "ok"}}, "ok") == {"name": "ok"}

View File

@@ -1,24 +1,10 @@
import importlib.machinery
import importlib.util
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[1]
def _load_cli():
path = ROOT / "scripts" / "odysseus-preset"
loader = importlib.machinery.SourceFileLoader("odysseus_preset_cli", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
from tests.helpers.cli_loader import load_script
def test_load_rejects_non_object_preset_store(tmp_path, capsys):
cli = _load_cli()
cli = load_script("odysseus-preset")
cli._PATH = tmp_path / "presets.json"
cli._PATH.write_text("[]")

View File

@@ -1,24 +1,15 @@
import importlib.machinery
import importlib.util
import sys
import types
from pathlib import Path
from unittest.mock import MagicMock
ROOT = Path(__file__).resolve().parents[1]
from tests.helpers.cli_loader import load_script
def _load_cli(monkeypatch):
svc = types.ModuleType("services.memory.skills")
svc.SkillsManager = MagicMock()
monkeypatch.setitem(sys.modules, "services.memory.skills", svc)
path = ROOT / "scripts" / "odysseus-skills"
loader = importlib.machinery.SourceFileLoader("odysseus_skills_cli", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
return load_script("odysseus-skills")
def test_skill_entries_skips_invalid_rows(monkeypatch):

View File

@@ -1,25 +1,11 @@
import importlib.machinery
import importlib.util
from pathlib import Path
import pytest
ROOT = Path(__file__).resolve().parents[1]
def _load_cli():
path = ROOT / "scripts" / "odysseus-theme"
loader = importlib.machinery.SourceFileLoader("odysseus_theme_cli", str(path))
spec = importlib.util.spec_from_loader(loader.name, loader)
module = importlib.util.module_from_spec(spec)
loader.exec_module(module)
return module
from tests.helpers.cli_loader import load_script
@pytest.mark.parametrize("payload", ["[]", '{"_users": []}'])
def test_load_prefs_rejects_non_object_user_store(tmp_path, capsys, payload):
cli = _load_cli()
cli = load_script("odysseus-theme")
cli._USER_PREFS_PATH = tmp_path / "user_prefs.json"
cli._USER_PREFS_PATH.write_text(payload)