Backend (@backend-dev): - Add ReportService with PDF/CSV generation (reportlab, pandas) - Implement Report API endpoints (POST, GET, DELETE, download) - Add ReportRepository and schemas - Configure storage with auto-cleanup (30 days) - Rate limiting: 10 downloads/minute - Professional PDF templates with charts support Frontend (@frontend-dev): - Integrate Recharts for data visualization - Add CostBreakdown, TimeSeries, ComparisonBar charts - Implement scenario comparison page with multi-select - Add dark/light mode toggle with ThemeProvider - Create Reports page with generation form and list - Add new UI components: checkbox, dialog, tabs, label, skeleton - Implement useComparison and useReports hooks QA (@qa-engineer): - Setup Playwright E2E testing framework - Create 7 test spec files with 94 test cases - Add visual regression testing with baselines - Configure multi-browser testing (Chrome, Firefox, WebKit) - Add mobile responsive tests - Create test fixtures and helpers - Setup GitHub Actions CI workflow Documentation (@spec-architect): - Create detailed kanban-v0.4.0.md with 27 tasks - Update progress.md with v0.4.0 tracking - Create v0.4.0 planning prompt Features: ✅ PDF/CSV Report Generation ✅ Interactive Charts (Pie, Area, Bar) ✅ Scenario Comparison (2-4 scenarios) ✅ Dark/Light Mode Toggle ✅ E2E Test Suite (94 tests) Dependencies added: - Backend: reportlab, pandas, slowapi - Frontend: recharts, date-fns, @radix-ui/react-checkbox/dialog/tabs - Testing: @playwright/test 27 tasks completed, 100% v0.4.0 implementation
56 lines
1.6 KiB
TypeScript
56 lines
1.6 KiB
TypeScript
/**
|
|
* Global Teardown for Playwright E2E Tests
|
|
*
|
|
* This runs once after all test suites complete.
|
|
* Used for:
|
|
* - Database cleanup
|
|
* - Test artifact archival
|
|
* - Environment reset
|
|
*/
|
|
|
|
import { execSync } from 'child_process';
|
|
import path from 'path';
|
|
import fs from 'fs';
|
|
|
|
async function globalTeardown() {
|
|
console.log('🧹 Starting E2E test teardown...');
|
|
|
|
const testStartTime = process.env.TEST_START_TIME;
|
|
console.log(` Test started at: ${testStartTime}`);
|
|
console.log(` Test completed at: ${new Date().toISOString()}`);
|
|
|
|
// Clean up temporary test files if in CI mode
|
|
if (process.env.CI) {
|
|
console.log(' CI mode: Cleaning up temporary files...');
|
|
const resultsDir = path.join(__dirname, '..', 'e2e-results');
|
|
|
|
// Keep videos/screenshots of failures for debugging
|
|
// but clean up successful test artifacts after 7 days
|
|
if (fs.existsSync(resultsDir)) {
|
|
const files = fs.readdirSync(resultsDir);
|
|
let cleanedCount = 0;
|
|
|
|
for (const file of files) {
|
|
const filePath = path.join(resultsDir, file);
|
|
const stats = fs.statSync(filePath);
|
|
const ageInDays = (Date.now() - stats.mtime.getTime()) / (1000 * 60 * 60 * 24);
|
|
|
|
if (ageInDays > 7 && !file.includes('failed')) {
|
|
try {
|
|
fs.unlinkSync(filePath);
|
|
cleanedCount++;
|
|
} catch (e) {
|
|
// Ignore errors during cleanup
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log(` Cleaned up ${cleanedCount} old test artifacts`);
|
|
}
|
|
}
|
|
|
|
console.log('✅ E2E test teardown complete');
|
|
}
|
|
|
|
export default globalTeardown;
|