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.

194 lines
6.7 KiB

const WebSocket = require('ws');
// 测试配置
const config = {
wsUrl: 'ws://localhost:3003',
managerCredentials: {
managerId: 22, // 使用数字格式的客服ID
userType: 'manager'
},
testTimeout: 10000, // 10秒超时
messageTimeout: 5000 // 5秒消息等待超时
};
// 简化的测试函数
async function testConversationListFormat() {
console.log('开始测试客服会话列表查询(正确消息格式)');
console.log(`连接到WebSocket服务器: ${config.wsUrl}`);
return new Promise((resolve, reject) => {
let ws;
let connected = false;
let authenticated = false;
let listMessageSent = false;
// 超时处理
const timeoutId = setTimeout(() => {
console.error('测试超时!');
if (ws && connected) {
ws.close();
}
reject(new Error('测试超时:未在规定时间内完成所有操作'));
}, config.testTimeout);
try {
// 创建WebSocket连接
ws = new WebSocket(config.wsUrl);
// 连接打开事件
ws.on('open', () => {
console.log('✓ WebSocket连接已建立');
connected = true;
// 发送认证请求
const authData = {
type: 'auth',
managerId: config.managerCredentials.managerId,
userType: config.managerCredentials.userType
};
console.log(`发送客服认证请求:`, authData);
ws.send(JSON.stringify(authData));
});
// 接收消息事件
ws.on('message', (data) => {
try {
const messageStr = data.toString('utf8');
console.log('收到原始消息数据:', messageStr);
const message = JSON.parse(messageStr);
console.log('解析后的消息:', message);
// 处理认证响应
if (message.type === 'auth_success') {
console.log('✓ 客服认证成功');
authenticated = true;
// 只使用'list'操作格式查询会话列表
setTimeout(() => {
if (!listMessageSent) {
listMessageSent = true;
const listRequest = {
action: 'list'
};
console.log(`发送会话列表查询请求 (action: 'list'):`, listRequest);
ws.send(JSON.stringify(listRequest));
// 为'list'请求设置专用超时
setTimeout(() => {
console.log('未收到会话列表响应,尝试直接发送消息类型为"get_conversations"的请求');
const directRequest = {
type: 'get_conversations'
};
console.log(`发送直接请求 (type: 'get_conversations'):`, directRequest);
ws.send(JSON.stringify(directRequest));
}, config.messageTimeout);
}
}, 1000);
} else if (message.type === 'session_list' && message.data) {
// 处理'list'操作的响应
console.log('✓ 收到会话列表响应 (session_list格式)');
console.log(`会话列表包含 ${message.data.length} 个会话`);
// 清理并完成测试
clearTimeout(timeoutId);
setTimeout(() => {
ws.close();
resolve({
success: true,
responseType: 'session_list',
data: message.data
});
}, 1000);
} else if (message.type === 'conversations_list' && message.payload && message.payload.conversations) {
// 处理'get_conversations'操作的响应
console.log('✓ 收到会话列表响应 (conversations_list格式)');
console.log(`会话列表包含 ${message.payload.conversations.length} 个会话`);
// 清理并完成测试
clearTimeout(timeoutId);
setTimeout(() => {
ws.close();
resolve({
success: true,
responseType: 'conversations_list',
data: message.payload.conversations
});
}, 1000);
} else if (message.type === 'heartbeat') {
// 记录心跳消息
console.log('收到心跳消息');
} else if (message.type === 'error') {
// 处理错误
console.error('✗ 收到错误消息:', message.message);
} else {
console.log('收到未预期的消息类型:', message.type);
}
} catch (parseError) {
console.error('解析消息失败:', parseError);
console.log('原始消息数据:', data.toString('utf8'));
}
});
// 错误事件处理
ws.on('error', (error) => {
console.error('WebSocket错误:', error);
});
// 连接关闭事件
ws.on('close', (code, reason) => {
console.log(`WebSocket连接已关闭: 代码=${code}, 原因=${reason}`);
clearTimeout(timeoutId);
// 即使连接关闭,也尝试完成测试
resolve({ success: false, message: '连接已关闭但未收到会话列表' });
});
} catch (error) {
console.error('测试初始化失败:', error);
clearTimeout(timeoutId);
reject(error);
}
});
}
// 运行测试
testConversationListFormat()
.then(result => {
console.log('\n=== 测试结果 ===');
if (result.success) {
console.log('测试成功!');
console.log(`响应类型: ${result.responseType}`);
console.log(`获取到 ${result.data.length} 个会话`);
if (result.data.length > 0) {
console.log('=== 会话详情(前3个)===');
result.data.slice(0, 3).forEach((conv, index) => {
console.log(`\n会话 ${index + 1}:`);
console.log(` 会话ID: ${conv.conversation_id || '未知'}`);
console.log(` 用户ID: ${conv.user_id || '未知'}`);
console.log(` 客服ID: ${conv.manager_id || '未知'}`);
console.log(` 最后消息: ${conv.last_message || '无'}`);
console.log(` 未读计数: ${conv.unread_count || '未知'}`);
console.log(` 用户在线: ${conv.user_online ? '是' : '否'}`);
console.log(` 客服在线: ${conv.cs_online ? '是' : '否'}`);
});
}
} else {
console.log('测试未完全成功,但完成了连接和认证');
console.log('消息:', result.message);
}
})
.catch(error => {
console.error('\n=== 测试执行失败 ===');
console.error('错误:', error.message);
})
.finally(() => {
console.log('\n测试完成!');
});