import assert from "node:assert/strict"; import { mkdtemp, mkdir, writeFile } from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import test from "node:test"; import { buildDesiredStatePlan } from "./src/deploy-desired-state-plan.mjs"; async function makeFixture({ commitId = "abc1234", workloadTag = commitId, workloadEnvTag = commitId } = {}) { const root = await mkdtemp(path.join(os.tmpdir(), "hwlab-desired-state-")); await mkdir(path.join(root, "deploy/k8s/base"), { recursive: true }); await mkdir(path.join(root, "reports/dev-gate"), { recursive: true }); const image = `127.0.0.1:5000/hwlab/hwlab-cloud-api:${commitId}`; const workloadImage = `127.0.0.1:5000/hwlab/hwlab-cloud-api:${workloadTag}`; const deploy = { manifestVersion: "v1", environment: "dev", commitId, services: [ { serviceId: "hwlab-cloud-api", image, namespace: "hwlab-dev", healthPath: "/health/live", profile: "dev", replicas: 1, env: { HWLAB_COMMIT_ID: commitId, HWLAB_IMAGE: image, HWLAB_IMAGE_TAG: commitId } } ] }; const catalog = { catalogVersion: "v1", kind: "hwlab-artifact-catalog", environment: "dev", profile: "dev", namespace: "hwlab-dev", endpoint: "http://74.48.78.17:16667", commitId, artifactState: "contract-skeleton", publish: { ciPublished: false, registryVerified: false, provenance: "not_available_until_publish" }, services: [ { serviceId: "hwlab-cloud-api", commitId, image, imageTag: commitId, digest: "not_published", publishState: "skeleton-only", artifactRequired: true } ] }; const workloads = { apiVersion: "v1", kind: "List", items: [ { apiVersion: "apps/v1", kind: "Deployment", metadata: { name: "hwlab-cloud-api", namespace: "hwlab-dev", labels: { "hwlab.pikastech.local/service-id": "hwlab-cloud-api" } }, spec: { template: { spec: { containers: [ { name: "hwlab-cloud-api", image: workloadImage, env: [ { name: "HWLAB_COMMIT_ID", value: commitId }, { name: "HWLAB_IMAGE", value: image }, { name: "HWLAB_IMAGE_TAG", value: workloadEnvTag } ] } ] } } } } ] }; await writeFile(path.join(root, "deploy/deploy.json"), `${JSON.stringify(deploy, null, 2)}\n`); await writeFile(path.join(root, "deploy/artifact-catalog.dev.json"), `${JSON.stringify(catalog, null, 2)}\n`); await writeFile(path.join(root, "deploy/k8s/base/workloads.yaml"), `${JSON.stringify(workloads, null, 2)}\n`); return root; } test("passes internally consistent desired-state", async () => { const repoRoot = await makeFixture(); const plan = await buildDesiredStatePlan({ repoRoot }); assert.equal(plan.status, "pass"); assert.equal(plan.summary.desiredCommitId, "abc1234"); assert.equal(plan.summary.presentMirrorCount, 6); assert.deepEqual(plan.diagnostics, []); }); test("target tag review is read-only promotion_pending when current state is uniformly older", async () => { const repoRoot = await makeFixture(); const plan = await buildDesiredStatePlan({ repoRoot, targetTag: "def5678" }); assert.equal(plan.status, "planned"); assert.equal(plan.target.convergence.state, "promotion_pending"); assert.equal(plan.summary.blockers, 0); assert.match(plan.services[0].promotion.deployImage, /:def5678$/u); }); test("blocks on mirror drift", async () => { const repoRoot = await makeFixture({ workloadEnvTag: "badcafe" }); const plan = await buildDesiredStatePlan({ repoRoot }); assert.equal(plan.status, "blocked"); assert.equal(plan.summary.blockers, 1); assert.equal(plan.diagnostics[0].code, "mirror_mismatch"); assert.match(plan.diagnostics[0].path, /HWLAB_IMAGE_TAG/u); }); test("blocks on workload image drift", async () => { const repoRoot = await makeFixture({ workloadTag: "badcafe" }); const plan = await buildDesiredStatePlan({ repoRoot }); assert.equal(plan.status, "blocked"); assert.ok(plan.diagnostics.some((diagnostic) => diagnostic.code === "image_tag_mismatch")); assert.ok(plan.diagnostics.some((diagnostic) => diagnostic.code === "image_mismatch")); }); test("reports partial target drift as a blocker", async () => { const repoRoot = await makeFixture({ workloadTag: "def5678", workloadEnvTag: "def5678" }); const plan = await buildDesiredStatePlan({ repoRoot, targetTag: "def5678" }); assert.equal(plan.status, "blocked"); assert.equal(plan.target.convergence.state, "partial_drift"); assert.ok(plan.diagnostics.some((diagnostic) => diagnostic.code === "partial_target_drift")); });