tests/test_xkb_ask_runtime.py
Rama main · réplica de lectura del repositorio original.
"""Ask is an answer client; retrieval options cannot select a second search stack."""
from __future__ import annotations
import contextlib
import io
import json
import sys
import unittest
from pathlib import Path
from unittest import mock
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "scripts"))
import xkb_ask as ask
class AskRuntime(unittest.TestCase):
def test_legacy_switches_use_the_shared_contract(self):
packet = {"records": [], "retrieval_mode": "keyword", "query": "fixture", "count": 0}
args = ["xkb_ask", "fixture", "--json", "--legacy-search", "--no-wiki",
"--no-gbrain", "--max-cards", "2", "--env-file", "fixture.env"]
with mock.patch.object(sys, "argv", args), mock.patch.object(ask, "run_configured", return_value=packet) as run, \
mock.patch.object(ask, "llm_call", return_value="answer"), \
contextlib.redirect_stdout(io.StringIO()) as out, contextlib.redirect_stderr(io.StringIO()) as err:
self.assertEqual(ask.main(), 0)
self.assertFalse(run.call_args.kwargs["options"]["wiki"])
self.assertFalse(run.call_args.kwargs["options"]["semantic"])
self.assertEqual(run.call_args.kwargs["options"]["max_cards"], 2)
self.assertEqual(run.call_args.kwargs["env_file"], "fixture.env")
self.assertIn("--legacy-search", err.getvalue())
self.assertEqual(json.loads(out.getvalue())["answer"], "answer")
def test_invalid_quota_stops_before_retrieval(self):
for value in ("-1", "51"):
with mock.patch.object(sys, "argv", ["xkb_ask", "fixture", "--max-wiki", value]), \
mock.patch.object(ask, "run_configured") as run, contextlib.redirect_stderr(io.StringIO()):
with self.assertRaises(SystemExit):
ask.main()
run.assert_not_called()
def test_no_cards_remains_an_explicit_remote_option(self):
with mock.patch.object(sys, "argv", ["xkb_ask", "fixture", "--no-cards"]), \
mock.patch.object(ask, "run_configured", side_effect=RuntimeError("HTTP 401")) as run, \
mock.patch.object(ask, "llm_call") as llm, contextlib.redirect_stderr(io.StringIO()):
self.assertEqual(ask.main(), 2)
self.assertFalse(run.call_args.kwargs["options"]["cards"])
llm.assert_not_called()
if __name__ == "__main__":
unittest.main()