| """Regression: ``HermesWirer._install_plugin`` must call ``install()`` with its | |
| full required signature ``(hermes_home: Path, force: bool, dry_run: bool)``. | |
| cli 0.3.9 shipped a ``TypeError`` here (called with only ``hermes_home`` as a | |
| ``str``) because the wider setup suite stubs ``_install_plugin`` and masked it. | |
| This test exercises the real method with ``install`` mocked, so the arg contract | |
| is enforced without needing the hermes runtime. Source: beta reports | |
| "sibyl setup hermes fails on fresh install" (2026-06-01). | |
| """ | |
| from pathlib import Path | |
| import sibyl_memory_hermes.install_plugin as ip | |
| from sibyl_memory_cli import setup as cli_setup | |
| def test_install_plugin_passes_full_signature(monkeypatch): | |
| calls = [] | |
| monkeypatch.setattr( | |
| ip, "install", | |
| lambda hermes_home, force, dry_run: (calls.append((hermes_home, force, dry_run)), 0)[1], | |
| ) | |
| w = cli_setup.HermesWirer.__new__(cli_setup.HermesWirer) | |
| w.hermes_home = Path("/tmp/fake-hermes-home") | |
| w._install_plugin() # must not raise TypeError | |
| assert len(calls) == 1 | |
| hermes_home, force, dry_run = calls[0] | |
| assert isinstance(hermes_home, Path) | |
| assert force is False | |
| assert dry_run is False | |