feat: improve remote browser tree routing
Testing / remote-protocol-compat (0.9.3) (push) Successful in 43s
Testing / test (push) Successful in 1m1s
Testing / remote-protocol-compat (0.9.5) (push) Successful in 39s
Build & Publish Package / publish (push) Successful in 58s
Package Extension / package-extension (push) Successful in 1m15s
Testing / remote-protocol-compat (0.9.3) (push) Successful in 43s
Testing / test (push) Successful in 1m1s
Testing / remote-protocol-compat (0.9.5) (push) Successful in 39s
Build & Publish Package / publish (push) Successful in 58s
Package Extension / package-extension (push) Successful in 1m15s
- Allow remote host aliases passed via --browser to fan out for read-only multi-browser SDK paths while preserving strict routing for mutating commands. - Add remote host grouping and scoped profile labels to tabs tree output so global views avoid repeated host prefixes. - Carry browser family metadata through remote targets, tabs, and groups and style tree browser labels by family. - Split CLI rendering helpers into a typed rendering package with dedicated common, label, tabs-tree, and windows-tree modules. - Bump browser-cli and extension versions to 0.15.5. - Cover the new routing and rendering behavior with unit and CLI tests.
This commit is contained in:
+78
-2
@@ -4,7 +4,7 @@ import os
|
||||
import sys
|
||||
|
||||
from click.testing import CliRunner
|
||||
from unittest.mock import patch
|
||||
from unittest.mock import call, patch
|
||||
|
||||
from browser_cli.cli import main, _project_version
|
||||
from browser_cli.client import BrowserTarget
|
||||
@@ -379,7 +379,8 @@ def test_tabs_list_with_remote_uses_only_remote_targets():
|
||||
result = CliRunner().invoke(main, ["--remote", "remote-host:8765", "tabs", "list"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "remote-host:work" in result.output
|
||||
assert "work" in result.output
|
||||
assert "remote-host:work" not in result.output
|
||||
assert "Remote" in result.output
|
||||
send_command.assert_called_once_with("tabs.list", {}, profile="work", remote="remote-host:8765", key=None)
|
||||
|
||||
@@ -400,6 +401,81 @@ def test_tabs_list_with_explicit_browser_does_not_show_browser_column():
|
||||
assert "Browser" not in result.output
|
||||
send_command.assert_called_once_with("tabs.list", {}, profile="work", remote=None, key=None)
|
||||
|
||||
def test_tabs_tree_with_browser_host_alias_fans_out_to_remote_targets():
|
||||
targets = [
|
||||
BrowserTarget("main", "browser-host.example:main", "", remote="browser-host.example:8765", browser_name="Chrome"),
|
||||
BrowserTarget("work", "browser-host.example:work", "", remote="browser-host.example:8765", browser_name="Firefox"),
|
||||
]
|
||||
|
||||
def fake_send_command(command, args=None, profile=None, remote=None, key=None):
|
||||
assert remote == "browser-host.example:8765"
|
||||
if command == "tabs.list":
|
||||
return [{
|
||||
"id": 1 if profile == "main" else 2,
|
||||
"windowId": 1,
|
||||
"active": True,
|
||||
"index": 0,
|
||||
"title": f"{profile} tab",
|
||||
"url": "https://example.com",
|
||||
}]
|
||||
if command == "group.list":
|
||||
return []
|
||||
raise AssertionError(command)
|
||||
|
||||
with patch("browser_cli.remote_targets_for_alias", return_value=targets), patch(
|
||||
"browser_cli.send_command", side_effect=fake_send_command
|
||||
) as send_command:
|
||||
result = CliRunner().invoke(main, ["--browser", "browser-host.example", "tabs", "tree"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "main" in result.output
|
||||
assert "work" in result.output
|
||||
assert "browser-host.example:main" not in result.output
|
||||
assert "browser-host.example:work" not in result.output
|
||||
assert "main tab" in result.output
|
||||
assert "work tab" in result.output
|
||||
assert send_command.call_args_list == [
|
||||
call("tabs.list", {}, profile="main", remote="browser-host.example:8765", key=None),
|
||||
call("tabs.list", {}, profile="work", remote="browser-host.example:8765", key=None),
|
||||
call("group.list", {}, profile="main", remote="browser-host.example:8765", key=None),
|
||||
call("group.list", {}, profile="work", remote="browser-host.example:8765", key=None),
|
||||
]
|
||||
|
||||
def test_tabs_tree_unscoped_groups_remote_targets_by_host():
|
||||
targets = [
|
||||
BrowserTarget("main", "browser-host.example:main", "", remote="browser-host.example:8765", display_group="browser-host.example"),
|
||||
BrowserTarget("work", "browser-host.example:work", "", remote="browser-host.example:8765", display_group="browser-host.example"),
|
||||
]
|
||||
|
||||
def fake_send_command(command, args=None, profile=None, remote=None, key=None):
|
||||
assert remote == "browser-host.example:8765"
|
||||
if command == "tabs.list":
|
||||
return [{
|
||||
"id": 1 if profile == "main" else 2,
|
||||
"windowId": 1,
|
||||
"active": True,
|
||||
"index": 0,
|
||||
"title": f"{profile} tab",
|
||||
"url": "https://example.com",
|
||||
}]
|
||||
if command == "group.list":
|
||||
return []
|
||||
raise AssertionError(command)
|
||||
|
||||
with patch("browser_cli.active_browser_targets", return_value=targets), patch(
|
||||
"browser_cli.send_command", side_effect=fake_send_command
|
||||
):
|
||||
result = CliRunner().invoke(main, ["tabs", "tree"])
|
||||
|
||||
assert result.exit_code == 0
|
||||
assert "browser-host.example" in result.output
|
||||
assert "main" in result.output
|
||||
assert "work" in result.output
|
||||
assert "browser-host.example:main" not in result.output
|
||||
assert "browser-host.example:work" not in result.output
|
||||
assert "main tab" in result.output
|
||||
assert "work tab" in result.output
|
||||
|
||||
def test_tabs_count_multi_browser_shows_total():
|
||||
counts = {"default": 3, "work": 4}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user