Files
2026-07-13 13:12:33 +08:00

149 lines
4.3 KiB
Python

"""CLI tests for `opensquilla search query` canonical web search mode."""
from __future__ import annotations
import json
from typer.testing import CliRunner
import opensquilla.cli.search_cmd as search_cmd
from opensquilla.cli.main import app
from opensquilla.search.types import SearchOptions
runner = CliRunner()
def test_search_query_web_search_options_use_local_search(monkeypatch):
seen_options: list[SearchOptions] = []
async def fake_run_canonical_web_search(
options: SearchOptions,
**kwargs: object,
) -> dict[str, object]:
seen_options.append(options)
assert "fetcher" in kwargs
return {
"ok": True,
"query": options.query,
"mode": options.mode,
"provider_attempts": [{"provider": "tavily", "status": "success"}],
"diagnostics": {"returned_chars": 120},
"results": [
{
"rank": 1,
"title": "Python release",
"domain": "python.org",
"url": "https://www.python.org/downloads/",
"provider": "tavily",
"fetched": False,
"excerpt": "Python release notes",
}
],
}
monkeypatch.setattr(
search_cmd,
"run_canonical_web_search",
fake_run_canonical_web_search,
)
result = runner.invoke(
app,
[
"search",
"query",
"python release",
"--mode",
"auto",
"--fetch-top-k",
"0",
"--max-results",
"5",
"--json",
],
)
assert result.exit_code == 0, result.stdout
payload = json.loads(result.stdout)
assert payload["query"] == "python release"
assert payload["mode"] == "auto"
assert payload["provider_attempts"] == [{"provider": "tavily", "status": "success"}]
assert payload["diagnostics"] == {"returned_chars": 120}
assert payload["results"][0]["title"] == "Python release"
assert seen_options == [
SearchOptions(query="python release", mode="auto", fetch_top_k=0, max_results=5)
]
def test_search_query_web_search_text_output_renders_results(monkeypatch):
async def fake_run_canonical_web_search(
options: SearchOptions,
**kwargs: object,
) -> dict[str, object]:
assert "fetcher" in kwargs
return {
"ok": True,
"query": options.query,
"mode": options.mode,
"provider_attempts": [],
"diagnostics": {},
"results": [
{
"rank": 1,
"title": "Python release notes",
"domain": "python.org",
"url": "https://www.python.org/downloads/",
"provider": "tavily",
"fetched": True,
"excerpt": "Python 3 release details.",
}
],
}
monkeypatch.setattr(
search_cmd,
"run_canonical_web_search",
fake_run_canonical_web_search,
)
result = runner.invoke(
app,
["search", "query", "python release", "--fetch-top-k", "0"],
)
assert result.exit_code == 0, result.stdout
assert "Python release notes" in result.stdout
assert "python.org" in result.stdout
assert "https://www.python.org/downloads/" in result.stdout
def test_search_query_web_search_json_failure_exits_nonzero(monkeypatch):
async def fake_run_canonical_web_search(
options: SearchOptions,
**kwargs: object,
) -> dict[str, object]:
assert "fetcher" in kwargs
return {
"ok": False,
"query": options.query,
"mode": options.mode,
"provider_attempts": [{"provider": "tavily", "status": "error"}],
"diagnostics": {},
"results": [],
"error": {"message": "network down"},
}
monkeypatch.setattr(
search_cmd,
"run_canonical_web_search",
fake_run_canonical_web_search,
)
result = runner.invoke(
app,
["search", "query", "python release", "--mode", "auto", "--json"],
)
assert result.exit_code == 1
assert json.loads(result.stdout)["error"]["message"] == "network down"