// @vitest-environment node import { execFileSync } from "node:child_process"; import { cpSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; // 실제 배포는 하지 않는다. worktree 내부 임시 폴더에 public 자산만 복사한 뒤 // 정상·누락·변조를 검사하여 빌드 검증기가 실패를 정말 감지하는지 먼저 확인한다. describe("production 자산 검증기", () => { it("101개 음성 포함을 확인하고 누락·변조는 실패시킨다", () => { mkdirSync(".cache", { recursive: true }); const temporary = mkdtempSync(".cache/build-test-"); const verify = () => execFileSync( "node", [ "--input-type=module", "-e", `import {verifyBuild} from './scripts/check-build.mjs'; console.log(verifyBuild(${JSON.stringify(temporary)}));`, ], { encoding: "utf8", stdio: "pipe" }, ); try { cpSync("public", temporary, { recursive: true }); expect(verify().trim()).toBe("101"); writeFileSync(join(temporary, "audio/intro.wav"), "broken"); expect(verify).toThrow(); rmSync(join(temporary, "audio/intro.wav")); expect(verify).toThrow(); } finally { rmSync(temporary, { recursive: true, force: true }); } }); it.each(["누락", "축약"])( "dist의 런타임 notice %s을 실패시킨다", (damage) => { mkdirSync(".cache", { recursive: true }); const temporary = mkdtempSync(".cache/notice-test-"); const verify = () => execFileSync( "node", [ "--input-type=module", "-e", `import {verifyBuild} from './scripts/check-build.mjs'; console.log(verifyBuild(${JSON.stringify(temporary)}));`, ], { encoding: "utf8", stdio: "pipe" }, ); try { cpSync("public", temporary, { recursive: true }); expect(verify().trim()).toBe("101"); const notice = join(temporary, "THIRD_PARTY_NOTICES.md"); if (damage === "누락") rmSync(notice, { force: true }); else writeFileSync(notice, "React / ReactDOM / scheduler — MIT License"); expect(verify).toThrow(/notice/i); } finally { rmSync(temporary, { recursive: true, force: true }); } }, ); });