params.py•9.08 kB
from contextlib import nullcontext as does_not_raise
import pytest
from fastmcp.exceptions import ToolError
from pydantic import BaseModel
class SimpleSchema(BaseModel):
title: str
price: float
JOB_RESPONSE = {"id": "7333092420940211201", "status": "done"}
STR_RESPONSE = {
"results": [{"content": "Mocked content"}],
"job": JOB_RESPONSE,
}
JSON_RESPONSE = {
"results": [{"content": {"data": "value"}}],
"job": JOB_RESPONSE,
}
AI_STUDIO_JSON_RESPONSE = {
"results": [{"content": {"data": "value"}}],
"job": JOB_RESPONSE,
}
QUERY_ONLY = pytest.param(
{"query": "Generic query"},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id="query-only-args",
)
PARSE_ENABLED = pytest.param(
{"query": "Generic query", "parse": True},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="parse-enabled-args",
)
RENDER_HTML_WITH_QUERY = pytest.param(
{"query": "Generic query", "render": "html"},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id="render-enabled-args",
)
RENDER_INVALID_WITH_QUERY = pytest.param(
{"query": "Generic query", "render": "png"},
pytest.raises(ToolError),
STR_RESPONSE,
None,
id="render-enabled-args",
)
OUTPUT_FORMATS = [
pytest.param(
{"query": "Generic query", "output_format": "links"},
does_not_raise(),
{
"results": [
{
"content": '<html><body><div><p><a href="https://example.com">link</a></p></div></body></html>'
}
],
"job": JOB_RESPONSE,
},
"[link] https://example.com",
id="links-output-format-args",
),
pytest.param(
{"query": "Generic query", "output_format": "md"},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id="md-output-format-args",
),
pytest.param(
{"query": "Generic query", "output_format": "html"},
does_not_raise(),
STR_RESPONSE,
"Mocked content",
id="html-output-format-args",
),
]
USER_AGENTS_WITH_QUERY = [
pytest.param(
{"query": "Generic query", "user_agent_type": uat},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id=f"{uat}-user-agent-specified-args",
)
for uat in [
"desktop",
"desktop_chrome",
"desktop_firefox",
"desktop_safari",
"desktop_edge",
"desktop_opera",
"mobile",
"mobile_ios",
"mobile_android",
"tablet",
]
]
USER_AGENTS_WITH_URL = [
pytest.param(
{"url": "https://example.com", "user_agent_type": uat},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id=f"{uat}-user-agent-specified-args",
)
for uat in [
"desktop",
"desktop_chrome",
"desktop_firefox",
"desktop_safari",
"desktop_edge",
"desktop_opera",
"mobile",
"mobile_ios",
"mobile_android",
"tablet",
]
]
INVALID_USER_AGENT = pytest.param(
{"query": "Generic query", "user_agent_type": "invalid"},
pytest.raises(ToolError),
STR_RESPONSE,
"Mocked content",
id="invalid-user-agent-specified-args",
)
START_PAGE_SPECIFIED = pytest.param(
{"query": "Generic query", "start_page": 2},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="start-page-specified-args",
)
START_PAGE_INVALID = pytest.param(
{"query": "Generic query", "start_page": -1},
pytest.raises(ToolError),
JSON_RESPONSE,
'{"data": "value"}',
id="start-page-invalid-args",
)
PAGES_SPECIFIED = pytest.param(
{"query": "Generic query", "pages": 20},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="pages-specified-args",
)
PAGES_INVALID = pytest.param(
{"query": "Generic query", "pages": -10},
pytest.raises(ToolError),
JSON_RESPONSE,
'{"data": "value"}',
id="pages-invalid-args",
)
LIMIT_SPECIFIED = pytest.param(
{"query": "Generic query", "limit": 100},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="limit-specified-args",
)
LIMIT_INVALID = pytest.param(
{"query": "Generic query", "limit": 0},
pytest.raises(ToolError),
JSON_RESPONSE,
'{"data": "value"}',
id="limit-invalid-args",
)
DOMAIN_SPECIFIED = pytest.param(
{"query": "Generic query", "domain": "io"},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="domain-specified-args",
)
GEO_LOCATION_SPECIFIED_WITH_QUERY = pytest.param(
{"query": "Generic query", "geo_location": "Miami, Florida"},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="geo-location-specified-args",
)
GEO_LOCATION_SPECIFIED_WITH_URL = pytest.param(
{"url": "https://example.com", "geo_location": "Miami, Florida"},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id="geo-location-specified-args",
)
LOCALE_SPECIFIED = pytest.param(
{"query": "Generic query", "locale": "ja_JP"},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="locale-specified-args",
)
CATEGORY_SPECIFIED = pytest.param(
{"query": "Man's T-shirt", "category_id": "QE21R9AV"},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="category-id-specified-args",
)
MERCHANT_ID_SPECIFIED = pytest.param(
{"query": "Man's T-shirt", "merchant_id": "QE21R9AV"},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="merchant-id-specified-args",
)
CURRENCY_SPECIFIED = pytest.param(
{"query": "Man's T-shirt", "currency": "USD"},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="currency-specified-args",
)
AUTOSELECT_VARIANT_ENABLED = pytest.param(
{"query": "B0BVF87BST", "autoselect_variant": True},
does_not_raise(),
JSON_RESPONSE,
'{"data": "value"}',
id="autoselect-variant-enabled-args",
)
URL_ONLY = pytest.param(
{"url": "https://example.com"},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id="url-only-args",
)
NO_URL = pytest.param(
{},
pytest.raises(ToolError),
STR_RESPONSE,
"\n\nMocked content\n\n",
id="no-url-args",
)
RENDER_HTML_WITH_URL = pytest.param(
{"url": "https://example.com", "render": "html"},
does_not_raise(),
STR_RESPONSE,
"\n\nMocked content\n\n",
id="render-enabled-args",
)
RENDER_INVALID_WITH_URL = pytest.param(
{"url": "https://example.com", "render": "png"},
pytest.raises(ToolError),
JSON_RESPONSE,
None,
id="render-enabled-args",
)
AI_STUDIO_URL_ONLY = pytest.param(
{"url": "https://example.com"},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-args",
)
AI_STUDIO_QUERY_ONLY = pytest.param(
{"query": "Generic query"},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-args",
)
AI_STUDIO_URL_AND_OUTPUT_FORMAT = pytest.param(
{"url": "https://example.com", "output_format": "json"},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-and-output-format-args",
)
AI_STUDIO_URL_AND_SCHEMA = pytest.param(
{
"url": "https://example.com",
"schema": SimpleSchema.model_json_schema(),
},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-and-schema-args",
)
AI_STUDIO_URL_AND_RENDER_JAVASCRIPT = pytest.param(
{
"url": "https://example.com",
"render_javascript": True,
},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-and-render-js-args",
)
AI_STUDIO_QUERY_AND_RETURN_CONTENT = pytest.param(
{
"url": "https://example.com",
"return_content": True,
},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-and-return-content-args",
)
AI_STUDIO_URL_AND_RETURN_SOURCES_LIMIT = pytest.param(
{
"url": "https://example.com",
"return_sources_limit": 10,
},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-and-return-sources-limit-args",
)
AI_STUDIO_URL_AND_GEO_LOCATION = pytest.param(
{
"url": "https://example.com",
"geo_location": "US",
},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-and-geo_location-args",
)
AI_STUDIO_URL_AND_LIMIT = pytest.param(
{
"url": "https://example.com",
"limit": 5,
},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="url-with-user-prompt-and-limit-args",
)
AI_STUDIO_USER_PROMPT = pytest.param(
{
"user_prompt": "Scrape price and title",
},
does_not_raise(),
AI_STUDIO_JSON_RESPONSE,
{"data": "value"},
id="user-prompt-args",
)