""" 历史记录管理器单元测试 """ import unittest import sys import tempfile import shutil from pathlib import Path # 添加项目根目录到路径 sys.path.insert(0, str(Path(__file__).parent.parent)) from history.manager import HistoryManager, TaskRecord class TestHistoryManager(unittest.TestCase): """历史记录管理器测试""" def setUp(self): """创建临时目录用于测试""" self.temp_dir = Path(tempfile.mkdtemp()) self.manager = HistoryManager(self.temp_dir) def tearDown(self): """清理临时目录""" shutil.rmtree(self.temp_dir, ignore_errors=True) def test_add_record(self): """测试添加记录""" record = self.manager.add_record( task_id="test_001", user_input="复制文件", intent_label="execution", intent_confidence=0.95, execution_plan="复制所有文件", code="shutil.copy(...)", success=True, duration_ms=100 ) self.assertEqual(record.task_id, "test_001") self.assertEqual(record.user_input, "复制文件") self.assertTrue(record.success) def test_get_all(self): """测试获取所有记录""" # 添加多条记录 for i in range(3): self.manager.add_record( task_id=f"test_{i:03d}", user_input=f"任务 {i}", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100 ) records = self.manager.get_all() self.assertEqual(len(records), 3) def test_get_recent(self): """测试获取最近记录""" # 添加 5 条记录 for i in range(5): self.manager.add_record( task_id=f"test_{i:03d}", user_input=f"任务 {i}", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100 ) # 获取最近 3 条 recent = self.manager.get_recent(3) self.assertEqual(len(recent), 3) # 最新的在前 self.assertEqual(recent[0].task_id, "test_004") def test_get_by_id(self): """测试根据 ID 获取记录""" self.manager.add_record( task_id="unique_id", user_input="测试", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100 ) record = self.manager.get_by_id("unique_id") self.assertIsNotNone(record) self.assertEqual(record.task_id, "unique_id") # 不存在的 ID not_found = self.manager.get_by_id("not_exist") self.assertIsNone(not_found) def test_clear(self): """测试清空记录""" # 添加记录 self.manager.add_record( task_id="test", user_input="测试", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100 ) self.assertEqual(len(self.manager.get_all()), 1) # 清空 self.manager.clear() self.assertEqual(len(self.manager.get_all()), 0) def test_get_stats(self): """测试统计信息""" # 添加成功和失败的记录 self.manager.add_record( task_id="success_1", user_input="成功任务", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100 ) self.manager.add_record( task_id="success_2", user_input="成功任务2", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=200 ) self.manager.add_record( task_id="failed_1", user_input="失败任务", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=False, duration_ms=50 ) stats = self.manager.get_stats() self.assertEqual(stats['total'], 3) self.assertEqual(stats['success'], 2) self.assertEqual(stats['failed'], 1) self.assertAlmostEqual(stats['success_rate'], 2/3) def test_persistence(self): """测试持久化""" # 添加记录 self.manager.add_record( task_id="persist_test", user_input="持久化测试", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100 ) # 创建新的管理器实例(模拟重启) new_manager = HistoryManager(self.temp_dir) # 应该能读取到之前的记录 records = new_manager.get_all() self.assertEqual(len(records), 1) self.assertEqual(records[0].task_id, "persist_test") def test_max_history_size(self): """测试历史记录数量限制""" # 添加超过限制的记录 for i in range(HistoryManager.MAX_HISTORY_SIZE + 10): self.manager.add_record( task_id=f"test_{i:03d}", user_input=f"任务 {i}", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100 ) # 应该只保留最大数量 records = self.manager.get_all() self.assertEqual(len(records), HistoryManager.MAX_HISTORY_SIZE) class TestTaskRecord(unittest.TestCase): """任务记录数据类测试""" def test_create_record(self): """测试创建记录""" record = TaskRecord( task_id="test", timestamp="2024-01-01 12:00:00", user_input="测试", intent_label="execution", intent_confidence=0.9, execution_plan="计划", code="代码", success=True, duration_ms=100, stdout="输出", stderr="", log_path="/path/to/log" ) self.assertEqual(record.task_id, "test") self.assertTrue(record.success) self.assertEqual(record.duration_ms, 100) if __name__ == '__main__': unittest.main()