import assert from "node:assert/strict"; import { execFile } from "node:child_process"; import { mkdtemp, writeFile } from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import test from "node:test"; import { promisify } from "node:util"; import { SERVICE_IDS } from "../internal/protocol/index.mjs"; const execFileAsync = promisify(execFile); const repoRoot = path.resolve(path.dirname(new URL(import.meta.url).pathname), ".."); async function git(args) { const result = await execFileAsync("git", args, { cwd: repoRoot, timeout: 5000, maxBuffer: 1024 * 1024 }); return result.stdout.trim(); } function digestFor(index) { return `sha256:${String(index + 1).padStart(64, "0")}`; } test("refresh accepts an absolute publish report path", async () => { const commitId = await git(["rev-parse", "HEAD"]); const shortCommitId = await git(["rev-parse", "--short=7", "HEAD"]); const tempDir = await mkdtemp(path.join(os.tmpdir(), "hwlab-refresh-")); const reportPath = path.join(tempDir, "dev-artifacts.json"); await writeFile(reportPath, `${JSON.stringify({ reportVersion: "v1", taskId: "dev-artifact-publish", commitId: shortCommitId, artifactPublish: { status: "published", mode: "publish", sourceCommitId: commitId, registryPrefix: "127.0.0.1:5000/hwlab", serviceCount: SERVICE_IDS.length, requiredServiceCount: SERVICE_IDS.length, disabledServiceCount: 0, publishedCount: SERVICE_IDS.length, publishPlan: { version: "v2", services: SERVICE_IDS.map((serviceId, index) => ({ serviceId, required: true, digest: digestFor(index), image: `127.0.0.1:5000/hwlab/${serviceId}:${shortCommitId}`, imageTag: shortCommitId })) }, services: SERVICE_IDS.map((serviceId, index) => ({ serviceId, status: "published", artifactRequired: true, image: `127.0.0.1:5000/hwlab/${serviceId}:${shortCommitId}`, imageTag: shortCommitId, digest: digestFor(index), repositoryDigest: `127.0.0.1:5000/hwlab/${serviceId}@${digestFor(index)}`, buildCreatedAt: "2026-05-24T00:00:00.000Z", buildSource: `pikasTech/HWLAB@${commitId}` })) } }, null, 2)}\n`); const result = await execFileAsync(process.execPath, [ "scripts/refresh-artifact-catalog.mjs", "--target-ref", "HEAD", "--publish-report", reportPath, "--no-write" ], { cwd: repoRoot, timeout: 15000, maxBuffer: 10 * 1024 * 1024 }); const payload = JSON.parse(result.stdout); assert.equal(payload.status, "published"); assert.equal(payload.publishedCount, SERVICE_IDS.length); assert.deepEqual(payload.wrote, []); });