import assert from "node:assert/strict"; import { spawnSync } from "node:child_process"; import path from "node:path"; import { describe, it } from "node:test"; import { fileURLToPath } from "node:url"; import { liveIsolationFileSets, shouldRunLiveIsolation, usesPerCommitIsolation, } from "./g13-live-isolation.mjs"; const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url)); const CLASSIFIER = path.join(SCRIPT_DIR, "check_app_terraform_isolation.py"); const TERRAFORM_ONLY = ["terraform/live/dev/main.tf"]; const APP_ONLY = ["src/app/routes.tsx"]; function classify(files) { const result = spawnSync("python3", [CLASSIFIER, ...files], { encoding: "utf8" }); return result.status; } function anySetFails(fileSets) { return fileSets.some((files) => classify(files) !== 0); } describe("shouldRunLiveIsolation", () => { it("runs locally and on pull_request", () => { assert.equal(shouldRunLiveIsolation(undefined), true); assert.equal(shouldRunLiveIsolation(""), true); assert.equal(shouldRunLiveIsolation("pull_request"), true); }); it("runs on merge_group so the required check classifies the candidate", () => { assert.equal(shouldRunLiveIsolation("merge_group"), true); assert.equal(usesPerCommitIsolation("merge_group"), true); }); it("skips push and other CI events", () => { assert.equal(shouldRunLiveIsolation("push"), false); assert.equal(shouldRunLiveIsolation("workflow_dispatch"), false); assert.equal(usesPerCommitIsolation("pull_request"), false); }); }); describe("liveIsolationFileSets", () => { it("classifies the PR range as one change set", () => { const range = [...TERRAFORM_ONLY, ...APP_ONLY]; const sets = liveIsolationFileSets("pull_request", range, [ { files: TERRAFORM_ONLY }, { files: APP_ONLY }, ]); assert.deepEqual(sets, [range]); assert.equal(anySetFails(sets), true); }); it("classifies each queued PR, not the merge-group union", () => { const union = [...TERRAFORM_ONLY, ...APP_ONLY]; const sets = liveIsolationFileSets("merge_group", union, [ { files: TERRAFORM_ONLY }, { files: APP_ONLY }, ]); assert.deepEqual(sets, [TERRAFORM_ONLY, APP_ONLY]); assert.equal(anySetFails(sets), false); assert.equal(classify(union), 1); }); it("fails a single queued PR that mixes terraform and app files", () => { const mixed = [...TERRAFORM_ONLY, ...APP_ONLY]; const sets = liveIsolationFileSets("merge_group", mixed, [{ files: mixed }]); assert.equal(anySetFails(sets), true); }); });