49 lines
2.2 KiB
TypeScript
49 lines
2.2 KiB
TypeScript
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<string> {
|
|
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();
|
|
});
|
|
});
|