Files
Find-Word/tests/build.test.ts
T
2026-10-14 06:19:24 +00:00

63 lines
2.4 KiB
TypeScript

// @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 });
}
},
);
});