"""Behavior coverage for the cua-driver 0.20 public browser contract.""" import json from typing import Any, Dict from unittest.mock import Mock from tools.computer_use.browser_route import CuaTypedBrowserRoute from tools.computer_use.schema import COMPUTER_USE_SCHEMA from tools.computer_use.tool import _dispatch class _Driver: def __init__(self, responses: list[Dict[str, Any]]) -> None: self.responses = list(responses) self.calls: list[tuple[str, Dict[str, Any]]] = [] def has_tool(self, _name: str) -> bool: return True def call(self, name: str, args: Dict[str, Any]) -> Dict[str, Any]: self.calls.append((name, dict(args))) return self.responses.pop(0) def _route(driver: _Driver) -> CuaTypedBrowserRoute: return CuaTypedBrowserRoute( session_id="hermes-browser-contract", call_tool=driver.call, has_tool=driver.has_tool, ) def test_public_schema_exposes_020_state_and_type_options(): properties = COMPUTER_USE_SCHEMA["parameters"]["properties"] assert properties["include_screenshot"]["type"] == "boolean" assert properties["replace"]["type"] == "boolean" assert properties["browser_type_mode"]["enum"] == ["insert_text", "keystrokes"] assert "approval_token" not in properties def test_browser_state_forwards_screenshot_request_and_preserves_mcp_image(): driver = _Driver([ { "structuredContent": { "status": "ok", "target_id": "target-a", "binding_quality": "exact", "mutation_allowed": True, "tabs": [{"tab_id": "tab-a"}], }, "images": ["/9j/browser-shot"], "image_mime_types": ["image/jpeg"], } ]) result = _route(driver).observe( pid=101, window_id=202, include_screenshot=True, ) assert driver.calls == [ ( "get_browser_state", { "pid": 101, "window_id": 202, "include_screenshot": True, "session": "hermes-browser-contract", }, ) ] assert result["_mcp_images"] == [ {"data": "/9j/browser-shot", "mime_type": "image/jpeg"} ] assert "screenshot_deferred" not in result def test_browser_bind_reports_screenshot_deferred_only_when_no_image_returned(): driver = _Driver([ { "structuredContent": { "status": "ok", "target_id": "target-a", "binding_quality": "exact", "mutation_allowed": True, "tabs": [{"tab_id": "tab-a"}], }, } ]) result = _route(driver).observe( pid=101, window_id=202, include_screenshot=True, ) assert result["screenshot_deferred"] is True assert "_mcp_images" not in result def test_browser_state_dispatch_returns_mcp_image_as_multimodal_content(): backend = Mock() backend.typed_browser_state.return_value = { "status": "ok", "url": "https://example.test/", "_mcp_images": [{"data": "iVBORbrowser-shot", "mime_type": "image/png"}], } result = _dispatch( backend, "cua_browser_state", {"tab_id": "tab-a", "include_screenshot": True}, ) backend.typed_browser_state.assert_called_once_with( tab_id="tab-a", include_screenshot=True ) assert result["_multimodal"] is True assert json.loads(result["content"][0]["text"])["url"] == "https://example.test/" assert result["content"][1] == { "type": "image_url", "image_url": {"url": "data:image/png;base64,iVBORbrowser-shot"}, } assert "iVBORbrowser-shot" not in result["text_summary"] def test_browser_type_replace_reaches_typed_browser_backend(): backend = Mock() backend.typed_browser_action.return_value = {"status": "ok"} result = _dispatch( backend, "cua_browser_type", { "tab_id": "tab-a", "ref": "field-a", "text": "replacement", "browser_type_mode": "keystrokes", "replace": True, }, ) assert json.loads(result)["status"] == "ok" backend.typed_browser_action.assert_called_once_with( "browser_type", tab_id="tab-a", args={ "ref": "field-a", "text": "replacement", "replace": True, "mode": "keystrokes", }, )