#!/usr/bin/env python3 """db execparams 参数装载逻辑离线自测(不连库)。 跑法(仓库根目录):.venv/bin/python tests/skills/access-database/test_db_params.py """ import io import json import sys from pathlib import Path PROJECT_ROOT = Path(__file__).resolve().parents[3] SCRIPTS_DIR = PROJECT_ROOT / ".claude" / "skills" / "access-database" / "scripts" sys.path.insert(0, str(SCRIPTS_DIR)) import click # noqa: E402 import db # noqa: E402 def expect_exc(fn, msg): try: fn() except click.ClickException: return raise AssertionError(f"应抛 ClickException:{msg}") def main(): # --param 按序 assert db._read_params(False, ("a", "b")) == ["a", "b"] assert db._read_params(False, ()) == [] # --stdin 合法 JSON 数组(含 null/数字) assert db._read_params(True, (), stream=io.StringIO('["x", 1, null]')) == ["x", 1, None] # 大对象(含中文引号/换行)经 stdin 不破坏 big = '中文"引号"\n换行\\反斜杠' * 5000 assert db._read_params(True, (), stream=io.StringIO(json.dumps([big])))[0] == big # --stdin 与 --param 互斥 expect_exc(lambda: db._read_params(True, ("a",)), "--stdin 与 --param 互斥") # 非法 JSON expect_exc(lambda: db._read_params(True, (), stream=io.StringIO("not json")), "非法 JSON") # 非数组 expect_exc(lambda: db._read_params(True, (), stream=io.StringIO('{"a":1}')), "非数组") print("PASS:db execparams 参数装载逻辑全部通过") if __name__ == "__main__": main()