Extract shared core from MCP tools, add CLI browser commands (#4768)
This commit is contained in:
65
tests/unit/test_mcp_browser_tools.py
Normal file
65
tests/unit/test_mcp_browser_tools.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""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()
|
||||
Reference in New Issue
Block a user