66 lines
2.6 KiB
Python
66 lines
2.6 KiB
Python
"""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()
|