Files
uniapp-error-monitor/test/webhook-test.js

199 lines
5.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Webhook 真实发送测试
* 运行方式node test/webhook-test.js
*/
const https = require('https')
// 测试用的 webhook 地址
const TEST_WEBHOOK = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=9a401eb2-065a-4882-82e9-b438bcd1eac4'
// 模拟 uni 环境(使用真实的 HTTP 请求)
global.uni = {
getSystemInfoSync: () => ({
appName: '错误监控测试',
appVersion: '1.0.0',
platform: 'node',
system: 'Node.js ' + process.version,
model: 'Server',
mode: 'test',
}),
// 使用真实的 HTTPS 请求
request: (options) => {
console.log('\n========================================')
console.log('📤 发送真实请求到 Webhook')
console.log('========================================')
console.log('URL:', options.url)
console.log('Method:', options.method)
console.log('数据:', JSON.stringify(options.data, null, 2))
const url = new URL(options.url)
const reqOptions = {
hostname: url.hostname,
port: 443,
path: url.pathname + url.search,
method: options.method || 'POST',
headers: {
'Content-Type': 'application/json',
}
}
const req = https.request(reqOptions, (res) => {
let data = ''
res.on('data', (chunk) => { data += chunk })
res.on('end', () => {
console.log('\n📥 响应状态:', res.statusCode)
console.log('响应内容:', data)
if (options.success) {
options.success({
statusCode: res.statusCode,
data: JSON.parse(data)
})
}
})
})
req.on('error', (e) => {
console.error('❌ 请求错误:', e.message)
if (options.fail) {
options.fail(e)
}
})
req.write(JSON.stringify(options.data))
req.end()
return { abort: () => req.destroy() }
},
onError: (callback) => { global._uniOnErrorCallback = callback },
onPageNotFound: (callback) => { global._uniOnPageNotFoundCallback = callback },
}
// 模拟 getCurrentPages
global.getCurrentPages = () => [
{
route: 'pages/test/test',
$page: { fullPath: '/pages/test/test?id=webhook-test' }
}
]
// 模拟 window 环境
global.window = {
location: { href: 'http://localhost:8080/webhook-test' },
onerror: null,
addEventListener: () => {},
}
global.navigator = { userAgent: 'Node.js Error Monitor Test' }
// 设置环境变量
process.env.MODE = 'production'
// 注意webhookUrl 需要通过 initErrorMonitor 传入,不能通过环境变量
// 读取并修改源代码
const fs = require('fs')
const path = require('path')
const sourcePath = path.join(__dirname, '../src/index.js')
let sourceCode = fs.readFileSync(sourcePath, 'utf-8')
// 替换 import.meta.env
sourceCode = sourceCode.replace(/import\.meta\.env\.MODE/g, 'process.env.MODE || "production"')
sourceCode = sourceCode.replace(/import\.meta\.env\.VITE_WEBHOOK/g, 'process.env.VITE_WEBHOOK || ""')
const tempModulePath = path.join(__dirname, 'temp-webhook-index.js')
fs.writeFileSync(tempModulePath, sourceCode)
// 导入模块
const errorMonitor = require('./temp-webhook-index.js')
const { initErrorMonitor, reportError, getErrorStats, resetErrorStats, setErrorLevel, clearErrorCache, ERROR_LEVEL } = errorMonitor
// 延迟函数
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms))
}
// 主测试函数
async function runWebhookTest() {
console.log('\n========================================')
console.log(' 错误监控 Webhook 真实发送测试')
console.log('========================================\n')
// 初始化
resetErrorStats()
clearErrorCache()
initErrorMonitor({
webhookUrl: TEST_WEBHOOK,
forceEnable: true,
errorLevel: ERROR_LEVEL.STRICT,
})
console.log('✅ 错误监控已初始化')
console.log('📍 Webhook:', TEST_WEBHOOK)
await delay(500)
// 测试1: 发送手动错误
console.log('\n----------------------------------------')
console.log('🧪 测试1: 发送手动错误')
console.log('----------------------------------------')
reportError('manual', new Error('这是一条测试错误消息 - 手动上报'), {
testId: 'test-001',
testTime: new Date().toISOString(),
description: '用于验证 webhook 发送功能'
})
await delay(2000)
// 测试2: 发送 API 错误
console.log('\n----------------------------------------')
console.log('🧪 测试2: 发送 API 错误')
console.log('----------------------------------------')
clearErrorCache()
reportError('api', {
config: {
url: 'https://api.example.com/test-api',
method: 'POST',
data: { userId: 123 },
header: { 'Authorization': 'Bearer xxx' },
startTime: Date.now() - 500,
},
statusCode: 500,
data: {
code: 500,
msg: '服务器内部错误',
}
})
await delay(2000)
// 测试3: 发送网络错误
console.log('\n----------------------------------------')
console.log('🧪 测试3: 发送网络错误')
console.log('----------------------------------------')
clearErrorCache()
reportError('network', new Error('网络连接超时'), {
url: 'https://api.example.com/timeout',
method: 'GET',
retryCount: 3,
networkType: 'wifi',
})
await delay(2000)
// 清理
console.log('\n----------------------------------------')
console.log('📊 测试统计')
console.log('----------------------------------------')
const stats = getErrorStats()
console.log('总错误数:', stats.total)
console.log('手动错误:', stats.manual)
console.log('API错误:', stats.api)
console.log('网络错误:', stats.network)
// 清理临时文件
try {
fs.unlinkSync(tempModulePath)
} catch (e) {}
console.log('\n========================================')
console.log(' 测试完成!请检查企业微信机器人')
console.log('========================================\n')
}
runWebhookTest().catch(console.error)