forked from datawhale/whale-town-end
- 新增JWT认证守卫(JwtAuthGuard)和当前用户装饰器(CurrentUser) - 添加JWT使用示例和完整的认证流程文档 - 实现Zulip用户管理服务,支持用户查询、验证和管理 - 实现Zulip用户注册服务,支持新用户创建和注册流程 - 添加完整的单元测试覆盖 - 新增真实环境测试脚本,验证Zulip API集成 - 更新.gitignore,排除.kiro目录 主要功能: - JWT令牌验证和用户信息提取 - 用户存在性检查和信息获取 - Zulip API集成和错误处理 - 完整的测试覆盖和文档
275 lines
7.7 KiB
JavaScript
275 lines
7.7 KiB
JavaScript
/**
|
||
* Zulip用户管理真实环境测试脚本
|
||
*
|
||
* 功能描述:
|
||
* - 测试Zulip用户管理功能在真实环境下的表现
|
||
* - 验证用户查询、验证等API调用是否正常工作
|
||
* - 检查配置是否正确
|
||
*
|
||
* 使用方法:
|
||
* node test_zulip_user_management.js
|
||
*
|
||
* @author angjustinl
|
||
* @version 1.0.0
|
||
* @since 2025-01-06
|
||
*/
|
||
|
||
const https = require('https');
|
||
|
||
// 配置信息
|
||
const config = {
|
||
zulipServerUrl: 'https://zulip.xinghangee.icu',
|
||
zulipBotEmail: 'angjustinl@mail.angforever.top',
|
||
zulipBotApiKey: 'lCPWCPfGh7WUHxwN56GF8oYXOpqNfGF8',
|
||
};
|
||
|
||
/**
|
||
* 获取所有用户列表
|
||
*/
|
||
async function getAllUsers() {
|
||
console.log('📋 获取所有用户列表...');
|
||
|
||
try {
|
||
const url = `${config.zulipServerUrl}/api/v1/users`;
|
||
const auth = Buffer.from(`${config.zulipBotEmail}:${config.zulipBotApiKey}`).toString('base64');
|
||
|
||
const response = await fetch(url, {
|
||
method: 'GET',
|
||
headers: {
|
||
'Authorization': `Basic ${auth}`,
|
||
'Content-Type': 'application/json',
|
||
},
|
||
});
|
||
|
||
if (!response.ok) {
|
||
console.log(`❌ 获取用户列表失败: ${response.status} ${response.statusText}`);
|
||
return { success: false, error: `${response.status} ${response.statusText}` };
|
||
}
|
||
|
||
const data = await response.json();
|
||
const users = data.members?.map(user => ({
|
||
userId: user.user_id,
|
||
email: user.email,
|
||
fullName: user.full_name,
|
||
isActive: user.is_active,
|
||
isAdmin: user.is_admin,
|
||
isBot: user.is_bot,
|
||
})) || [];
|
||
|
||
console.log(`✅ 成功获取 ${users.length} 个用户`);
|
||
|
||
// 显示前几个用户信息
|
||
console.log('👥 用户列表预览:');
|
||
users.slice(0, 5).forEach((user, index) => {
|
||
console.log(` ${index + 1}. ${user.fullName} (${user.email})`);
|
||
console.log(` ID: ${user.userId}, 活跃: ${user.isActive}, 管理员: ${user.isAdmin}, 机器人: ${user.isBot}`);
|
||
});
|
||
|
||
if (users.length > 5) {
|
||
console.log(` ... 还有 ${users.length - 5} 个用户`);
|
||
}
|
||
|
||
return { success: true, users, totalCount: users.length };
|
||
|
||
} catch (error) {
|
||
console.error(`❌ 获取用户列表异常:`, error.message);
|
||
return { success: false, error: error.message };
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 检查指定用户是否存在
|
||
*/
|
||
async function checkUserExists(email) {
|
||
console.log(`🔍 检查用户是否存在: ${email}`);
|
||
|
||
try {
|
||
const usersResult = await getAllUsers();
|
||
if (!usersResult.success) {
|
||
console.log(`❌ 无法获取用户列表: ${usersResult.error}`);
|
||
return false;
|
||
}
|
||
|
||
const userExists = usersResult.users.some(user =>
|
||
user.email.toLowerCase() === email.toLowerCase()
|
||
);
|
||
|
||
console.log(`✅ 用户存在性检查完成: ${userExists ? '存在' : '不存在'}`);
|
||
return userExists;
|
||
|
||
} catch (error) {
|
||
console.error(`❌ 检查用户存在性失败:`, error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取用户详细信息
|
||
*/
|
||
async function getUserInfo(email) {
|
||
console.log(`📝 获取用户信息: ${email}`);
|
||
|
||
try {
|
||
const usersResult = await getAllUsers();
|
||
if (!usersResult.success) {
|
||
console.log(`❌ 无法获取用户列表: ${usersResult.error}`);
|
||
return { success: false, error: usersResult.error };
|
||
}
|
||
|
||
const user = usersResult.users.find(u =>
|
||
u.email.toLowerCase() === email.toLowerCase()
|
||
);
|
||
|
||
if (!user) {
|
||
console.log(`❌ 用户不存在: ${email}`);
|
||
return { success: false, error: '用户不存在' };
|
||
}
|
||
|
||
console.log(`✅ 用户信息获取成功:`);
|
||
console.log(` 用户ID: ${user.userId}`);
|
||
console.log(` 邮箱: ${user.email}`);
|
||
console.log(` 姓名: ${user.fullName}`);
|
||
console.log(` 状态: ${user.isActive ? '活跃' : '非活跃'}`);
|
||
console.log(` 权限: ${user.isAdmin ? '管理员' : '普通用户'}`);
|
||
console.log(` 类型: ${user.isBot ? '机器人' : '真实用户'}`);
|
||
|
||
return { success: true, user };
|
||
|
||
} catch (error) {
|
||
console.error(`❌ 获取用户信息失败:`, error.message);
|
||
return { success: false, error: error.message };
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 测试用户API Key
|
||
*/
|
||
async function testUserApiKey(email, apiKey) {
|
||
console.log(`🔑 测试用户API Key: ${email}`);
|
||
|
||
try {
|
||
const url = `${config.zulipServerUrl}/api/v1/users/me`;
|
||
const auth = Buffer.from(`${email}:${apiKey}`).toString('base64');
|
||
|
||
const response = await fetch(url, {
|
||
method: 'GET',
|
||
headers: {
|
||
'Authorization': `Basic ${auth}`,
|
||
'Content-Type': 'application/json',
|
||
},
|
||
});
|
||
|
||
const isValid = response.ok;
|
||
|
||
if (isValid) {
|
||
const data = await response.json();
|
||
console.log(`✅ API Key有效! 用户信息:`);
|
||
console.log(` 用户ID: ${data.user_id}`);
|
||
console.log(` 邮箱: ${data.email}`);
|
||
console.log(` 姓名: ${data.full_name}`);
|
||
} else {
|
||
console.log(`❌ API Key无效: ${response.status} ${response.statusText}`);
|
||
}
|
||
|
||
return isValid;
|
||
|
||
} catch (error) {
|
||
console.error(`❌ 测试API Key异常:`, error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 测试连接
|
||
*/
|
||
async function testConnection() {
|
||
console.log('🔗 测试Zulip服务器连接...');
|
||
|
||
try {
|
||
const url = `${config.zulipServerUrl}/api/v1/server_settings`;
|
||
const response = await fetch(url);
|
||
|
||
if (response.ok) {
|
||
const data = await response.json();
|
||
console.log(`✅ 连接成功! 服务器信息:`);
|
||
console.log(` 版本: ${data.zulip_version || '未知'}`);
|
||
console.log(` 服务器: ${data.realm_name || '未知'}`);
|
||
return true;
|
||
} else {
|
||
console.log(`❌ 连接失败: ${response.status} ${response.statusText}`);
|
||
return false;
|
||
}
|
||
} catch (error) {
|
||
console.error(`❌ 连接异常:`, error.message);
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 主测试函数
|
||
*/
|
||
async function main() {
|
||
console.log('🎯 开始Zulip用户管理测试');
|
||
console.log('='.repeat(50));
|
||
|
||
// 1. 测试连接
|
||
const connected = await testConnection();
|
||
if (!connected) {
|
||
console.log('❌ 无法连接到Zulip服务器,测试终止');
|
||
return;
|
||
}
|
||
|
||
console.log('');
|
||
|
||
// 2. 获取所有用户列表
|
||
const usersResult = await getAllUsers();
|
||
if (!usersResult.success) {
|
||
console.log('❌ 无法获取用户列表,测试终止');
|
||
return;
|
||
}
|
||
|
||
console.log('');
|
||
|
||
// 3. 测试用户存在性检查
|
||
const testEmails = [
|
||
'angjustinl@mail.angforever.top', // 应该存在
|
||
'nonexistent@example.com', // 应该不存在
|
||
];
|
||
|
||
console.log('🔍 测试用户存在性检查:');
|
||
for (const email of testEmails) {
|
||
const exists = await checkUserExists(email);
|
||
console.log(` ${email}: ${exists ? '✅ 存在' : '❌ 不存在'}`);
|
||
}
|
||
|
||
console.log('');
|
||
|
||
// 4. 测试获取用户信息
|
||
console.log('📝 测试获取用户信息:');
|
||
const existingEmail = 'angjustinl@mail.angforever.top';
|
||
const userInfoResult = await getUserInfo(existingEmail);
|
||
|
||
console.log('');
|
||
|
||
// 5. 测试API Key验证(如果有的话)
|
||
console.log('🔑 测试API Key验证:');
|
||
const testApiKey = 'lCPWCPfGh7WUHxwN56GF8oYXOpqNfGF8'; // 这是我们的测试API Key
|
||
const apiKeyValid = await testUserApiKey(existingEmail, testApiKey);
|
||
|
||
console.log('');
|
||
console.log('📊 测试结果总结:');
|
||
console.log(`✅ 服务器连接: 正常`);
|
||
console.log(`✅ 用户列表获取: 正常 (${usersResult.totalCount} 个用户)`);
|
||
console.log(`✅ 用户存在性检查: 正常`);
|
||
console.log(`✅ 用户信息获取: ${userInfoResult.success ? '正常' : '异常'}`);
|
||
console.log(`✅ API Key验证: ${apiKeyValid ? '正常' : '异常'}`);
|
||
|
||
console.log('');
|
||
console.log('🎉 用户管理功能测试完成');
|
||
}
|
||
|
||
// 运行测试
|
||
main().catch(error => {
|
||
console.error('💥 测试过程中发生未处理的错误:', error);
|
||
process.exit(1);
|
||
}); |