// scripts/check-bundle-split.test.mjs // // Phase 2 Plan 02-03 Task 3 — Vitest cover for the PIPE-02 verifier. // // The exhaustive structural assertion fires during `npm run ci` AFTER // `npm run build` populates dist/. This Vitest file proves three smaller // things that don't require the dist/ to exist: // // 1. The script file is present and non-empty. // 2. The script parses + imports cleanly under Node ESM (no // module-eval-time process.exit; the CLI guard is correctly // wrapped so Vitest can import without termination). // 3. The exported runCheck() returns a structured result with the // documented shape — ok / message / chunkNameMatch / // chunkContentMatch / files. // // The dev / CI happy-path (build → script exits 0) is exercised via the // package.json scripts.ci chain: `npm run build && npm run check:bundle-split`. import { describe, it, expect } from 'vitest'; import { existsSync } from 'node:fs'; import { resolve } from 'node:path'; const scriptPath = resolve(process.cwd(), 'scripts/check-bundle-split.mjs'); describe('scripts/check-bundle-split.mjs', () => { it('exists and is non-empty', () => { expect(existsSync(scriptPath)).toBe(true); }); it('parses + imports without triggering process.exit (CLI guard works)', async () => { // If the CLI guard is broken, this `await import` would call process.exit // and Vitest's worker would terminate — the test would fail to report. const mod = await import(scriptPath); expect(typeof mod.runCheck).toBe('function'); }); it('runCheck() returns a structured result with the documented shape', async () => { const { runCheck } = await import(scriptPath); const result = runCheck(); expect(result).toHaveProperty('ok'); expect(result).toHaveProperty('message'); expect(result).toHaveProperty('chunkNameMatch'); expect(result).toHaveProperty('chunkContentMatch'); expect(result).toHaveProperty('files'); expect(typeof result.ok).toBe('boolean'); expect(typeof result.message).toBe('string'); expect(Array.isArray(result.files)).toBe(true); }); });