import { test } from "node:test"; import assert from "node:assert/strict"; import { publishVerifiedRelease } from "./release-publication.mjs"; test("an interrupted preparation stays draft and retry publishes only after every artifact verifies", async () => { const events = []; let failing = true; const hosting = { open: async () => ({ id: 7, draft: true }), upload: async (_draft, asset) => events.push(`upload:${asset.name}`), verify: async (_draft, assets, publicRead) => events.push(`verify:${publicRead}:${assets.length}`), publish: async () => { events.push("publish"); return { html_url: "https://example.test/release" }; }, }; const prepare = async () => { if (failing) throw new Error("frontend build unavailable"); return [{ name: "bundle.tar.gz" }, { name: "SHA256SUMS" }]; }; await assert.rejects(publishVerifiedRelease({ hosting, prepare }), /frontend/); assert.deepEqual(events, []); failing = false; await publishVerifiedRelease({ hosting, prepare }); assert.deepEqual(events, ["upload:bundle.tar.gz", "upload:SHA256SUMS", "verify:false:2", "publish", "verify:true:2"]); }); test("a published version is verified without replacing any asset", async () => { const events = []; await publishVerifiedRelease({ prepare: async () => [{ name: "bundle.tar.gz" }], hosting: { open: async () => ({ id: 7, draft: false }), upload: async () => { throw new Error("overwrote a published version"); }, publish: async () => { throw new Error("republished a version"); }, verify: async (_release, _assets, publicRead) => events.push(publicRead), } }); assert.deepEqual(events, [true]); });