"""法规更新管理测试:检查更新、版本快照、更新文档、回滚。 用法: python3 -m unittest test_regulation -v """ import unittest import os import sys sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from bossai import RegulationUpdateManager, KnowledgeStore class RegulationUpdateTests(unittest.TestCase): """法规更新管理全流程测试。""" def setUp(self): self.mgr = RegulationUpdateManager() self.store = KnowledgeStore() # 创建测试文档 self.test_doc = self.store.add( title="测试法规-更新管理", content="原始内容:测试法规条款", source="test", doc_type="law", effective_date="2020-01-01", ) def tearDown(self): """清理测试文档。""" import psycopg2 dsn = os.getenv("DATABASE_URL", "host=localhost port=5432 dbname=mcp user=postgres") with psycopg2.connect(dsn) as conn: with conn.cursor() as cur: cur.execute("DELETE FROM knowledge_doc_versions WHERE doc_id = %s", (self.test_doc["id"],)) cur.execute("DELETE FROM knowledge_docs WHERE id = %s", (self.test_doc["id"],)) def test_check_updates_returns_list(self): """check_updates 返回需更新文档列表。""" results = self.mgr.check_updates() self.assertIsInstance(results, list) # 测试文档(2020年生效)应在列表中 found = [r for r in results if r["id"] == self.test_doc["id"]] self.assertTrue(len(found) > 0, "测试文档应在需更新列表中") self.assertIn("生效超过1年", found[0]["reasons"][0]) def test_create_snapshot(self): """create_snapshot 创建版本快照。""" snapshot = self.mgr.create_snapshot(self.test_doc["id"], reason="测试快照") self.assertEqual(snapshot["doc_id"], self.test_doc["id"]) self.assertEqual(snapshot["version_num"], 1) self.assertIn("created_at", snapshot) def test_update_document_creates_snapshot(self): """update_document 自动创建更新前快照。""" result = self.mgr.update_document( doc_id=self.test_doc["id"], content="更新后内容:新法规版本", title="测试法规-已更新", snapshot_reason="法规修订", ) self.assertEqual(result["title"], "测试法规-已更新") self.assertEqual(result["snapshot"]["version_num"], 1) self.assertIn("created_at", result["snapshot"]) def test_list_versions(self): """list_versions 返回版本列表(降序)。""" # 创建多个版本 self.mgr.update_document(self.test_doc["id"], content="v1 内容") self.mgr.update_document(self.test_doc["id"], content="v2 内容") versions = self.mgr.list_versions(self.test_doc["id"]) self.assertEqual(len(versions), 2) # 降序:最新版本在前 self.assertEqual(versions[0]["version_num"], 2) self.assertEqual(versions[1]["version_num"], 1) def test_rollback(self): """rollback 回滚到指定版本。""" # 更新两次 self.mgr.update_document(self.test_doc["id"], content="v1 内容") self.mgr.update_document(self.test_doc["id"], content="v2 内容") # 回滚到 v1 result = self.mgr.rollback(self.test_doc["id"], version_num=1) self.assertEqual(result["rolled_back_to"], 1) # 验证内容已恢复(直接查 DB) import psycopg2 dsn = os.getenv("DATABASE_URL", "host=localhost port=5432 dbname=mcp user=postgres") with psycopg2.connect(dsn) as conn: with conn.cursor() as cur: cur.execute("SELECT content FROM knowledge_docs WHERE id = %s", (self.test_doc["id"],)) content = cur.fetchone()[0] self.assertIn("原始内容", content) # v1 快照保存的是更新前的原始内容 def test_rollback_nonexistent_version(self): """回滚不存在的版本应报错。""" with self.assertRaises(ValueError): self.mgr.rollback(self.test_doc["id"], version_num=999) def test_update_nonexistent_doc(self): """更新不存在的文档应报错。""" with self.assertRaises(ValueError): self.mgr.update_document(doc_id=99999, content="test") def test_fetch_from_source_returns_empty(self): """fetch_from_source 预留接口返回空列表。""" result = self.mgr.fetch_from_source("test") self.assertEqual(result, []) if __name__ == '__main__': unittest.main(verbosity=2)