| #!/usr/bin/env python3 |
| """ |
| 批量修复单元测试脚本 |
| 主要修复由于Claude Code SDK API变更导致的测试失败 |
| """ |
| |
| import os |
| import re |
| import sys |
| from pathlib import Path |
| |
| def fix_claude_adapter_tests(): |
| """修复Claude Adapter测试""" |
| test_file = Path("tests/unit/telegram/test_claude_adapter_extended.py") |
| |
| with open(test_file, 'r', encoding='utf-8') as f: |
| content = f.read() |
| |
| # 修复所有使用adapter_with_mock的测试方法 |
| # 将它们改为直接创建adapter和mock的模式 |
| |
| patterns_to_fix = [ |
| # 修复test_process_message_agent_error |
| (r'async def test_process_message_agent_error\(self, adapter_with_mock, mock_agent, sample_context, sample_user_info\):(.*?)assert "❌ 抱歉,处理您的消息时出现了错误。" in result', |
| '''async def test_process_message_agent_error(self, mock_agent, sample_context, sample_user_info): |
| """测试Agent处理错误""" |
| with patch('claude_agent.telegram.claude_adapter.PersistenceManager') as mock_persistence: |
| mock_persistence.return_value.load_agent_state.return_value = None |
| mock_persistence.return_value.save_agent_state.return_value = True |
| mock_persistence.return_value.save_conversation_history.return_value = True |
| |
| # 设置Agent抛出异常 |
| mock_agent.process_user_input.side_effect = Exception("Agent error") |
| |
| adapter = ClaudeAgentAdapter() |
| test_chat_id = 'test_chat' |
| adapter._agents[test_chat_id] = mock_agent |
| |
| message = "Test message" |
| |
| result = await adapter.process_message(message, sample_context, sample_user_info) |
| |
| # 验证返回错误消息 |
| assert "❌ 抱歉,处理您的消息时出现了错误。" in result'''), |
| ] |
| |
| for pattern, replacement in patterns_to_fix: |
| content = re.sub(pattern, replacement, content, flags=re.DOTALL) |
| |
| with open(test_file, 'w', encoding='utf-8') as f: |
| f.write(content) |
| |
| print(f"✅ 修复 {test_file}") |
| |
| def fix_core_agent_tests(): |
| """修复核心Agent测试""" |
| test_file = Path("tests/unit/test_core/test_agent.py") |
| |
| with open(test_file, 'r', encoding='utf-8') as f: |
| content = f.read() |
| |
| # 修复Claude Code SDK相关的测试 |
| # 主要是query()函数的mock |
| |
| # 修复import |
| if "from claude_code_sdk import" not in content: |
| content = content.replace( |
| "import sys", |
| "import sys\nfrom claude_code_sdk import query" |
| ) |
| |
| # 修复query的patch路径 |
| content = content.replace( |
| "patch('src.claude_agent.core.agent.query'", |
| "patch('claude_code_sdk.query'" |
| ) |
| |
| with open(test_file, 'w', encoding='utf-8') as f: |
| f.write(content) |
| |
| print(f"✅ 修复 {test_file}") |
| |
| def fix_stream_sender_tests(): |
| """修复流式发送器测试""" |
| test_file = Path("tests/unit/telegram/test_stream_sender.py") |
| |
| with open(test_file, 'r', encoding='utf-8') as f: |
| content = f.read() |
| |
| # 修复_clean_markdown测试,因为我们移除了字符转义 |
| content = re.sub( |
| r'def test_clean_markdown.*?assert.*?\\\[.*?\\\].*?\\\\\\(.*?\\\\\\)', |
| '''def test_clean_markdown(self, stream_sender): |
| """测试Markdown清理功能""" |
| # 现在不转义Markdown字符,保持原样 |
| test_cases = [ |
| ("**bold** and *italic*", "**bold** and *italic*"), |
| ("[link](url)", "[link](url)"), |
| ("`code`", "`code`"), |
| ("# Header", "# Header"), |
| ("> quote", "> quote"), |
| ] |
| |
| for input_text, expected in test_cases: |
| result = stream_sender._clean_markdown(input_text) |
| assert result == expected''', |
| content, |
| flags=re.DOTALL |
| ) |
| |
| with open(test_file, 'w', encoding='utf-8') as f: |
| f.write(content) |
| |
| print(f"✅ 修复 {test_file}") |
| |
| def main(): |
| """主函数""" |
| print("🔧 开始批量修复单元测试...") |
| |
| fix_claude_adapter_tests() |
| fix_core_agent_tests() |
| fix_stream_sender_tests() |
| |
| print("✅ 测试修复完成!") |
| |
| if __name__ == "__main__": |
| main() |