Files
hermes-agent/tests/hermes_cli/test_whatsapp_missing_runtime.py

63 lines
2.9 KiB
Python

"""A successful PM preparation must still supply a runnable bridge binary."""
from types import SimpleNamespace
import pytest
from fastapi import HTTPException
def _missing_package(monkeypatch):
import pm
import hermes_constants
monkeypatch.setattr(hermes_constants, "find_node_executable", lambda executable: None)
monkeypatch.setattr(hermes_constants, "with_hermes_node_path", lambda: {})
monkeypatch.setattr(pm, "ensure", lambda package, explicit: SimpleNamespace(env={}))
monkeypatch.setattr(pm, "installed_package", lambda package: None)
@pytest.mark.parametrize("executable", ["npm", "node"])
def test_dashboard_reports_prepared_bridge_binary_missing(tmp_path, monkeypatch, executable):
from hermes_cli.web_routers import messaging
from gateway.platforms import whatsapp_common
_missing_package(monkeypatch)
bridge_dir = tmp_path / "bridge"
bridge_dir.mkdir()
(bridge_dir / "bridge.js").write_text("", encoding="utf-8")
monkeypatch.setattr(whatsapp_common, "resolve_whatsapp_bridge_dir", lambda: bridge_dir)
if executable == "npm":
operation = lambda: messaging._ensure_whatsapp_bridge_dependencies(bridge_dir)
else:
monkeypatch.setattr(messaging, "_ensure_whatsapp_bridge_dependencies", lambda path: None)
operation = lambda: messaging._spawn_whatsapp_pairing_process(tmp_path / "session", "bot")
with pytest.raises(HTTPException) as caught:
operation()
if caught.value.status_code != 500 or executable not in caught.value.detail or "binary" not in caught.value.detail:
pytest.fail(f"Unexpected dashboard error: {caught.value!r}")
@pytest.mark.parametrize("executable", ["npm", "node"])
def test_cli_reports_prepared_bridge_binary_missing(tmp_path, monkeypatch, capsys, executable):
from hermes_cli import main, main_platform_setup as setup
from gateway.platforms import whatsapp_common
_missing_package(monkeypatch)
bridge_dir = tmp_path / "bridge"
bridge_dir.mkdir()
(bridge_dir / "bridge.js").write_text("", encoding="utf-8")
if executable == "npm":
if setup._whatsapp_install_bridge(bridge_dir) is not False:
pytest.fail("CLI continued despite missing npm binary")
else:
monkeypatch.setattr(main, "_require_tty", lambda command: None)
monkeypatch.setattr(setup, "_whatsapp_choose_mode", lambda *args: "bot")
monkeypatch.setattr(setup, "_whatsapp_allowed_users", lambda *args: None)
monkeypatch.setattr(setup, "_whatsapp_install_bridge", lambda path: True)
monkeypatch.setattr(whatsapp_common, "resolve_whatsapp_bridge_dir", lambda: bridge_dir)
monkeypatch.setattr(main, "get_hermes_home", lambda: tmp_path)
setup.cmd_whatsapp(SimpleNamespace())
output = capsys.readouterr().out
if executable not in output or "binary" not in output:
pytest.fail(f"CLI did not report the missing binary: {output!r}")