|
| 1 | +/** |
| 2 | + * Route Coverage Calculation Script |
| 3 | + * |
| 4 | + * Calculates E2E test coverage percentage for all documented routes. |
| 5 | + * Run with: `pnpm exec tsx apps/web/coverage/calculate-route-coverage.ts` |
| 6 | + * |
| 7 | + * @module coverage/calculate-route-coverage |
| 8 | + */ |
| 9 | + |
| 10 | +import { ROUTE_MANIFEST, COVERAGE_STATS } from './route-manifest'; |
| 11 | + |
| 12 | +console.log('═══════════════════════════════════════════════════════════════'); |
| 13 | +console.log('BibGraph E2E Route Coverage Report'); |
| 14 | +console.log('═══════════════════════════════════════════════════════════════\n'); |
| 15 | + |
| 16 | +// Overall statistics |
| 17 | +console.log('📊 Overall Coverage:'); |
| 18 | +console.log(` Total Routes: ${COVERAGE_STATS.totalRoutes}`); |
| 19 | +console.log(` Covered: ${COVERAGE_STATS.withCoverage} routes`); |
| 20 | +console.log(` Coverage: ${COVERAGE_STATS.coveragePercentage}%`); |
| 21 | +console.log(''); |
| 22 | + |
| 23 | +// Coverage by category |
| 24 | +console.log('📂 Coverage by Category:'); |
| 25 | +console.log(` Utility Routes: ${COVERAGE_STATS.byCategory.utility} total`); |
| 26 | +console.log(` Special Routes: ${COVERAGE_STATS.byCategory.special} total`); |
| 27 | +console.log(` Entity Index Routes: ${COVERAGE_STATS.byCategory['entity-index']} total`); |
| 28 | +console.log(` Entity Detail Routes:${COVERAGE_STATS.byCategory['entity-detail']} total`); |
| 29 | +console.log(''); |
| 30 | + |
| 31 | +// Coverage by entity type |
| 32 | +console.log('🏷️ Coverage by Entity Type:'); |
| 33 | +COVERAGE_STATS.byEntityType.forEach(([entityType, count]) => { |
| 34 | + console.log(` ${entityType.padEnd(15)} ${count} routes`); |
| 35 | +}); |
| 36 | +console.log(''); |
| 37 | + |
| 38 | +// Uncovered routes |
| 39 | +const uncovered = ROUTE_MANIFEST.filter((r) => !r.hasCoverage); |
| 40 | +if (uncovered.length > 0) { |
| 41 | + console.log('⚠️ Routes WITHOUT Coverage:'); |
| 42 | + uncovered.forEach((route) => { |
| 43 | + console.log(` ${route.pattern.padEnd(40)} (${route.category}${route.entityType ? `, ${route.entityType}` : ''})`); |
| 44 | + }); |
| 45 | + console.log(''); |
| 46 | +} else { |
| 47 | + console.log('✅ All routes have E2E test coverage!\n'); |
| 48 | +} |
| 49 | + |
| 50 | +// Success criteria check |
| 51 | +console.log('═══════════════════════════════════════════════════════════════'); |
| 52 | +if (COVERAGE_STATS.coveragePercentage >= 98) { |
| 53 | + console.log('✅ SUCCESS: Route coverage meets 98% target!'); |
| 54 | + console.log(` Current: ${COVERAGE_STATS.coveragePercentage}% ≥ Target: 98%`); |
| 55 | +} else if (COVERAGE_STATS.coveragePercentage >= 80) { |
| 56 | + console.log('⚠️ WARNING: Route coverage below 98% target'); |
| 57 | + console.log(` Current: ${COVERAGE_STATS.coveragePercentage}% < Target: 98%`); |
| 58 | + console.log(` Gap: ${98 - COVERAGE_STATS.coveragePercentage}%`); |
| 59 | +} else { |
| 60 | + console.log('❌ FAILURE: Route coverage significantly below target'); |
| 61 | + console.log(` Current: ${COVERAGE_STATS.coveragePercentage}% << Target: 98%`); |
| 62 | + console.log(` Gap: ${98 - COVERAGE_STATS.coveragePercentage}%`); |
| 63 | +} |
| 64 | +console.log('═══════════════════════════════════════════════════════════════'); |
| 65 | + |
| 66 | +// Exit with appropriate code |
| 67 | +process.exit(COVERAGE_STATS.coveragePercentage >= 98 ? 0 : 1); |
0 commit comments