Files
hzdyjs/test/permission-verification-test.js
T
2025-06-30 20:33:58 +08:00

261 lines
8.6 KiB
JavaScript

const axios = require('axios');
const colors = require('colors');
// 测试配置
const BASE_URL = 'http://localhost/dev-api';
// 获取Token
async function getToken() {
try {
const { getToken } = require('./quick-token-getter');
return await getToken();
} catch (error) {
console.log('获取Token失败'.red, error.message);
return null;
}
}
// 通用API测试方法
async function testAPI(endpoint, method = 'GET', data = null, token = null, description = '') {
try {
const config = {
method: method.toLowerCase(),
url: `${BASE_URL}${endpoint}`,
headers: {
'Content-Type': 'application/json;charset=utf-8',
clientid: 'e5cd7e4891bf95d1d19206ce24a7b32e',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
referer: 'http://localhost/login?redirect=%252Findex',
},
timeout: 10000,
};
if (token) {
config.headers['Authorization'] = `Bearer ${token}`;
}
if (data && (method.toUpperCase() === 'POST' || method.toUpperCase() === 'PUT')) {
config.data = data;
} else if (data && method.toUpperCase() === 'GET') {
config.params = data;
}
const response = await axios(config);
return {
success: true,
data: response.data,
status: response.status,
description: description,
};
} catch (error) {
return {
success: false,
error: error.response?.data || error.message,
status: error.response?.status,
description: description,
};
}
}
// 测试所有权限接口
async function testAllPermissionAPIs(token) {
console.log('\n🧪 测试物业报修管理权限接口'.blue.bold);
console.log('='.repeat(80).blue);
// 定义所有需要测试的接口
const apiTests = [
// 报修管理接口
{
endpoint: '/pm/repairOrder/list',
method: 'GET',
permission: 'pm:repairOrder:list',
description: '报修工单列表查询',
data: { pageNum: 1, pageSize: 10 },
},
{
endpoint: '/pm/repairOrder/statistics',
method: 'GET',
permission: 'pm:repairOrder:statistics',
description: '报修统计数据',
},
{
endpoint: '/pm/repairOrder/generateOrderNo',
method: 'GET',
permission: 'pm:repairOrder:generateOrderNo',
description: '生成工单编号',
},
// 维修分类接口
{
endpoint: '/pm/repairCategory/list',
method: 'GET',
permission: 'pm:category:list',
description: '维修分类列表查询',
data: { pageNum: 1, pageSize: 10 },
},
{
endpoint: '/pm/repairCategory/tree',
method: 'GET',
permission: 'pm:category:tree',
description: '维修分类树形结构',
},
{
endpoint: '/pm/repairCategory/options',
method: 'GET',
permission: 'pm:category:options',
description: '维修分类下拉选项',
},
];
const results = [];
for (let i = 0; i < apiTests.length; i++) {
const test = apiTests[i];
console.log(`\n${i + 1}. 测试接口: ${test.endpoint}`.cyan);
console.log(` 权限要求: ${test.permission}`.gray);
console.log(` 功能描述: ${test.description}`.gray);
const result = await testAPI(
test.endpoint,
test.method,
test.data,
token,
test.description,
);
if (result.success) {
console.log(` ✅ 成功 - 状态: ${result.status}`.green);
if (result.data?.data) {
if (Array.isArray(result.data.data)) {
console.log(` 📊 数据: ${result.data.data.length}条记录`.yellow);
} else if (result.data.data.rows) {
console.log(
` 📊 数据: 共${result.data.data.total}条,当前页${result.data.data.rows.length}条`
.yellow,
);
} else if (typeof result.data.data === 'string') {
console.log(` 📊 数据: ${result.data.data}`.yellow);
} else {
console.log(` 📊 数据: 返回对象`.yellow);
}
}
} else {
const errorMsg =
result.error?.msg || result.error?.message || JSON.stringify(result.error);
console.log(` ❌ 失败 - 状态: ${result.status}`.red);
console.log(` 📝 错误: ${errorMsg}`.red);
}
results.push({
...test,
success: result.success,
status: result.status,
error: result.error,
});
}
return results;
}
// 生成测试报告
function generateReport(results, token) {
console.log('\n📊 权限测试报告'.rainbow.bold);
console.log('='.repeat(80).rainbow);
const totalTests = results.length;
const successfulTests = results.filter((r) => r.success).length;
const failedTests = totalTests - successfulTests;
const successRate = ((successfulTests / totalTests) * 100).toFixed(2);
console.log(`\n📈 测试统计:`);
console.log(` 总测试数: ${totalTests}`);
console.log(` 成功数: ${successfulTests}`.green);
console.log(` 失败数: ${failedTests}`.red);
console.log(` 成功率: ${successRate}%`.yellow);
if (failedTests > 0) {
console.log(`\n❌ 失败的接口:`);
results
.filter((r) => !r.success)
.forEach((test, index) => {
const errorMsg = test.error?.msg || test.error?.message || '未知错误';
console.log(` ${index + 1}. ${test.endpoint} - ${errorMsg}`.red);
});
console.log(`\n💡 可能的解决方案:`);
console.log(` 1. 🗄️ 执行权限配置SQL脚本: source test/complete-permission-config.sql`);
console.log(` 2. 🔄 重新登录系统刷新权限缓存`);
console.log(` 3. 🏗️ 重启后端服务重新加载权限配置`);
console.log(` 4. 🗄️ 检查数据库中sys_menu和sys_role_menu表的数据`);
} else {
console.log(`\n🎉 所有接口测试通过!权限配置正确!`.green.bold);
}
// 详细结果
console.log(`\n📋 详细测试结果:`);
results.forEach((test, index) => {
const status = test.success ? '✅' : '❌';
const statusText = test.success ? '成功' : '失败';
console.log(` ${index + 1}. ${status} ${test.endpoint} - ${statusText}`);
if (!test.success) {
const errorMsg = test.error?.msg || test.error?.message || '未知错误';
console.log(` 错误: ${errorMsg}`.gray);
}
});
}
// 主测试函数
async function runPermissionTest() {
console.log('🔐 物业报修管理权限验证测试'.rainbow.bold);
console.log('='.repeat(80).rainbow);
const startTime = new Date();
try {
// 1. 获取Token
console.log('\n🔑 步骤1: 获取认证Token'.magenta.bold);
const token = await getToken();
if (!token || token.length < 50) {
console.log('❌ Token获取失败,无法进行权限测试'.red.bold);
return;
}
console.log('✅ Token获取成功'.green);
// 2. 测试所有权限接口
console.log('\n🧪 步骤2: 测试权限接口'.magenta.bold);
const results = await testAllPermissionAPIs(token);
// 3. 生成测试报告
console.log('\n📊 步骤3: 生成测试报告'.magenta.bold);
generateReport(results, token);
// 4. 性能统计
const endTime = new Date();
const duration = endTime - startTime;
console.log(`\n⏱️ 测试耗时: ${duration}ms`.cyan);
} catch (error) {
console.error('\n💥 权限测试过程出错:'.red.bold, error.message);
}
}
// 如果直接运行此脚本
if (require.main === module) {
runPermissionTest()
.then(() => {
console.log('\n👋 权限测试完成'.cyan);
})
.catch((error) => {
console.error('权限测试脚本执行失败:', error);
process.exit(1);
});
}
module.exports = {
runPermissionTest,
testAllPermissionAPIs,
generateReport,
};