import { test } from "node:test"; import assert from "node:assert/strict"; import { mkdtempSync, readFileSync, rmSync, existsSync } from "node:fs"; import { tmpdir } from "node:os"; import { resolve, join } from "node:path"; import { parse } from "yaml"; import { prepareBundle } from "./release-bundle.mjs"; test("consumer bundle pins every service and carries all source bind resources", () => { const output = mkdtempSync(join(tmpdir(), "thoth-release-test-")); const images = Object.fromEntries(["core", "frontend", "catalog", "qdrant", "embedding"].map((role) => [role, `docker.io/tylconsulting/${role}@sha256:${"a".repeat(64)}`])); try { prepareBundle({ source: resolve(import.meta.dirname, "../.."), destination: output, platform: "linux/amd64", version: "0.1.0-install-preview.1", revision: "b".repeat(40), images }); const manifest = JSON.parse(readFileSync(join(output, "release-manifest.json"))); const compose = parse(readFileSync(join(output, "compose.yaml"), "utf8")); assert.equal(compose.services.core.image, images.core); assert.equal(compose.services["catalog-migrate"].image, images.core); assert.equal(compose.services["workspace-maintenance"].image, images.core); assert.equal(compose.services["embedding-model-init"].image, images.embedding); for (const service of Object.values(compose.services)) { assert.equal(service.build, undefined); assert.equal(service.pull_policy, undefined); assert.equal(service.platform, "linux/amd64"); for (const volume of service.volumes ?? []) { if (typeof volume === "string" && volume.startsWith("./")) assert.ok(existsSync(join(output, volume.split(":")[0]))); } } assert.equal(manifest.validator_protocol, 1); assert.deepEqual(manifest.compose, ["compose.yaml", "deploy/compose.local.yaml"]); assert.ok(manifest.files["docker/catalog-db-init.sql"]); assert.ok(manifest.files["docker/embedding-model-init.sh"]); assert.ok(!existsSync(join(output, "backend"))); assert.ok(!existsSync(join(output, "harness"))); } finally { rmSync(output, { recursive: true, force: true }); } });