149 lines
4.3 KiB
Python
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"
|