# -*- coding: utf-8 -*- """树脂 RAG 知识库导出测试(issue #83)。 覆盖: 1. kb.resin.template.yaml 清单声明的 9 篇文档全部导出且非空(validate_export); 2. resin_kb_loader 按标题返回文本(含 GB/T 标题规范化); 3. loader 可直接用于 RagKnowledgeBase(from_template_config + loader); 4. 未知标题 → 空串。 """ import os import sys import unittest _RAGKB_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, _RAGKB_DIR) from loader import ( # noqa: E402 DEFAULT_KB_CONFIG, resin_kb_loader, validate_export, ) class TestExportCompleteness(unittest.TestCase): """导出完整性:清单 ↔ 文档文件一致。""" def test_all_listed_documents_exported(self): problems = validate_export() self.assertEqual(problems, [], f"导出不完整: {problems}") def test_document_count(self): docs = os.listdir(os.path.join(_RAGKB_DIR, "documents")) self.assertEqual(len(docs), 8) class TestLoader(unittest.TestCase): """加载器行为。""" def test_process_doc(self): text = resin_kb_loader("吸附树脂合成工艺规范") self.assertIn("悬浮聚合法", text) def test_gbt_title_normalization(self): # 标题含 / → 文件名用 -(GB/T 5475 → GB-T-5475) text = resin_kb_loader("GB/T 5475 离子交换树脂取样方法") self.assertIn("取样", text) def test_unknown_title_empty(self): self.assertEqual(resin_kb_loader("不存在的文档"), "") def test_kb_config_loads(self): import yaml with open(DEFAULT_KB_CONFIG, "r", encoding="utf-8") as fh: raw = yaml.safe_load(fh) self.assertEqual(raw["template"], "resin") class TestRagKbIntegration(unittest.TestCase): """与内核 rag-kb 集成(loader 直接可用)。""" def test_build_kb_from_export(self): import importlib.util # 挂载 core/rag-kb(目录含连字符) repo_root = os.path.dirname(os.path.dirname(os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))) rag_kb_dir = os.path.join(repo_root, "core", "rag-kb") if "rag_kb" not in sys.modules: spec = importlib.util.spec_from_file_location( "rag_kb", os.path.join(rag_kb_dir, "__init__.py"), submodule_search_locations=[rag_kb_dir]) _kb = importlib.util.module_from_spec(spec) sys.modules["rag_kb"] = _kb spec.loader.exec_module(_kb) from rag_kb import RagKnowledgeBase, load_kb_config # noqa: E402 kb = RagKnowledgeBase.from_template_config( load_kb_config(DEFAULT_KB_CONFIG), loader=resin_kb_loader) self.assertGreater(kb.doc_count, 0) hits = kb.search("交换容量测定", top_k=3, categories=None) self.assertGreater(len(hits), 0) if __name__ == "__main__": unittest.main()