import assert from "node:assert/strict"; import test from "node:test"; import { compareRuntimeIdentityEnv, decideDevTemplateJobReplacement, resolveApplySourceCommit } from "./dev-deploy-apply.mjs"; test("allowlisted suspended template Job image change plans replacement", () => { const decision = decideDevTemplateJobReplacement({ jobName: "hwlab-agent-worker-template", jobNamespace: "hwlab-dev", desiredSuspended: true, liveExists: true, liveSuspended: true, oldImages: [ { name: "hwlab-agent-worker", serviceId: "hwlab-agent-worker", image: "127.0.0.1:5000/hwlab/hwlab-agent-worker:old1234" } ], newImages: [ { name: "hwlab-agent-worker", serviceId: "hwlab-agent-worker", image: "127.0.0.1:5000/hwlab/hwlab-agent-worker:new5678" } ] }); assert.equal(decision.replace, true); assert.equal(decision.result, "planned"); assert.equal(decision.namespace, "hwlab-dev"); assert.equal(decision.jobName, "hwlab-agent-worker-template"); assert.equal(decision.oldImage, "127.0.0.1:5000/hwlab/hwlab-agent-worker:old1234"); assert.equal(decision.newImage, "127.0.0.1:5000/hwlab/hwlab-agent-worker:new5678"); }); test("matching allowlisted suspended template Job image does not replace", () => { const image = "127.0.0.1:5000/hwlab/hwlab-cli:73b379f"; const decision = decideDevTemplateJobReplacement({ jobName: "hwlab-cli-template", jobNamespace: "hwlab-dev", desiredSuspended: true, liveExists: true, liveSuspended: true, oldImages: [{ name: "hwlab-cli", serviceId: "hwlab-cli", image }], newImages: [{ name: "hwlab-cli", serviceId: "hwlab-cli", image }] }); assert.equal(decision.replace, false); assert.equal(decision.result, "not_needed"); }); test("replacement policy refuses non-allowlisted or active Jobs", () => { const ignored = decideDevTemplateJobReplacement({ jobName: "some-other-job", jobNamespace: "hwlab-dev", desiredSuspended: true, liveExists: true, liveSuspended: true, oldImages: [{ name: "worker", serviceId: "worker", image: "image:old" }], newImages: [{ name: "worker", serviceId: "worker", image: "image:new" }] }); assert.equal(ignored.replace, false); assert.equal(ignored.result, "ignored"); const active = decideDevTemplateJobReplacement({ jobName: "hwlab-cli-template", jobNamespace: "hwlab-dev", desiredSuspended: true, liveExists: true, liveSuspended: false, oldImages: [{ name: "hwlab-cli", serviceId: "hwlab-cli", image: "image:old" }], newImages: [{ name: "hwlab-cli", serviceId: "hwlab-cli", image: "image:new" }] }); assert.equal(active.replace, false); assert.equal(active.result, "blocked"); }); test("apply source commit follows deploy/catalog artifact identity", () => { assert.equal( resolveApplySourceCommit({ commitId: "73b379f" }, { commitId: "73b379f" }, "cb35ada68606"), "73b379f" ); assert.equal( resolveApplySourceCommit({ commitId: "73b379f" }, { commitId: "deadbee" }, "cb35ada68606"), "cb35ada68606" ); }); test("runtime identity env comparator accepts matching commit image and tag", () => { const comparison = compareRuntimeIdentityEnv( { HWLAB_COMMIT_ID: "7de6edd", HWLAB_IMAGE: "127.0.0.1:5000/hwlab/hwlab-cloud-web:7de6edd", HWLAB_IMAGE_TAG: "7de6edd" }, { HWLAB_COMMIT_ID: "7de6edd2c41fb50dcb007353780338be8832b27e", HWLAB_IMAGE: "127.0.0.1:5000/hwlab/hwlab-cloud-web:7de6edd", HWLAB_IMAGE_TAG: "7de6edd" } ); assert.equal(comparison.status, "match"); assert.equal(comparison.matchesDesired, true); assert.deepEqual(comparison.drift, []); }); test("runtime identity env comparator detects stale cloud-web env drift", () => { const comparison = compareRuntimeIdentityEnv( { HWLAB_COMMIT_ID: "c7de474", HWLAB_IMAGE: "127.0.0.1:5000/hwlab/hwlab-cloud-web:c7de474", HWLAB_IMAGE_TAG: "c7de474" }, { HWLAB_COMMIT_ID: "7de6edd", HWLAB_IMAGE: "127.0.0.1:5000/hwlab/hwlab-cloud-web:7de6edd", HWLAB_IMAGE_TAG: "7de6edd" } ); assert.equal(comparison.status, "drift"); assert.equal(comparison.matchesDesired, false); assert.deepEqual( comparison.drift.map((field) => field.name), ["HWLAB_COMMIT_ID", "HWLAB_IMAGE", "HWLAB_IMAGE_TAG"] ); });