Files
pi-config/extensions/rpiv-pi/extensions/rpiv-core/package-checks.test.ts

60 lines
2.2 KiB
TypeScript

import { mkdirSync, writeFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { describe, expect, it } from "vitest";
import { findMissingSiblings } from "./package-checks.js";
import { SIBLINGS } from "./siblings.js";
const SETTINGS_PATH = join(process.env.HOME!, ".pi", "agent", "settings.json");
function writeSettings(contents: unknown) {
mkdirSync(dirname(SETTINGS_PATH), { recursive: true });
writeFileSync(SETTINGS_PATH, JSON.stringify(contents), "utf-8");
}
describe("findMissingSiblings", () => {
it("returns all 7 siblings when settings.json is missing", () => {
expect(findMissingSiblings()).toHaveLength(SIBLINGS.length);
});
it("returns all 7 siblings when JSON is invalid", () => {
mkdirSync(dirname(SETTINGS_PATH), { recursive: true });
writeFileSync(SETTINGS_PATH, "{not json", "utf-8");
expect(findMissingSiblings()).toHaveLength(SIBLINGS.length);
});
it("returns all 7 siblings when packages field is absent", () => {
writeSettings({ other: "data" });
expect(findMissingSiblings()).toHaveLength(SIBLINGS.length);
});
it("returns all 7 siblings when packages is not an array", () => {
writeSettings({ packages: "not-array" });
expect(findMissingSiblings()).toHaveLength(SIBLINGS.length);
});
it("filters out non-string entries defensively", () => {
writeSettings({ packages: [null, 42, "@juicesharp/rpiv-todo"] });
const missing = findMissingSiblings();
expect(missing.find((s) => s.matches.test("@juicesharp/rpiv-todo"))).toBeUndefined();
});
it("matches case-insensitively", () => {
writeSettings({ packages: ["@JUICESHARP/RPIV-TODO"] });
const missing = findMissingSiblings();
expect(missing.find((s) => s.matches.test("@juicesharp/rpiv-todo"))).toBeUndefined();
});
it("rpiv-args word-boundary: treats rpiv-args-extended as non-install", () => {
writeSettings({ packages: ["@juicesharp/rpiv-args-extended"] });
const missing = findMissingSiblings();
expect(missing.find((s) => s.pkg.endsWith("/rpiv-args"))).toBeDefined();
});
it("returns [] when all 7 siblings are installed", () => {
writeSettings({
packages: SIBLINGS.map((s) => s.pkg.replace(/^npm:/, "")),
});
expect(findMissingSiblings()).toEqual([]);
});
});