Ctrl K
ComunidadGuías…

tests/test_xkb_ask_runtime.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""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()