/** * @module tests/unit/test-suite-coverage-guard * @description Prevents a test file from silently falling outside EVERY vitest * config (so it never runs and gives false coverage confidence — the exact drift * that left ~27 test files un-run before 8.0). Every `*.test.ts` must either match * a gate config (`tests/unit/**`, `tests/integration/**`, `*.unit.test.ts`, * `*.integration.test.ts`) or be explicitly listed in MANUAL_ONLY below. */ import { describe, it, expect } from 'vitest' import { readdirSync } from 'node:fs' import { join, relative, dirname } from 'node:path' import { fileURLToPath } from 'node:url' const repoRoot = join(dirname(fileURLToPath(import.meta.url)), '../..') const testsDir = join(repoRoot, 'tests') function allTestFiles(dir: string, out: string[] = []): string[] { for (const e of readdirSync(dir, { withFileTypes: true })) { const p = join(dir, e.name) if (e.isDirectory()) allTestFiles(p, out) else if (e.isFile() && p.endsWith('.test.ts')) out.push(relative(repoRoot, p).split('\\').join('/')) } return out } /** * Test files INTENTIONALLY excluded from the unit/integration gate: benchmarks, * scale/perf measurements, package-size checks, and real-model-load checks. They * are run manually (slow / need real resources), not in CI. Every entry is a * conscious decision — a NEW orphan not listed here fails the guard below. */ const MANUAL_ONLY = new Set([ 'tests/api/performance-benchmarks.test.ts', 'tests/critical-neural-validation.test.ts', 'tests/critical-performance-benchmark.test.ts', 'tests/model-loading.test.ts', 'tests/package-size-breakdown.test.ts', 'tests/package-size-limit.test.ts', 'tests/performance/graph-scale-performance.test.ts', 'tests/performance/triple-intelligence-scale.test.ts', 'tests/performance/typeAware.bench.test.ts' ]) function inGate(rel: string): boolean { return ( rel.startsWith('tests/unit/') || rel.startsWith('tests/integration/') || rel.endsWith('.unit.test.ts') || rel.endsWith('.integration.test.ts') ) } describe('test-suite coverage guard', () => { it('every *.test.ts runs in a gate config or is explicitly allowlisted as manual', () => { const orphans = allTestFiles(testsDir).filter((f) => !inGate(f) && !MANUAL_ONLY.has(f)) expect( orphans, 'These test files match NO vitest config and are not in MANUAL_ONLY — rename to ' + '*.unit.test.ts / *.integration.test.ts (or move under tests/unit|integration), or add to ' + `MANUAL_ONLY if they are benchmarks:\n${orphans.join('\n')}` ).toEqual([]) }) it('the manual allowlist has no stale entries (every listed file still exists)', () => { const all = new Set(allTestFiles(testsDir)) const stale = [...MANUAL_ONLY].filter((f) => !all.has(f)) expect(stale, `MANUAL_ONLY lists files that no longer exist — remove them:\n${stale.join('\n')}`).toEqual([]) }) })