/*
Unit tests for boot smoke languages covering detectBootSmokeLanguages. 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 { detectBootSmokeLanguages } from "../boot-smoke.ts";
import { mkdtempSync, mkdirSync } from "node:fs";
import { join } from "node:path";
import { tmpdir } from "node:os";
describe("detectBootSmokeLanguages", () => {
it("returns fallback [de, uk] when dist/client/ does not exist", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-noclient-"));
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toEqual(["de", "uk"]);
});
it("returns fallback [de, uk] when dist/client/ is empty", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-empty-"));
mkdirSync(join(tmpDist, "client"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toEqual(["de", "uk"]);
});
it("detects de and uk directories", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-deuk-"));
const clientDir = join(tmpDist, "client");
mkdirSync(join(clientDir, "de"), { recursive: true });
mkdirSync(join(clientDir, "uk"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toContain("de");
expect(languages).toContain("uk");
expect(languages).toHaveLength(2);
});
it("detects de, en, and uk directories", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-deenuk-"));
const clientDir = join(tmpDist, "client");
for (const lang of ["de", "en", "uk"]) {
mkdirSync(join(clientDir, lang), { recursive: true });
}
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toContain("de");
expect(languages).toContain("en");
expect(languages).toContain("uk");
expect(languages).toHaveLength(3);
});
it("excludes non-language directories (cosmic, textures, preview)", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-nonlang-"));
const clientDir = join(tmpDist, "client");
mkdirSync(join(clientDir, "de"), { recursive: true });
mkdirSync(join(clientDir, "cosmic"), { recursive: true });
mkdirSync(join(clientDir, "textures"), { recursive: true });
mkdirSync(join(clientDir, "preview"), { recursive: true });
mkdirSync(join(clientDir, "nachweis-pdfs"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toEqual(["de"]);
});
it("excludes directories starting with underscore (_astro, _img)", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-underscore-"));
const clientDir = join(tmpDist, "client");
mkdirSync(join(clientDir, "de"), { recursive: true });
mkdirSync(join(clientDir, "_astro"), { recursive: true });
mkdirSync(join(clientDir, "_img"), { recursive: true });
mkdirSync(join(clientDir, "_print"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toEqual(["de"]);
});
it("excludes the api directory", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-api-"));
const clientDir = join(tmpDist, "client");
mkdirSync(join(clientDir, "de"), { recursive: true });
mkdirSync(join(clientDir, "api"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toEqual(["de"]);
});
it("detects only language directories from mixed content", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-mixed-"));
const clientDir = join(tmpDist, "client");
mkdirSync(join(clientDir, "de"), { recursive: true });
mkdirSync(join(clientDir, "uk"), { recursive: true });
mkdirSync(join(clientDir, "_astro"), { recursive: true });
mkdirSync(join(clientDir, "api"), { recursive: true });
mkdirSync(join(clientDir, "cosmic"), { recursive: true });
mkdirSync(join(clientDir, "website"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toContain("de");
expect(languages).toContain("uk");
expect(languages).toHaveLength(2);
});
it("excludes 3-letter directories (eng, deu)", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-3letter-"));
const clientDir = join(tmpDist, "client");
mkdirSync(join(clientDir, "de"), { recursive: true });
mkdirSync(join(clientDir, "eng"), { recursive: true });
mkdirSync(join(clientDir, "deu"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toEqual(["de"]);
});
it("excludes uppercase directories (DE, UK)", async () => {
const tmpDist = mkdtempSync(join(tmpdir(), "boot-smoke-lang-upper-"));
const clientDir = join(tmpDist, "client");
mkdirSync(join(clientDir, "de"), { recursive: true });
mkdirSync(join(clientDir, "DE"), { recursive: true });
mkdirSync(join(clientDir, "UK"), { recursive: true });
const languages = await detectBootSmokeLanguages(tmpDist);
expect(languages).toEqual(["de"]);
});
});