blob: d9782a6451787a09a817395d3373849088f32334 [file] [log] [blame] [raw]
#!/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()