/* SPDX-License-Identifier: 0BSD */ /** * Channel / commit bake oracles for scripts/bake_build_meta.js */ import { describe, it, expect, afterEach } from "vitest"; import { spawnSync } from "node:child_process"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../.."); const bakeScript = path.join(repoRoot, "scripts", "bake_build_meta.js"); const bakedPath = path.join(repoRoot, "meshchatx", "src", "_build_meta_baked.py"); function readBaked() { const text = fs.readFileSync(bakedPath, "utf8"); const commit = (text.match(/^GIT_COMMIT = "(.*)"$/m) || [])[1] ?? ""; const short = (text.match(/^GIT_COMMIT_SHORT = "(.*)"$/m) || [])[1] ?? ""; const channel = (text.match(/^BUILD_CHANNEL = "(.*)"$/m) || [])[1] ?? ""; const isDev = /^IS_DEV_BUILD = True$/m.test(text); return { commit, short, channel, isDev }; } function runBake(envOverrides) { const env = { ...process.env, ...envOverrides }; for (const key of Object.keys(envOverrides)) { if (envOverrides[key] === "" || envOverrides[key] == null) { delete env[key]; } } const result = spawnSync(process.execPath, [bakeScript], { cwd: repoRoot, env, encoding: "utf8", }); expect(result.status, result.stderr || result.stdout).toBe(0); return readBaked(); } describe("bake_build_meta channel oracles", () => { let previous = null; afterEach(() => { if (previous != null) { fs.writeFileSync(bakedPath, previous, "utf8"); previous = null; } else if (fs.existsSync(bakedPath)) { // leave whatever last bake wrote; file is gitignored } }); function snapshot() { if (fs.existsSync(bakedPath)) { previous = fs.readFileSync(bakedPath, "utf8"); } } it("nightly ref bakes is_dev with short sha", () => { snapshot(); const meta = runBake({ MESHCHATX_BUILD_CHANNEL: "", GITHUB_REF_NAME: "nightly-2026.07.24-abcdef0", GITHUB_SHA: "abcdef0123456789aaaa", MESHCHATX_GIT_COMMIT: "", GIT_COMMIT: "", }); expect(meta.channel).toBe("nightly"); expect(meta.isDev).toBe(true); expect(meta.short).toBe("abcdef0"); expect(meta.commit.startsWith("abcdef0")).toBe(true); }); it("release tag clears is_dev", () => { snapshot(); const meta = runBake({ MESHCHATX_BUILD_CHANNEL: "", GITHUB_REF_NAME: "v4.8.0", GITHUB_SHA: "deadbeefcafebabe", MESHCHATX_GIT_COMMIT: "", GIT_COMMIT: "", }); expect(meta.channel).toBe("release"); expect(meta.isDev).toBe(false); expect(meta.short).toBe("deadbee"); }); it("explicit MESHCHATX_BUILD_CHANNEL=release wins over nightly ref name", () => { snapshot(); const meta = runBake({ MESHCHATX_BUILD_CHANNEL: "release", GITHUB_REF_NAME: "nightly-2026.07.24-abcdef0", MESHCHATX_GIT_COMMIT: "1234567890abcdef", }); expect(meta.channel).toBe("release"); expect(meta.isDev).toBe(false); expect(meta.short).toBe("1234567"); }); it("local/default channel is treated as dev", () => { snapshot(); const meta = runBake({ MESHCHATX_BUILD_CHANNEL: "local", GITHUB_REF_NAME: "", GITHUB_REF: "", MESHCHATX_GIT_COMMIT: "feedface00", }); expect(meta.channel).toBe("local"); expect(meta.isDev).toBe(true); expect(meta.short).toBe("feedfac"); }); });