feat: implement v0.4.0 - Reports, Charts, Comparison, Dark Mode, E2E Testing
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
This commit is contained in:
55
frontend/e2e/global-teardown.ts
Normal file
55
frontend/e2e/global-teardown.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
/**
|
||||
* 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;
|
||||
Reference in New Issue
Block a user