add multi browser mode to arragate data from all browsers by tabs list, tabs count, group list, group count and windows list
Package Extension / package-extension (push) Successful in 12s
Build & Publish Package / publish (push) Successful in 22s

remove (unnamed) into the group names just leave it a empty string, remove Focused on windows how should the browser know what windows are focused
This commit is contained in:
2026-04-10 12:49:51 +02:00
parent 6979f2ef30
commit 61b774a7a4
14 changed files with 578 additions and 79 deletions
+104 -3
View File
@@ -5,8 +5,8 @@ These tests mock `send_command` so no live browser connection is required.
import pytest
from unittest.mock import MagicMock, patch, call
from browser_cli import BrowserCLI, Tab, Group
from browser_cli.client import BrowserNotConnected
from browser_cli import BrowserCLI, BrowserCounts, Tab, Group
from browser_cli.client import BrowserNotConnected, BrowserTarget
# ── Helpers ───────────────────────────────────────────────────────────────────
@@ -36,7 +36,7 @@ def mock_send():
BrowserCLI._cmd calls the `send_command` name that was imported into
browser_cli/__init__.py, so we must patch it there, not in the client module.
"""
with patch("browser_cli.send_command") as m:
with patch("browser_cli.send_command") as m, patch("browser_cli.active_browser_targets", return_value=[]):
yield m
@@ -268,6 +268,48 @@ class TestTabs:
mock_send.return_value = 5
assert b.tabs_count() == 5
def test_tabs_list_multi_browser_annotates_browser_and_binds_actions(self, b, mock_send):
with patch(
"browser_cli.active_browser_targets",
return_value=[
BrowserTarget("default", "uuid-1", "/tmp/uuid-1.sock"),
BrowserTarget("work", "work", "/tmp/work.sock"),
],
):
mock_send.side_effect = [
[TAB_DATA],
[{**TAB_DATA, "id": 11}],
None,
]
tabs = b.tabs_list()
tabs[1].close()
assert [tab.browser for tab in tabs] == ["uuid-1", "work"]
assert [tab.id for tab in tabs] == [10, 11]
assert mock_send.call_args_list == [
call("tabs.list", {}, profile="default"),
call("tabs.list", {}, profile="work"),
call("tabs.close", {"tabId": 11}, profile="work"),
]
def test_tabs_count_multi_browser_returns_browser_counts(self, b, mock_send):
with patch(
"browser_cli.active_browser_targets",
return_value=[
BrowserTarget("default", "uuid-1", "/tmp/uuid-1.sock"),
BrowserTarget("work", "work", "/tmp/work.sock"),
],
):
mock_send.side_effect = [3, 4]
result = b.tabs_count("github")
assert result == BrowserCounts(total=7, by_browser={"uuid-1": 3, "work": 4})
assert mock_send.call_args_list == [
call("tabs.count", {"pattern": "github"}, profile="default"),
call("tabs.count", {"pattern": "github"}, profile="work"),
]
def test_tabs_query(self, b, mock_send):
mock_send.return_value = [TAB_DATA]
result = b.tabs_query("example")
@@ -330,6 +372,44 @@ class TestGroups:
mock_send.return_value = 7
assert b.group_count() == 7
def test_group_list_multi_browser_annotates_browser_and_binds_actions(self, b, mock_send):
with patch(
"browser_cli.active_browser_targets",
return_value=[
BrowserTarget("default", "uuid-1", "/tmp/uuid-1.sock"),
BrowserTarget("work", "work", "/tmp/work.sock"),
],
):
mock_send.side_effect = [
[GROUP_DATA],
[{**GROUP_DATA, "id": 99, "title": "Later"}],
None,
]
groups = b.group_list()
groups[1].close()
assert [group.browser for group in groups] == ["uuid-1", "work"]
assert [group.id for group in groups] == [42, 99]
assert mock_send.call_args_list == [
call("group.list", {}, profile="default"),
call("group.list", {}, profile="work"),
call("group.close", {"groupId": 99}, profile="work"),
]
def test_group_count_multi_browser_returns_browser_counts(self, b, mock_send):
with patch(
"browser_cli.active_browser_targets",
return_value=[
BrowserTarget("default", "uuid-1", "/tmp/uuid-1.sock"),
BrowserTarget("work", "work", "/tmp/work.sock"),
],
):
mock_send.side_effect = [2, 5]
result = b.group_count()
assert result == BrowserCounts(total=7, by_browser={"uuid-1": 2, "work": 5})
def test_group_query(self, b, mock_send):
mock_send.return_value = [GROUP_DATA]
groups = b.group_query("Work")
@@ -371,6 +451,27 @@ class TestGroups:
)
class TestWindows:
def test_windows_list_multi_browser_adds_browser(self, b, mock_send):
with patch(
"browser_cli.active_browser_targets",
return_value=[
BrowserTarget("default", "uuid-1", "/tmp/uuid-1.sock"),
BrowserTarget("work", "work", "/tmp/work.sock"),
],
):
mock_send.side_effect = [
[{"id": 1, "tabCount": 2, "state": "normal"}],
[{"id": 2, "tabCount": 3, "state": "maximized"}],
]
result = b.windows_list()
assert result == [
{"id": 1, "tabCount": 2, "state": "normal", "browser": "uuid-1"},
{"id": 2, "tabCount": 3, "state": "maximized", "browser": "work"},
]
# ── Tab model ─────────────────────────────────────────────────────────────────
class TestTabModel: