Files
openclaw/test/scripts/preinstall-package-manager-warning.test.ts
2026-06-21 15:18:57 +02:00

126 lines
3.5 KiB
TypeScript

// Preinstall Package Manager Warning tests cover preinstall package manager warning script behavior.
import { describe, expect, it, vi } from "vitest";
import {
createPackageManagerWarningMessage,
detectLifecyclePackageManager,
warnIfNonPnpmLifecycle,
} from "../../scripts/preinstall-package-manager-warning.mjs";
function requireFirstWarning(warn: ReturnType<typeof vi.fn>): unknown {
const [call] = warn.mock.calls;
if (!call) {
throw new Error("expected package manager warning");
}
const [message] = call;
if (message === undefined) {
throw new Error("expected package manager warning");
}
return message;
}
describe("detectLifecyclePackageManager", () => {
it("prefers npm_config_user_agent when present", () => {
expect(
detectLifecyclePackageManager({
npm_config_user_agent: "npm/11.4.1 node/v22.20.0 darwin arm64",
}),
).toBe("npm");
});
it("falls back to npm_execpath when user agent is missing", () => {
expect(
detectLifecyclePackageManager({
npm_execpath: "/Users/test/.cache/node/corepack/v1/pnpm/10.32.1/bin/pnpm.cjs",
}),
).toBe("pnpm");
});
it("detects npm cli launchers from npm_execpath", () => {
expect(
detectLifecyclePackageManager({
npm_execpath: "C:\\Tools\\nodejs\\node_modules\\npm\\bin\\npm-cli.js",
}),
).toBe("npm");
});
it("detects yarnpkg launchers from npm_execpath", () => {
expect(
detectLifecyclePackageManager({
npm_execpath: "C:\\Tools\\corepack\\yarnpkg.cmd",
}),
).toBe("yarn");
});
it("detects versioned Yarn release launchers from npm_execpath", () => {
expect(
detectLifecyclePackageManager({
npm_execpath: "/work/project/.yarn/releases/yarn-4.5.0.cjs",
}),
).toBe("yarn");
});
it("detects Yarn Berry release launchers from npm_execpath", () => {
expect(
detectLifecyclePackageManager({
npm_execpath: "/work/project/.yarn/releases/yarn-berry.cjs",
}),
).toBe("yarn");
});
it("ignores package manager names in npm_execpath parent directories", () => {
expect(
detectLifecyclePackageManager({
npm_execpath: "/tmp/npm-cache/bin/yarn.js",
}),
).toBe("yarn");
});
it("ignores untrusted user-agent tokens with control characters", () => {
expect(
detectLifecyclePackageManager({
npm_config_user_agent: "\u001bnpm/11.4.1 node/v22.20.0 darwin arm64",
npm_execpath: "/Users/test/.cache/node/corepack/v1/pnpm/10.32.1/bin/pnpm.cjs",
}),
).toBe("pnpm");
});
});
describe("createPackageManagerWarningMessage", () => {
it("returns null for pnpm", () => {
expect(createPackageManagerWarningMessage("pnpm")).toBeNull();
});
it("warns for npm installs", () => {
expect(createPackageManagerWarningMessage("npm")).toContain("prefer: corepack pnpm install");
});
});
describe("warnIfNonPnpmLifecycle", () => {
it("warns once for npm lifecycle runs", () => {
const warn = vi.fn();
expect(
warnIfNonPnpmLifecycle(
{
npm_config_user_agent: "npm/11.4.1 node/v22.20.0 darwin arm64",
},
warn,
),
).toBe(true);
expect(warn).toHaveBeenCalledTimes(1);
expect(requireFirstWarning(warn)).toContain("detected npm");
});
it("stays quiet for pnpm", () => {
const warn = vi.fn();
expect(
warnIfNonPnpmLifecycle(
{
npm_config_user_agent: "pnpm/10.32.1 npm/? node/v22.20.0 darwin arm64",
},
warn,
),
).toBe(false);
expect(warn).not.toHaveBeenCalled();
});
});