* refactor: re-architect tests to mirror the codebase
* Update tests.yml
* fix: add missing tool_error imports after registry refactor
* fix(tests): replace patch.dict with monkeypatch to prevent env var leaks under xdist
patch.dict(os.environ) can leak TERMINAL_ENV across xdist workers,
causing test_code_execution tests to hit the Modal remote path.
* fix(tests): fix update_check and telegram xdist failures
- test_update_check: replace patch("hermes_cli.banner.os.getenv") with
monkeypatch.setenv("HERMES_HOME") — banner.py no longer imports os
directly, it uses get_hermes_home() from hermes_constants.
- test_telegram_conflict/approval_buttons: provide real exception classes
for telegram.error mock (NetworkError, TimedOut, BadRequest) so the
except clause in connect() doesn't fail with "catching classes that do
not inherit from BaseException" when xdist pollutes sys.modules.
* fix(tests): accept unavailable_models kwarg in _prompt_model_selection mock
47 lines
1.9 KiB
Python
47 lines
1.9 KiB
Python
"""Tests for CLI browser CDP auto-launch helpers."""
|
|
|
|
import os
|
|
from unittest.mock import patch
|
|
|
|
from cli import HermesCLI
|
|
|
|
|
|
class TestChromeDebugLaunch:
|
|
def test_windows_launch_uses_browser_found_on_path(self):
|
|
captured = {}
|
|
|
|
def fake_popen(cmd, **kwargs):
|
|
captured["cmd"] = cmd
|
|
captured["kwargs"] = kwargs
|
|
return object()
|
|
|
|
with patch("cli.shutil.which", side_effect=lambda name: r"C:\Chrome\chrome.exe" if name == "chrome.exe" else None), \
|
|
patch("cli.os.path.isfile", side_effect=lambda path: path == r"C:\Chrome\chrome.exe"), \
|
|
patch("subprocess.Popen", side_effect=fake_popen):
|
|
assert HermesCLI._try_launch_chrome_debug(9333, "Windows") is True
|
|
|
|
assert captured["cmd"] == [r"C:\Chrome\chrome.exe", "--remote-debugging-port=9333"]
|
|
assert captured["kwargs"]["start_new_session"] is True
|
|
|
|
def test_windows_launch_falls_back_to_common_install_dirs(self, monkeypatch):
|
|
captured = {}
|
|
program_files = r"C:\Program Files"
|
|
# Use os.path.join so path separators match cross-platform
|
|
installed = os.path.join(program_files, "Google", "Chrome", "Application", "chrome.exe")
|
|
|
|
def fake_popen(cmd, **kwargs):
|
|
captured["cmd"] = cmd
|
|
captured["kwargs"] = kwargs
|
|
return object()
|
|
|
|
monkeypatch.setenv("ProgramFiles", program_files)
|
|
monkeypatch.delenv("ProgramFiles(x86)", raising=False)
|
|
monkeypatch.delenv("LOCALAPPDATA", raising=False)
|
|
|
|
with patch("cli.shutil.which", return_value=None), \
|
|
patch("cli.os.path.isfile", side_effect=lambda path: path == installed), \
|
|
patch("subprocess.Popen", side_effect=fake_popen):
|
|
assert HermesCLI._try_launch_chrome_debug(9222, "Windows") is True
|
|
|
|
assert captured["cmd"] == [installed, "--remote-debugging-port=9222"]
|