63 lines
2.4 KiB
TypeScript
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 });
|
|
}
|
|
},
|
|
);
|
|
});
|