resume/tests/lighthouse.js

89 lines
2.6 KiB
JavaScript

const { execSync } = require('child_process');
const fs = require('fs');
const path = require('path');
// Set threshold values for each category
const THRESHOLDS = {
performance: 90,
accessibility: 90,
'best-practices': 90,
seo: 90,
};
async function runLighthouse(url) {
// Create directory for reports if it doesn't exist
const reportsDir = path.join(__dirname, 'reports');
if (!fs.existsSync(reportsDir)) {
fs.mkdirSync(reportsDir);
}
// Generate report filename
const reportPath = path.join(reportsDir, `lighthouse-report-${Date.now()}.json`);
try {
// Run Lighthouse using CLI
const command = `npx lighthouse "${url}" --output=json --output-path="${reportPath}" --only-categories=performance,accessibility,best-practices,seo --form-factor=desktop --throttling-method=simulate --screenEmulation.mobile=false`;
execSync(command, { stdio: 'inherit' });
// Read and parse the report
const report = JSON.parse(fs.readFileSync(reportPath, 'utf8'));
console.log('\nLighthouse Results:');
console.log('--------------------');
// Process and display results
let allPassed = true;
Object.keys(THRESHOLDS).forEach(category => {
const score = Math.round(report.categories[category].score * 100);
const threshold = THRESHOLDS[category];
const passed = score >= threshold;
if (!passed) {
allPassed = false;
}
console.log(`${category}: ${score}/100 - ${passed ? 'PASS' : 'FAIL'} (Threshold: ${threshold})`);
});
// Display audits that failed
console.log('\nFailed Audits:');
console.log('--------------');
let hasFailedAudits = false;
Object.values(report.audits).forEach(audit => {
if (audit.score !== null && audit.score < 0.9) {
hasFailedAudits = true;
console.log(`- ${audit.title}: ${Math.round(audit.score * 100)}/100`);
console.log(` ${audit.description}`);
}
});
if (!hasFailedAudits) {
console.log('No significant audit failures!');
}
console.log(`\nDetailed report saved to: ${reportPath}`);
return allPassed;
} catch (error) {
console.error('Error running Lighthouse:', error);
return false;
}
}
// URL to test - this should be your local server address
const url = process.argv[2] || 'http://localhost:8080';
// Start the tests
console.log(`Starting Lighthouse tests on ${url}`);
runLighthouse(url)
.then(passed => {
console.log(`\nOverall: ${passed ? 'PASSED' : 'FAILED'}`);
process.exit(passed ? 0 : 1);
})
.catch(error => {
console.error('Error running Lighthouse:', error);
process.exit(1);
});