"""Tests for MCP browser tool preflight validation behavior.""" from __future__ import annotations from types import SimpleNamespace from unittest.mock import AsyncMock import pytest from skyvern.cli.core.result import BrowserContext from skyvern.cli.mcp_tools import browser as mcp_browser @pytest.mark.asyncio async def test_skyvern_extract_invalid_schema_preflight_before_session(monkeypatch: pytest.MonkeyPatch) -> None: get_page = AsyncMock(side_effect=AssertionError("get_page should not be called for invalid schema")) monkeypatch.setattr(mcp_browser, "get_page", get_page) result = await mcp_browser.skyvern_extract(prompt="extract data", schema="{invalid") assert result["ok"] is False assert result["error"]["code"] == mcp_browser.ErrorCode.INVALID_INPUT assert "Invalid JSON schema" in result["error"]["message"] get_page.assert_not_awaited() @pytest.mark.asyncio async def test_skyvern_extract_preparsed_schema_passed_to_core(monkeypatch: pytest.MonkeyPatch) -> None: page = object() context = BrowserContext(mode="cloud_session", session_id="pbs_test") monkeypatch.setattr(mcp_browser, "get_page", AsyncMock(return_value=(page, context))) do_extract = AsyncMock(return_value=SimpleNamespace(extracted={"ok": True})) monkeypatch.setattr(mcp_browser, "do_extract", do_extract) result = await mcp_browser.skyvern_extract(prompt="extract data", schema='{"type":"object"}') assert result["ok"] is True await_args = do_extract.await_args assert await_args is not None assert isinstance(await_args.kwargs["schema"], dict) @pytest.mark.asyncio async def test_skyvern_navigate_invalid_wait_until_preflight_before_session(monkeypatch: pytest.MonkeyPatch) -> None: get_page = AsyncMock(side_effect=AssertionError("get_page should not be called for invalid wait_until")) monkeypatch.setattr(mcp_browser, "get_page", get_page) result = await mcp_browser.skyvern_navigate(url="https://example.com", wait_until="not-a-real-wait-until") assert result["ok"] is False assert result["error"]["code"] == mcp_browser.ErrorCode.INVALID_INPUT get_page.assert_not_awaited() @pytest.mark.asyncio async def test_skyvern_act_password_prompt_preflight_before_session(monkeypatch: pytest.MonkeyPatch) -> None: get_page = AsyncMock(side_effect=AssertionError("get_page should not be called for password prompt")) monkeypatch.setattr(mcp_browser, "get_page", get_page) result = await mcp_browser.skyvern_act(prompt="enter the password and submit") assert result["ok"] is False assert result["error"]["code"] == mcp_browser.ErrorCode.INVALID_INPUT get_page.assert_not_awaited()