Initial commit: Telegram Management System
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
Full-stack web application for Telegram management - Frontend: Vue 3 + Vben Admin - Backend: NestJS - Features: User management, group broadcast, statistics 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
303
frontend/test-all-routes.js
Normal file
303
frontend/test-all-routes.js
Normal file
@@ -0,0 +1,303 @@
|
||||
const { chromium } = require('playwright');
|
||||
const fs = require('fs');
|
||||
|
||||
// All routes to test
|
||||
const routes = [
|
||||
// Basic routes
|
||||
{ path: '/login', name: 'Login Page', requiresAuth: false },
|
||||
{ path: '/', name: 'Home (redirect)', requiresAuth: true },
|
||||
{ path: '/home', name: 'Dashboard', requiresAuth: true },
|
||||
{ path: '/message/message_page', name: 'Message Center', requiresAuth: true },
|
||||
|
||||
// Telegram Account Management (10 routes)
|
||||
{ path: '/tgAccountManage/tgAccountList', name: 'TG Account List', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/telegramWeb', name: 'Telegram Web', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/telegramChat', name: 'Telegram Chat', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/telegramWebFull', name: 'Telegram Web Full', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/telegramGuide', name: 'Telegram Guide', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/telegramQuickAccess', name: 'Telegram Quick Access', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/registerPhone', name: 'Register Phone', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/autoRegister', name: 'Auto Register', requiresAuth: true },
|
||||
{ path: '/tgAccountManage/accountUsageList', name: 'Account Usage List', requiresAuth: true },
|
||||
{ path: '/pullMemberTask/pullMemberTaskList', name: 'Pull Member Task List', requiresAuth: true },
|
||||
|
||||
// Group Management (4 routes)
|
||||
{ path: '/groupManage/groupList', name: 'Group List', requiresAuth: true },
|
||||
{ path: '/groupManage/groupMemberList', name: 'Group Member List', requiresAuth: true },
|
||||
{ path: '/groupManage/groupSet', name: 'Group Settings', requiresAuth: true },
|
||||
{ path: '/groupListenerManage/groupListenerList', name: 'Group Listener List', requiresAuth: true },
|
||||
|
||||
// Message Management (3 routes)
|
||||
{ path: '/messageManage/messageList', name: 'Message List', requiresAuth: true },
|
||||
{ path: '/messageManage/messageSet', name: 'Message Settings', requiresAuth: true },
|
||||
{ path: '/exchangeManage/exchangeList', name: 'Exchange List', requiresAuth: true },
|
||||
|
||||
// Script Management (5 routes)
|
||||
{ path: '/scriptManage/scriptList', name: 'Script List', requiresAuth: true },
|
||||
{ path: '/scriptManage/scriptProject', name: 'Script Project', requiresAuth: true },
|
||||
{ path: '/scriptTaskManage/scriptTaskList', name: 'Script Task List', requiresAuth: true },
|
||||
{ path: '/taskManage/groupTaskList', name: 'Group Task List', requiresAuth: true },
|
||||
{ path: '/taskManage/groupTaskWsLog', name: 'Group Task WS Log', requiresAuth: true },
|
||||
|
||||
// SMS Platform (7 routes)
|
||||
{ path: '/sms_platform/sms_platform_list', name: 'SMS Platform List', requiresAuth: true },
|
||||
{ path: '/sms_platform/sms_dashboard', name: 'SMS Dashboard', requiresAuth: true },
|
||||
{ path: '/sms_platform/sms_records', name: 'SMS Records', requiresAuth: true },
|
||||
{ path: '/sms_platform/sms_statistics', name: 'SMS Statistics', requiresAuth: true },
|
||||
{ path: '/sms_platform/sms_price_compare', name: 'SMS Price Compare', requiresAuth: true },
|
||||
{ path: '/sms_platform/sms_quick_actions', name: 'SMS Quick Actions', requiresAuth: true },
|
||||
{ path: '/sms_platform/balanceAlert', name: 'Balance Alert', requiresAuth: true },
|
||||
|
||||
// Configuration Management (7 routes)
|
||||
{ path: '/configManage/baseConfig', name: 'Base Config', requiresAuth: true },
|
||||
{ path: '/configManage/dcList', name: 'DC List', requiresAuth: true },
|
||||
{ path: '/configManage/paramConfig', name: 'Param Config', requiresAuth: true },
|
||||
{ path: '/nameManage/firstnameList', name: 'First Name List', requiresAuth: true },
|
||||
{ path: '/nameManage/lastnameList', name: 'Last Name List', requiresAuth: true },
|
||||
{ path: '/apiData/list', name: 'API Data List', requiresAuth: true },
|
||||
{ path: '/adminManage/modifyPwd', name: 'Modify Password', requiresAuth: true },
|
||||
|
||||
// Log Management (10 routes)
|
||||
{ path: '/logManage/groupJoinLog', name: 'Group Join Log', requiresAuth: true },
|
||||
{ path: '/logManage/groupSendLog', name: 'Group Send Log', requiresAuth: true },
|
||||
{ path: '/logManage/loginLog', name: 'Login Log', requiresAuth: true },
|
||||
{ path: '/logManage/pullMemberLog', name: 'Pull Member Log', requiresAuth: true },
|
||||
{ path: '/logManage/pullMemberProjectStatistic', name: 'Pull Member Project Stats', requiresAuth: true },
|
||||
{ path: '/logManage/pullMemberStatistic', name: 'Pull Member Stats', requiresAuth: true },
|
||||
{ path: '/logManage/registerLog', name: 'Register Log', requiresAuth: true },
|
||||
{ path: '/logManage/tgLoginCodeLog', name: 'TG Login Code Log', requiresAuth: true },
|
||||
{ path: '/logManage/tgRegisterLog', name: 'TG Register Log', requiresAuth: true },
|
||||
{ path: '/error_logger/error_logger_page', name: 'Error Logger Page', requiresAuth: true },
|
||||
|
||||
// Error Pages (3 routes)
|
||||
{ path: '/401', name: '401 Error Page', requiresAuth: false },
|
||||
{ path: '/404', name: '404 Error Page', requiresAuth: false },
|
||||
{ path: '/500', name: '500 Error Page', requiresAuth: false },
|
||||
|
||||
// Component Examples (11 routes)
|
||||
{ path: '/components/tree_select_page', name: 'Tree Select', requiresAuth: true },
|
||||
{ path: '/components/count_to_page', name: 'Count To', requiresAuth: true },
|
||||
{ path: '/components/drag_list_page', name: 'Drag List', requiresAuth: true },
|
||||
{ path: '/components/drag_drawer_page', name: 'Drag Drawer', requiresAuth: true },
|
||||
{ path: '/components/org_tree_page', name: 'Org Tree', requiresAuth: true },
|
||||
{ path: '/components/tree_table_page', name: 'Tree Table', requiresAuth: true },
|
||||
{ path: '/components/cropper_page', name: 'Cropper', requiresAuth: true },
|
||||
{ path: '/components/tables_page', name: 'Tables', requiresAuth: true },
|
||||
{ path: '/components/split_pane_page', name: 'Split Pane', requiresAuth: true },
|
||||
{ path: '/components/editor_page', name: 'Editor', requiresAuth: true },
|
||||
{ path: '/components/icons_page', name: 'Icons', requiresAuth: true },
|
||||
|
||||
// Additional Features (11 routes)
|
||||
{ path: '/update/update_table_page', name: 'Upload CSV', requiresAuth: true },
|
||||
{ path: '/update/update_paste_page', name: 'Paste Table Data', requiresAuth: true },
|
||||
{ path: '/excel/upload-excel', name: 'Upload Excel', requiresAuth: true },
|
||||
{ path: '/excel/export-excel', name: 'Export Excel', requiresAuth: true },
|
||||
{ path: '/tools_methods/tools_methods_page', name: 'Tools Methods', requiresAuth: true },
|
||||
{ path: '/i18n/i18n_page', name: 'i18n Page', requiresAuth: true },
|
||||
{ path: '/error_store/error_store_page', name: 'Error Store', requiresAuth: true },
|
||||
{ path: '/directive/directive_page', name: 'Directive', requiresAuth: true },
|
||||
{ path: '/multilevel/level_2_1', name: 'Multilevel 2-1', requiresAuth: true },
|
||||
{ path: '/multilevel/level_2_2/level_2_2_1', name: 'Multilevel 2-2-1', requiresAuth: true },
|
||||
{ path: '/multilevel/level_2_2/level_2_2_2', name: 'Multilevel 2-2-2', requiresAuth: true },
|
||||
{ path: '/multilevel/level_2_3', name: 'Multilevel 2-3', requiresAuth: true },
|
||||
{ path: '/argu/params/test123', name: 'Dynamic Route - Params', requiresAuth: true },
|
||||
{ path: '/argu/query?id=test123', name: 'Dynamic Route - Query', requiresAuth: true }
|
||||
];
|
||||
|
||||
// Test results
|
||||
const testResults = [];
|
||||
|
||||
async function testAllRoutes() {
|
||||
const browser = await chromium.launch({
|
||||
headless: false,
|
||||
slowMo: 50
|
||||
});
|
||||
|
||||
const context = await browser.newContext({
|
||||
viewport: { width: 1920, height: 1080 }
|
||||
});
|
||||
|
||||
const page = await context.newPage();
|
||||
|
||||
// Enable console logging
|
||||
page.on('console', msg => {
|
||||
if (msg.type() === 'error') {
|
||||
console.error(`Console error: ${msg.text()}`);
|
||||
}
|
||||
});
|
||||
|
||||
page.on('pageerror', error => {
|
||||
console.error(`Page error: ${error.message}`);
|
||||
});
|
||||
|
||||
const baseUrl = 'http://localhost:8890';
|
||||
|
||||
console.log('Starting route testing...\n');
|
||||
|
||||
// First, test login
|
||||
console.log('Testing login functionality...');
|
||||
try {
|
||||
await page.goto(`${baseUrl}/login`, { waitUntil: 'networkidle' });
|
||||
|
||||
// Check if login page loads
|
||||
await page.waitForSelector('form', { timeout: 5000 });
|
||||
|
||||
// Try to login with test credentials
|
||||
// Adjust selectors based on your login form structure
|
||||
const usernameInput = await page.locator('input[placeholder*="用户名"], input[placeholder*="username"], input[type="text"]').first();
|
||||
const passwordInput = await page.locator('input[placeholder*="密码"], input[placeholder*="password"], input[type="password"]').first();
|
||||
|
||||
await usernameInput.fill('admin');
|
||||
await passwordInput.fill('111111');
|
||||
const submitButton = await page.locator('button[type="submit"], button:has-text("登录"), button:has-text("Login")').first();
|
||||
await submitButton.click();
|
||||
|
||||
// Wait for navigation after login
|
||||
await page.waitForNavigation({ waitUntil: 'networkidle' });
|
||||
|
||||
// Check if we're redirected to home
|
||||
const currentUrl = page.url();
|
||||
if (currentUrl.includes('/home')) {
|
||||
console.log('✅ Login successful!');
|
||||
testResults.push({
|
||||
path: '/login',
|
||||
name: 'Login',
|
||||
status: 'success',
|
||||
message: 'Login functionality working'
|
||||
});
|
||||
} else {
|
||||
console.log('❌ Login failed!');
|
||||
testResults.push({
|
||||
path: '/login',
|
||||
name: 'Login',
|
||||
status: 'failed',
|
||||
message: 'Login failed - not redirected to home'
|
||||
});
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('❌ Login test failed:', error.message);
|
||||
testResults.push({
|
||||
path: '/login',
|
||||
name: 'Login',
|
||||
status: 'error',
|
||||
message: error.message
|
||||
});
|
||||
}
|
||||
|
||||
// Test all other routes
|
||||
for (const route of routes) {
|
||||
if (route.path === '/login') continue; // Already tested
|
||||
|
||||
console.log(`\nTesting: ${route.name} (${route.path})`);
|
||||
|
||||
try {
|
||||
const response = await page.goto(`${baseUrl}${route.path}`, {
|
||||
waitUntil: 'networkidle',
|
||||
timeout: 30000
|
||||
});
|
||||
|
||||
// Check response status
|
||||
const status = response.status();
|
||||
|
||||
// Wait a bit for Vue to render
|
||||
await page.waitForTimeout(1000);
|
||||
|
||||
// Check for common error indicators
|
||||
const hasErrorPage = await page.$('.error-page') !== null;
|
||||
const has404 = await page.locator('text=/404/i').count() > 0;
|
||||
const has500 = await page.locator('text=/500/i').count() > 0;
|
||||
const hasConsoleErrors = await page.evaluate(() => {
|
||||
return window.__consoleErrors && window.__consoleErrors.length > 0;
|
||||
});
|
||||
|
||||
// Take screenshot for visual verification
|
||||
await page.screenshot({
|
||||
path: `screenshots/route_${route.path.replace(/\//g, '_')}.png`,
|
||||
fullPage: true
|
||||
});
|
||||
|
||||
if (status === 200 && !hasErrorPage && !has404 && !has500) {
|
||||
console.log(`✅ ${route.name} - Success`);
|
||||
testResults.push({
|
||||
path: route.path,
|
||||
name: route.name,
|
||||
status: 'success',
|
||||
httpStatus: status,
|
||||
hasConsoleErrors
|
||||
});
|
||||
} else {
|
||||
console.log(`❌ ${route.name} - Failed (Status: ${status})`);
|
||||
testResults.push({
|
||||
path: route.path,
|
||||
name: route.name,
|
||||
status: 'failed',
|
||||
httpStatus: status,
|
||||
hasErrorPage,
|
||||
has404,
|
||||
has500,
|
||||
hasConsoleErrors
|
||||
});
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error(`❌ ${route.name} - Error: ${error.message}`);
|
||||
testResults.push({
|
||||
path: route.path,
|
||||
name: route.name,
|
||||
status: 'error',
|
||||
message: error.message
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Generate test report
|
||||
const report = {
|
||||
testDate: new Date().toISOString(),
|
||||
totalRoutes: routes.length,
|
||||
results: testResults,
|
||||
summary: {
|
||||
success: testResults.filter(r => r.status === 'success').length,
|
||||
failed: testResults.filter(r => r.status === 'failed').length,
|
||||
error: testResults.filter(r => r.status === 'error').length
|
||||
}
|
||||
};
|
||||
|
||||
// Save report
|
||||
fs.writeFileSync('route-test-report.json', JSON.stringify(report, null, 2));
|
||||
|
||||
console.log('\n========== TEST SUMMARY ==========');
|
||||
console.log(`Total Routes Tested: ${report.totalRoutes}`);
|
||||
console.log(`✅ Success: ${report.summary.success}`);
|
||||
console.log(`❌ Failed: ${report.summary.failed}`);
|
||||
console.log(`⚠️ Error: ${report.summary.error}`);
|
||||
console.log('==================================\n');
|
||||
|
||||
// Print failed routes
|
||||
const failedRoutes = testResults.filter(r => r.status !== 'success');
|
||||
if (failedRoutes.length > 0) {
|
||||
console.log('Failed Routes:');
|
||||
failedRoutes.forEach(route => {
|
||||
console.log(`- ${route.name} (${route.path}): ${route.message || 'Failed'}`);
|
||||
});
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
}
|
||||
|
||||
// Create screenshots directory
|
||||
if (!fs.existsSync('screenshots')) {
|
||||
fs.mkdirSync('screenshots');
|
||||
}
|
||||
|
||||
// Inject console error tracking
|
||||
const setupScript = `
|
||||
window.__consoleErrors = [];
|
||||
const originalError = console.error;
|
||||
console.error = function(...args) {
|
||||
window.__consoleErrors.push(args.join(' '));
|
||||
originalError.apply(console, args);
|
||||
};
|
||||
`;
|
||||
|
||||
// Run the tests
|
||||
testAllRoutes().catch(console.error);
|
||||
Reference in New Issue
Block a user