// 测试客服在线状态检查逻辑 console.log('=== 测试客服在线状态检查逻辑 ===\n'); // 模拟onlineManagers Map和onlineStatusMap const onlineManagers = new Map(); const onlineStatusMap = {}; // 模拟handleAuth函数中添加客服到onlineManagers的逻辑 function simulateAuth(managerId) { console.log(`模拟客服认证: managerId=${managerId}`); // 在handleAuth中是这样添加的:onlineManagers.set(managerId, ws); const key = String(managerId); // 确保类型一致 onlineManagers.set(key, { connected: true }); console.log(` 已添加到onlineManagers: key=${key}`); // 模拟更新数据库状态 onlineStatusMap[key] = true; } // 复制isManagerOnline函数的实现 function isManagerOnline(id, managerId) { console.log(`\n调用isManagerOnline: id=${id}, managerId=${managerId}`); // 首先从内存中的onlineManagers Map中检查 const stringId = String(id); const stringManagerId = String(managerId); console.log(` 转换后的ID: stringId=${stringId}, stringManagerId=${stringManagerId}`); console.log(` onlineManagers中的键:`, [...onlineManagers.keys()]); // 检查id或managerId是否在onlineManagers中 for (const key of onlineManagers.keys()) { console.log(` 比较key=${key} 与 stringId=${stringId} 或 stringManagerId=${stringManagerId}`); if (key === stringId || key === stringManagerId) { console.log(` ✅ 内存匹配成功: key=${key}`); return true; } } console.log(` ❌ 内存匹配失败`); // 其次从数据库查询结果检查 const dbStatus = onlineStatusMap[stringId] || (stringManagerId && onlineStatusMap[stringManagerId]) || false; console.log(` 数据库状态: id=${stringId} -> ${onlineStatusMap[stringId]}, managerId=${stringManagerId} -> ${onlineStatusMap[stringManagerId]}, 最终状态=${dbStatus}`); return dbStatus; } // 模拟/api/managers接口中的处理逻辑 function simulateApiResponse(personId, personManagerId) { console.log(`\n=== 模拟API响应生成 ===`); console.log(` 客服信息: id=${personId}, managerId=${personManagerId}`); const online = isManagerOnline(personId, personManagerId); console.log(` API返回: online=${online}`); return online; } // 测试场景1: 正常匹配 (managerId完全匹配) console.log('\n🔍 测试场景1: managerId完全匹配'); simulateAuth(22); const result1 = simulateApiResponse(1001, 22); console.log(`\n结果1: ${result1 ? '✅ 在线' : '❌ 离线'} - 应该在线`); // 测试场景2: ID格式不匹配 (数字vs字符串) console.log('\n🔍 测试场景2: ID格式不匹配'); onlineManagers.clear(); // 清空onlineStatusMap而不是重新赋值 Object.keys(onlineStatusMap).forEach(key => delete onlineStatusMap[key]); simulateAuth('22'); // 使用字符串格式 const result2 = simulateApiResponse(1001, 22); // 使用数字格式 console.log(`\n结果2: ${result2 ? '✅ 在线' : '❌ 离线'} - 应该在线`); // 测试场景3: 测试不存在的ID console.log('\n🔍 测试场景3: 测试不存在的ID'); const result3 = simulateApiResponse(999, 999); console.log(`\n结果3: ${result3 ? '✅ 在线' : '❌ 离线'} - 应该离线`); // 测试场景4: 测试id和managerId都存在 console.log('\n🔍 测试场景4: 测试id和managerId都存在'); onlineManagers.clear(); // 清空onlineStatusMap而不是重新赋值 Object.keys(onlineStatusMap).forEach(key => delete onlineStatusMap[key]); simulateAuth(1001); // 使用person.id作为key simulateAuth(22); // 使用person.managerId作为key const result4 = simulateApiResponse(1001, 22); console.log(`\n结果4: ${result4 ? '✅ 在线' : '❌ 离线'} - 应该在线`); // 测试场景5: 测试isManagerOnline函数的边界情况 console.log('\n🔍 测试场景5: 边界情况测试'); onlineManagers.clear(); // 清空onlineStatusMap而不是重新赋值 Object.keys(onlineStatusMap).forEach(key => delete onlineStatusMap[key]); simulateAuth(22); // 测试undefined/null console.log('\n 测试undefined/null:'); console.log(` isManagerOnline(undefined, 22): ${isManagerOnline(undefined, 22)}`); console.log(` isManagerOnline(1001, null): ${isManagerOnline(1001, null)}`); // 测试空字符串 console.log('\n 测试空字符串:'); console.log(` isManagerOnline("", 22): ${isManagerOnline("", 22)}`); console.log(` isManagerOnline(1001, ""): ${isManagerOnline(1001, "")}`); // 总结 console.log('\n=== 测试总结 ==='); console.log(`场景1: ${result1 ? '✅ 通过' : '❌ 失败'} - managerId完全匹配`); console.log(`场景2: ${result2 ? '✅ 通过' : '❌ 失败'} - ID格式不匹配`); console.log(`场景3: ${!result3 ? '✅ 通过' : '❌ 失败'} - 不存在的ID`); console.log(`场景4: ${result4 ? '✅ 通过' : '❌ 失败'} - id和managerId都存在`);