92 lines
3.2 KiB
JavaScript
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
|
|
};
|
|
}
|