102 lines
4.2 KiB
Python
102 lines
4.2 KiB
Python
from pathlib import Path
|
|
|
|
from click.testing import CliRunner
|
|
from unittest.mock import patch
|
|
|
|
from browser_cli.cli import main, _project_version
|
|
|
|
def _expected_version() -> str:
|
|
pyproject = Path(__file__).resolve().parent.parent / "pyproject.toml"
|
|
for line in pyproject.read_text(encoding="utf-8").splitlines():
|
|
if line.startswith("version = "):
|
|
return line.split('"')[1]
|
|
raise AssertionError("version not found in pyproject.toml")
|
|
|
|
def test_short_version_option():
|
|
result = CliRunner().invoke(main, ["-V"])
|
|
assert result.exit_code == 0
|
|
assert result.output.strip() == _expected_version()
|
|
|
|
def test_long_version_option():
|
|
result = CliRunner().invoke(main, ["--version"])
|
|
assert result.exit_code == 0
|
|
assert result.output.strip() == _expected_version()
|
|
|
|
def test_project_version_falls_back_to_installed_package_metadata():
|
|
with patch("browser_cli.cli.Path.read_text", side_effect=OSError), patch(
|
|
"browser_cli.cli.package_version", return_value="9.9.9"
|
|
):
|
|
assert _project_version() == "9.9.9"
|
|
|
|
def test_rename_profile_uses_command_level_browser_target():
|
|
with patch("browser_cli.cli.send_command") as send_command:
|
|
result = CliRunner().invoke(main, ["rename-profile", "--browser", "old-id", "work"])
|
|
|
|
assert result.exit_code == 0
|
|
send_command.assert_called_once_with("clients.rename_profile", {"alias": "work"}, profile="old-id")
|
|
|
|
def test_rename_profile_uses_global_browser_target_when_set():
|
|
with patch("browser_cli.cli.send_command") as send_command:
|
|
result = CliRunner().invoke(main, ["--browser", "old-id", "rename-profile", "work"])
|
|
|
|
assert result.exit_code == 0
|
|
send_command.assert_called_once_with("clients.rename_profile", {"alias": "work"}, profile=None)
|
|
|
|
def test_install_help_lists_supported_browsers():
|
|
result = CliRunner().invoke(main, ["install", "--help"])
|
|
|
|
assert result.exit_code == 0
|
|
assert "[chrome|chromium|brave|edge|vivaldi]" in result.output
|
|
|
|
def test_clients_exits_cleanly_when_registry_is_missing():
|
|
with patch("browser_cli.client.REGISTRY_PATH", Path("/nonexistent/browser-cli-registry.json")):
|
|
result = CliRunner().invoke(main, ["clients"])
|
|
|
|
assert result.exit_code == 1
|
|
assert "No browser clients found" in result.output
|
|
|
|
def test_clients_shows_named_profile_and_uses_socket_uuid_for_default(tmp_path):
|
|
registry_path = tmp_path / "registry.json"
|
|
default_socket = tmp_path / "550e8400-e29b-41d4-a716-446655440000.sock"
|
|
work_socket = tmp_path / "work.sock"
|
|
registry_path.write_text(
|
|
'{"default": "%s", "work": "%s"}' % (default_socket, work_socket),
|
|
encoding="utf-8",
|
|
)
|
|
|
|
responses = {
|
|
"default": [{"profile": "default", "name": "Chrome", "version": "1", "extensionVersion": "2.3.4"}],
|
|
"work": [{"profile": "default", "name": "Chrome", "version": "1", "extensionVersion": "2.3.4"}],
|
|
}
|
|
|
|
def fake_send_command(command, args=None, profile=None):
|
|
assert command == "clients.list"
|
|
return responses[profile]
|
|
|
|
with patch("browser_cli.client.REGISTRY_PATH", registry_path), patch(
|
|
"browser_cli.cli.send_command", side_effect=fake_send_command
|
|
):
|
|
result = CliRunner().invoke(main, ["clients"])
|
|
|
|
assert result.exit_code == 0
|
|
assert "550e8400-e29b-41d4-a716-446655440000" in result.output
|
|
assert "work" in result.output
|
|
assert "Extension Version" in result.output
|
|
assert "2.3.4" in result.output
|
|
|
|
def test_extract_markdown_command():
|
|
with patch("browser_cli.commands.extract.send_command", return_value="# Title\n") as send_command:
|
|
result = CliRunner().invoke(main, ["extract", "markdown"])
|
|
|
|
assert result.exit_code == 0
|
|
assert result.output == "# Title\n"
|
|
send_command.assert_called_once_with("extract.markdown", {"selector": None})
|
|
|
|
def test_extract_markdown_command_with_selector():
|
|
with patch("browser_cli.commands.extract.send_command", return_value="## Post\n") as send_command:
|
|
result = CliRunner().invoke(main, ["extract", "markdown", "--selector", "article"])
|
|
|
|
assert result.exit_code == 0
|
|
assert result.output == "## Post\n"
|
|
send_command.assert_called_once_with("extract.markdown", {"selector": "article"})
|