import { afterEach, describe, expect, test } from "bun:test"; import { mkdir, mkdtemp, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { InvalidUtf8Error } from "../src/lib/fs"; import { isMissingPackageMetadataError, readPackageValue } from "../src/lib/packageMeta"; const directories: string[] = []; afterEach(async () => { await Promise.all(directories.splice(0).map((directory) => rm(directory, { recursive: true, force: true }))); }); async function packageDir(): Promise { const directory = await mkdtemp(join(tmpdir(), "hy2xs-metadata-")); directories.push(directory); await mkdir(join(directory, "metadata")); return directory; } describe("metadata пакета", () => { test("fallback классифицирует только ENOENT", () => { expect(isMissingPackageMetadataError(Object.assign(new Error("missing"), { code: "ENOENT" }))).toBe(true); for (const code of ["EACCES", "EIO", "EISDIR"]) { expect(isMissingPackageMetadataError(Object.assign(new Error(code), { code }))).toBe(false); } expect(isMissingPackageMetadataError(new InvalidUtf8Error("metadata/value", new Error("decode")))).toBe(false); }); test("отсутствующее необязательное значение использует fallback", async () => { const directory = await packageDir(); expect(await readPackageValue(directory, "missing", "unknown")).toBe("unknown"); }); test("повреждённый UTF-8 не маскируется fallback-значением", async () => { const directory = await packageDir(); await writeFile(join(directory, "metadata", "package.version"), new Uint8Array([0x31, 0xff])); await expect(readPackageValue(directory, "package.version", "unknown")).rejects.toBeInstanceOf( InvalidUtf8Error ); }); test("каталог вместо metadata-файла не маскируется fallback-значением", async () => { const directory = await packageDir(); await mkdir(join(directory, "metadata", "package.version")); await expect(readPackageValue(directory, "package.version", "unknown")).rejects.toBeDefined(); }); });