Files
pikasTech-HWLAB/scripts/ci-plan-identity.test.mjs
T

92 lines
3.2 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import { attachCiPlanIdentity } from "./src/ci-plan-identity.mjs";
import { compareReviewedPlan, decodeReviewedPlan } from "./ci/verify-reviewed-plan.mjs";
const sourceCommit = "a".repeat(40);
const baseCommit = "b".repeat(40);
test("plan identity is stable across service and scope ordering", () => {
const left = identifiedPlan({
services: [registryService("worker"), registryService("api")],
buildServices: ["worker", "api"]
});
const right = identifiedPlan({
services: [registryService("api"), registryService("worker")],
buildServices: ["api", "worker"]
});
assert.equal(left.planIdentity.value, right.planIdentity.value);
});
test("registry probe result and build scope change plan identity", () => {
const reused = identifiedPlan({ services: [registryService("api", "present")] });
const missing = identifiedPlan({
services: [registryService("api", "missing")],
buildServices: ["api"],
rolloutServices: ["api"],
affectedServices: ["api"]
});
assert.notEqual(reused.planIdentity.value, missing.planIdentity.value);
});
test("reviewed plan admission rejects scope additions before build", () => {
const expectedPlan = identifiedPlan({ rolloutServices: ["api"], affectedServices: ["api"] });
const actualPlan = identifiedPlan({
buildServices: ["worker"],
rolloutServices: ["api", "worker"],
affectedServices: ["api", "worker"]
});
const result = compareReviewedPlan(envelope(expectedPlan), actualPlan);
assert.equal(result.ok, false);
assert.equal(result.scopeExpanded, true);
assert.deepEqual(result.additions.buildServices, ["worker"]);
assert.deepEqual(result.additions.rolloutServices, ["worker"]);
});
test("reviewed plan envelope round trips without a second authority", () => {
const plan = identifiedPlan({ rolloutServices: ["api"], affectedServices: ["api"] });
const expected = envelope(plan);
const encoded = `unidesk-release-plan-v1.${Buffer.from(JSON.stringify(expected)).toString("base64url")}`;
assert.deepEqual(decodeReviewedPlan(encoded), expected);
assert.equal(compareReviewedPlan(expected, plan).ok, true);
});
function identifiedPlan(overrides = {}) {
return attachCiPlanIdentity({
sourceCommitId: sourceCommit,
baseCommitId: baseCommit,
compatibility: { lane: "v03" },
inputs: { verifyReuseRegistry: true },
artifactCatalog: {
authority: "gitops-branch",
catalogSourceCommitId: baseCommit,
catalogSha256: "sha256:catalog",
gitopsCommitId: "c".repeat(40)
},
services: [],
buildServices: [],
rolloutServices: [],
affectedServices: [],
...overrides
}, { releaseTarget: "NC01", releaseConsumer: "hwlab-nc01-v03" });
}
function registryService(serviceId, status = "present") {
return { serviceId, reuseRegistry: { status, image: `registry/${serviceId}:env`, digest: `sha256:${serviceId}` } };
}
function envelope(plan) {
return {
version: "v1",
planIdentity: plan.planIdentity.value,
target: "NC01",
consumer: "hwlab-nc01-v03",
sourceCommit,
baseCommit,
buildServices: plan.buildServices,
rolloutServices: plan.rolloutServices,
affectedServices: plan.affectedServices
};
}