test: establish WP4-07 visual performance red harness
Dada P0-A isolated Windows CI / validate-and-package (push) Failing after 4m19s
Dada P0-A isolated Windows CI / validate-and-package (push) Failing after 4m19s
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
import { createHash } from "node:crypto";
|
||||
import { spawnSync } from "node:child_process";
|
||||
import { existsSync, readFileSync } from "node:fs";
|
||||
|
||||
import { WP4_07_RED_RESOURCE_VERSION, WP4_07_SOURCE_HASHES, assertWp407Fixture } from "../../tests/visual-performance/wp4-07-fixture.mjs";
|
||||
|
||||
export const WP4_07_REQUIRED_WP5_BRANCHES = Object.freeze(
|
||||
Array.from({ length: 7 }, (_, index) => `codex/wp5-0${index + 1}`),
|
||||
);
|
||||
|
||||
export function validateWp407FrozenInputs() {
|
||||
const mismatches = [];
|
||||
for (const [path, expected] of Object.entries(WP4_07_SOURCE_HASHES)) {
|
||||
if (!existsSync(path)) {
|
||||
mismatches.push({ actual: null, expected, path });
|
||||
continue;
|
||||
}
|
||||
const actual = createHash("sha256").update(readFileSync(path)).digest("hex").toUpperCase();
|
||||
if (actual !== expected) mismatches.push({ actual, expected, path });
|
||||
}
|
||||
if (mismatches.length > 0) {
|
||||
const error = new Error("WP4_07_FROZEN_SOURCE_CHANGED");
|
||||
error.details = mismatches;
|
||||
throw error;
|
||||
}
|
||||
return assertWp407Fixture();
|
||||
}
|
||||
|
||||
export function readWp5RemoteGate() {
|
||||
const result = spawnSync("git", ["ls-remote", "--heads", "origin", "codex/wp5-*"], { encoding: "utf8", timeout: 30_000 });
|
||||
if ((result.status ?? 1) !== 0) {
|
||||
const error = new Error("WP4_07_GITEA_GATE_UNREADABLE");
|
||||
error.details = { exit_code: result.status ?? 1 };
|
||||
throw error;
|
||||
}
|
||||
const heads = Object.fromEntries(result.stdout.trim().split(/\r?\n/).filter(Boolean).map((line) => {
|
||||
const [sha, reference] = line.split(/\s+/);
|
||||
return [reference.replace("refs/heads/", ""), sha];
|
||||
}));
|
||||
const missing_branches = WP4_07_REQUIRED_WP5_BRANCHES.filter((branch) => !/^[0-9a-f]{40}$/.test(heads[branch] ?? ""));
|
||||
return {
|
||||
complete: missing_branches.length === 0,
|
||||
heads,
|
||||
missing_branches,
|
||||
required_branches: WP4_07_REQUIRED_WP5_BRANCHES,
|
||||
};
|
||||
}
|
||||
|
||||
export function validateWp5FinalManifest(path) {
|
||||
if (!path || !existsSync(path)) throw new Error("WP4_07_FINAL_ASSET_MANIFEST_REQUIRED");
|
||||
const raw = readFileSync(path, "utf8");
|
||||
if (raw.includes(WP4_07_RED_RESOURCE_VERSION) || raw.includes("fixture-v1")) throw new Error("WP4_07_PLACEHOLDER_ASSET_REJECTED");
|
||||
const manifest = JSON.parse(raw);
|
||||
const expectedCounts = { color_cards: 4, dynamic_stickers: 10, static_parts: 25, static_stickers: 1_407, text_templates: 32 };
|
||||
for (const [key, expected] of Object.entries(expectedCounts)) {
|
||||
if (manifest.counts?.[key] !== expected) throw new Error(`WP4_07_FINAL_MANIFEST_COUNT_MISMATCH:${key}`);
|
||||
}
|
||||
if (!manifest.release_version || String(manifest.release_version).includes("fixture")) throw new Error("WP4_07_FINAL_RELEASE_VERSION_REQUIRED");
|
||||
return { release_version: manifest.release_version, sha256: createHash("sha256").update(raw).digest("hex").toUpperCase() };
|
||||
}
|
||||
Reference in New Issue
Block a user