/* Unit tests for boot smoke run covering resolveWranglerConfig; resolveLanguages. It also guards the documented public contract and regression-sensitive edge cases. Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only. RFC-1311: Compass header sweep — declares the boot suite's contract for test-file scaffold coverage. */ // @vitest-environment node import { describe, it, expect } from "vitest"; import { resolveWranglerConfig, resolveLanguages } from "../boot-smoke.ts"; import { mkdtempSync, mkdirSync, writeFileSync } from "node:fs"; import { join } from "node:path"; import { tmpdir } from "node:os"; describe("resolveWranglerConfig", () => { it("uses --wrangler-config flag when provided", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-wflag-")); const customConfig = join(tmpDist, "custom-wrangler.jsonc"); writeFileSync(customConfig, "{}"); const result = await resolveWranglerConfig(tmpDist, customConfig, "/fake/workspace"); expect(result).not.toBeNull(); expect(result!.wranglerConfigPath).toBe(customConfig); expect(result!.bootSmokeDistDir).toBe(tmpDist); }); it("defaults to dist/server/wrangler.json when Astro output exists", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-astro-")); mkdirSync(join(tmpDist, "server"), { recursive: true }); const astroWrangler = join(tmpDist, "server", "wrangler.json"); writeFileSync(astroWrangler, "{}"); const result = await resolveWranglerConfig(tmpDist, undefined, "/fake/workspace"); expect(result).not.toBeNull(); expect(result!.wranglerConfigPath).toBe(astroWrangler); expect(result!.bootSmokeDistDir).toBe(join(tmpDist, "server")); }); it("falls back to dist/../wrangler.jsonc when no Astro output", async () => { const tmpParent = mkdtempSync(join(tmpdir(), "boot-smoke-fallback-")); const tmpDist = join(tmpParent, "dist"); mkdirSync(tmpDist, { recursive: true }); const fallbackWrangler = join(tmpParent, "wrangler.jsonc"); writeFileSync(fallbackWrangler, "{}"); const result = await resolveWranglerConfig(tmpDist, undefined, "/fake/workspace"); expect(result).not.toBeNull(); expect(result!.wranglerConfigPath).toBe(fallbackWrangler); expect(result!.bootSmokeDistDir).toBe(tmpDist); }); it("falls back to workpiece wrangler.jsonc when no Astro and no dist/../wrangler.jsonc", async () => { const tmpWorkspace = mkdtempSync(join(tmpdir(), "boot-smoke-workspace-")); const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-wpdist-")); const workpieceDir = join(tmpWorkspace, "missions", "workpiece"); mkdirSync(workpieceDir, { recursive: true }); const workpieceWrangler = join(workpieceDir, "wrangler.jsonc"); writeFileSync(workpieceWrangler, "{}"); const result = await resolveWranglerConfig(tmpDist, undefined, tmpWorkspace); expect(result).not.toBeNull(); expect(result!.wranglerConfigPath).toBe(workpieceWrangler); expect(result!.bootSmokeDistDir).toBe(tmpDist); }); it("returns null when no wrangler config found anywhere", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-nowrangler-")); const tmpWorkspace = mkdtempSync(join(tmpdir(), "boot-smoke-nows-")); const result = await resolveWranglerConfig(tmpDist, undefined, tmpWorkspace); expect(result).toBeNull(); }); }); describe("resolveLanguages", () => { it("parses comma-separated --languages flag", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-langflag-")); const languages = await resolveLanguages(tmpDist, "de,uk"); expect(languages).toEqual(["de", "uk"]); }); it("parses multi-value --languages flag with spaces", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-langspaces-")); const languages = await resolveLanguages(tmpDist, "de, en, uk"); expect(languages).toEqual(["de", "en", "uk"]); }); it("filters empty values from --languages flag", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-langempty-")); const languages = await resolveLanguages(tmpDist, "de,,uk,"); expect(languages).toEqual(["de", "uk"]); }); it("falls back to detectBootSmokeLanguages when --languages not provided", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-langauto-")); const clientDir = join(tmpDist, "client"); mkdirSync(join(clientDir, "de"), { recursive: true }); mkdirSync(join(clientDir, "uk"), { recursive: true }); const languages = await resolveLanguages(tmpDist, undefined); expect(languages).toContain("de"); expect(languages).toContain("uk"); expect(languages).toHaveLength(2); }); it("returns fallback [de, uk] when --languages not provided and dist/client/ empty", async () => { const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-langfallback-")); const languages = await resolveLanguages(tmpDist, undefined); expect(languages).toEqual(["de", "uk"]); }); });