84 lines
2.5 KiB
TypeScript
84 lines
2.5 KiB
TypeScript
import { test, expect } from '@playwright/test';
|
|
import fs from 'fs';
|
|
import path from 'path';
|
|
|
|
/**
|
|
* Dynamically extract all routes from the TanStack Router generated file.
|
|
*/
|
|
function getDynamicRoutes(): string[] {
|
|
const routeTreePath = path.resolve(__dirname, '../src/routeTree.gen.ts');
|
|
if (!fs.existsSync(routeTreePath)) {
|
|
console.warn('Route tree file not found, falling back to basic routes');
|
|
return ['/'];
|
|
}
|
|
|
|
const content = fs.readFileSync(routeTreePath, 'utf-8');
|
|
|
|
// Extract the FileRoutesByFullPath interface block
|
|
const interfaceMatch = content.match(/export interface FileRoutesByFullPath \{([\s\S]*?)\}/);
|
|
if (!interfaceMatch) return ['/'];
|
|
|
|
const block = interfaceMatch[1];
|
|
|
|
// Extract all strings in single quotes
|
|
const routeMatches = block.match(/'([^']+)'/g);
|
|
if (!routeMatches) return ['/'];
|
|
|
|
return routeMatches.map(m => {
|
|
let route = m.replace(/'/g, '');
|
|
|
|
// Normalize trailing slashes (Optional cleanup)
|
|
if (route !== '/' && route.endsWith('/')) {
|
|
route = route.slice(0, -1);
|
|
}
|
|
|
|
// Replace dynamic parameters with sample values
|
|
return route
|
|
.replace(/\$slug/g, 'sample-article')
|
|
.replace(/\$id/g, 'sample-id')
|
|
.replace(/\$taskId/g, 'sample-task');
|
|
});
|
|
}
|
|
|
|
test.describe('Automated Route Discovery & Screenshots', () => {
|
|
const baseURL = process.env.BASE_URL || 'http://localhost:3000';
|
|
const screenshotDir = path.resolve(__dirname, '../screenshots');
|
|
const routes = [...new Set(getDynamicRoutes())]; // Unique routes
|
|
|
|
test.beforeAll(() => {
|
|
if (!fs.existsSync(screenshotDir)) {
|
|
fs.mkdirSync(screenshotDir, { recursive: true });
|
|
}
|
|
});
|
|
|
|
console.log(`Discovered ${routes.length} routes for processing.`);
|
|
|
|
for (const route of routes) {
|
|
test(`capture screenshot: ${route}`, async ({ page }) => {
|
|
console.log(`Processing: ${baseURL}${route}`);
|
|
|
|
try {
|
|
await page.goto(`${baseURL}${route}`, {
|
|
waitUntil: 'networkidle',
|
|
timeout: 30000
|
|
});
|
|
|
|
// Wait for rendering
|
|
await page.waitForTimeout(1500);
|
|
|
|
const fileName = route.replace(/\//g, '_').replace(/^_/, '').replace(/[:$]/g, '') || 'home';
|
|
const screenshotPath = path.join(screenshotDir, `${fileName}.png`);
|
|
|
|
await page.screenshot({
|
|
path: screenshotPath,
|
|
fullPage: true
|
|
});
|
|
|
|
console.log(`Success: ${fileName}.png`);
|
|
} catch (error) {
|
|
console.error(`Failed to capture ${route}:`, error.message);
|
|
}
|
|
});
|
|
}
|
|
});
|