"""知识库(KnowledgeBase)单元测试。""" from router_system.knowledge import KnowledgeBase, Rule def test_builtin_rules_loaded(): kb = KnowledgeBase() # 内置规则 + 文件规则合并后应至少有 10+ 条 assert kb.rules_count() >= 10 # 文件规则按 id 覆盖内置(code-sort 存在且可命中) r = kb.rule("code-sort") assert r is not None assert r.template == "code-implement" def test_match_priority_order(): kb = KnowledgeBase() hits = kb.match("用 Python 写一个快速排序函数", domain="code") assert hits, "应命中 code 领域规则" # 优先级降序:排序规则(90) 应在通用实现规则(50) 之前 assert hits[0].id == "code-sort" priorities = [h.priority for h in hits] assert priorities == sorted(priorities, reverse=True) def test_match_cross_domain(): kb = KnowledgeBase() # 同一文本在不同领域过滤下命中不同规则 code_hits = kb.match("帮我调试报错 TypeError", domain="code") assert code_hits and code_hits[0].id == "code-debug" # 领域过滤:不指定 domain 时全领域匹配 all_hits = kb.match("帮我调试报错 TypeError") assert len(all_hits) >= len(code_hits) def test_task_template(): kb = KnowledgeBase() tpl = kb.task_template("code-implement") assert tpl is not None steps = tpl["steps"] assert len(steps) == 4 ids = [s["id"] for s in steps] assert ids == ["analyze", "design", "implement", "verify"] # 依赖关系存在 assert steps[1]["deps"] == ["analyze"] def test_facts(): kb = KnowledgeBase() legal_facts = kb.facts("legal") assert any("竞业" in f["statement"] for f in legal_facts) medical_facts = kb.facts("medical") assert any("高血压" in f["statement"] for f in medical_facts) def test_rule_matches_case_insensitive(): r = Rule(id="t", domain="code", patterns=["Sort", "Python"]) assert r.matches("用 python 写一个 sort 算法") assert r.matches("PYTHON 快速排序") assert not r.matches("java 写个函数")