You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

149 lines
5.3 KiB

#!/usr/bin/env python3
"""
专门测试API端点的脚本
"""
import asyncio
import json
import sys
import os
# 添加项目根目录到Python路径
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from app.core.websocket.manager import websocket_manager
from app.schemas.websocket import CreateWebSocketClientRequest
from app.utils.log import get_logger
logger = get_logger(__name__)
async def test_api_endpoint_simulation():
"""模拟API端点的完整流程"""
print("=== API端点模拟测试 ===")
# 模拟API请求
test_request = {
"name": "test_1",
"url": "ws://localhost:8080/ws",
"heartbeat_interval": 120
}
print(f"模拟API请求: {json.dumps(test_request, indent=2)}")
try:
# 1. 创建请求对象(模拟API验证)
request = CreateWebSocketClientRequest(**test_request)
print("✅ 请求验证通过")
# 2. 创建客户端
print("1. 创建WebSocket客户端...")
client = await websocket_manager.create_client(request.name, request.url)
print(f" ✅ 客户端创建成功: {client.name}")
# 3. 连接客户端
print("2. 连接WebSocket客户端...")
success = await websocket_manager.connect_client(request.name)
if success:
print(f" ✅ 连接成功: {request.name}")
# 4. 确保默认Channels存在并连接,创建适配器
default_channels = ["default", "system", "events"]
max_channel_size = 1000
print("3. 创建默认Channels和适配器...")
for ch in default_channels:
channel = websocket_manager.get_channel(ch)
if not channel:
channel = await websocket_manager.create_channel(ch, max_channel_size)
await channel.connect()
await websocket_manager.create_adapter(request.name, ch, request.heartbeat_interval)
print(f" ✅ Channel {ch} 和适配器创建成功")
# 5. 检查最终状态
print("4. 检查最终状态...")
client = websocket_manager.get_client(request.name)
if client:
stats = client.get_stats()
print(f" 客户端状态: {stats['state']}")
print(f" 连接状态: {stats['is_connected']}")
print(f" 重连次数: {stats['reconnect_attempts']}")
# 6. 检查适配器状态
print("5. 检查适配器状态...")
for ch in default_channels:
adapter = websocket_manager.get_adapter(request.name, ch)
if adapter:
adapter_stats = adapter.get_stats()
print(f" 适配器 {ch}: 发送任务运行={adapter_stats['send_task_running']}")
# 7. 模拟成功响应
response_data = {
"name": request.name,
"url": request.url,
"status": "connected",
"heartbeat_interval": request.heartbeat_interval
}
print(f"✅ API响应: {json.dumps(response_data, indent=2)}")
# 8. 等待一段时间观察稳定性
print("6. 等待5秒观察连接稳定性...")
await asyncio.sleep(5)
# 9. 再次检查状态
client = websocket_manager.get_client(request.name)
if client:
stats = client.get_stats()
print(f" 5秒后状态: {stats['state']}")
print(f" 5秒后连接: {stats['is_connected']}")
# 10. 断开连接
print("7. 断开WebSocket客户端...")
await websocket_manager.disconnect_client(request.name)
print(f" ✅ 断开成功: {request.name}")
else:
print(f" ❌ 连接失败: {request.name}")
# 模拟API错误响应
error_response = {
"success": False,
"message": f"WebSocket客户端 {request.name} 创建或连接失败",
"error_code": "CONNECTION_FAILED"
}
print(f"❌ API错误响应: {json.dumps(error_response, indent=2)}")
except Exception as e:
print(f" ❌ API测试异常: {e}")
logger.error(f"API测试异常: {e}")
# 模拟API异常响应
error_response = {
"success": False,
"message": str(e),
"error_code": "INTERNAL_ERROR"
}
print(f"❌ API异常响应: {json.dumps(error_response, indent=2)}")
# 清理
try:
await websocket_manager.remove_client("test_1")
except:
pass
async def main():
"""主函数"""
try:
await test_api_endpoint_simulation()
except KeyboardInterrupt:
print("\n测试被用户中断")
except Exception as e:
print(f"测试过程中发生异常: {e}")
logger.error(f"测试异常: {e}")
finally:
# 清理资源
print("\n清理WebSocket管理器资源...")
await websocket_manager.cleanup()
print("清理完成")
if __name__ == "__main__":
# 运行测试
asyncio.run(main())