35 lines
1.6 KiB
JavaScript
35 lines
1.6 KiB
JavaScript
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]);
|
|
});
|