mirror of
https://github.com/openclaw/openclaw.git
synced 2026-03-17 13:00:48 +00:00
203 lines
5.8 KiB
TypeScript
203 lines
5.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
buildConfigChecks,
|
|
evaluateRequirements,
|
|
evaluateRequirementsFromMetadata,
|
|
evaluateRequirementsFromMetadataWithRemote,
|
|
resolveMissingAnyBins,
|
|
resolveMissingBins,
|
|
resolveMissingEnv,
|
|
resolveMissingOs,
|
|
} from "./requirements.js";
|
|
|
|
describe("requirements helpers", () => {
|
|
it("resolveMissingBins respects local+remote", () => {
|
|
expect(
|
|
resolveMissingBins({
|
|
required: ["a", "b", "c"],
|
|
hasLocalBin: (bin) => bin === "a",
|
|
hasRemoteBin: (bin) => bin === "b",
|
|
}),
|
|
).toEqual(["c"]);
|
|
});
|
|
|
|
it("resolveMissingAnyBins requires at least one", () => {
|
|
expect(
|
|
resolveMissingAnyBins({
|
|
required: [],
|
|
hasLocalBin: () => false,
|
|
}),
|
|
).toEqual([]);
|
|
expect(
|
|
resolveMissingAnyBins({
|
|
required: ["a", "b"],
|
|
hasLocalBin: () => false,
|
|
hasRemoteAnyBin: () => false,
|
|
}),
|
|
).toEqual(["a", "b"]);
|
|
expect(
|
|
resolveMissingAnyBins({
|
|
required: ["a", "b"],
|
|
hasLocalBin: (bin) => bin === "b",
|
|
}),
|
|
).toEqual([]);
|
|
});
|
|
|
|
it("resolveMissingOs allows remote platform", () => {
|
|
expect(resolveMissingOs({ required: [], localPlatform: "linux" })).toEqual([]);
|
|
expect(resolveMissingOs({ required: ["linux"], localPlatform: "linux" })).toEqual([]);
|
|
expect(
|
|
resolveMissingOs({
|
|
required: ["darwin"],
|
|
localPlatform: "linux",
|
|
remotePlatforms: ["darwin"],
|
|
}),
|
|
).toEqual([]);
|
|
expect(resolveMissingOs({ required: ["darwin"], localPlatform: "linux" })).toEqual(["darwin"]);
|
|
});
|
|
|
|
it("resolveMissingEnv uses predicate", () => {
|
|
expect(
|
|
resolveMissingEnv({ required: ["A", "B"], isSatisfied: (name) => name === "B" }),
|
|
).toEqual(["A"]);
|
|
});
|
|
|
|
it("buildConfigChecks includes status", () => {
|
|
expect(
|
|
buildConfigChecks({
|
|
required: ["a.b"],
|
|
isSatisfied: (p) => p === "a.b",
|
|
}),
|
|
).toEqual([{ path: "a.b", satisfied: true }]);
|
|
});
|
|
|
|
it("evaluateRequirementsFromMetadata derives required+missing", () => {
|
|
const res = evaluateRequirementsFromMetadata({
|
|
always: false,
|
|
metadata: {
|
|
requires: { bins: ["a"], anyBins: ["b"], env: ["E"], config: ["cfg.value"] },
|
|
os: ["darwin"],
|
|
},
|
|
hasLocalBin: (bin) => bin === "a",
|
|
localPlatform: "linux",
|
|
isEnvSatisfied: (name) => name === "E",
|
|
isConfigSatisfied: () => false,
|
|
});
|
|
|
|
expect(res.required.bins).toEqual(["a"]);
|
|
expect(res.missing.config).toEqual(["cfg.value"]);
|
|
expect(res.missing.os).toEqual(["darwin"]);
|
|
expect(res.eligible).toBe(false);
|
|
});
|
|
|
|
it("evaluateRequirements reports config checks and all missing categories directly", () => {
|
|
const res = evaluateRequirements({
|
|
always: false,
|
|
required: {
|
|
bins: ["node"],
|
|
anyBins: ["bun", "deno"],
|
|
env: ["OPENAI_API_KEY"],
|
|
config: ["browser.enabled", "gateway.enabled"],
|
|
os: ["darwin"],
|
|
},
|
|
hasLocalBin: () => false,
|
|
hasRemoteBin: (bin) => bin === "node",
|
|
hasRemoteAnyBin: () => false,
|
|
localPlatform: "linux",
|
|
remotePlatforms: ["windows"],
|
|
isEnvSatisfied: () => false,
|
|
isConfigSatisfied: (path) => path === "gateway.enabled",
|
|
});
|
|
|
|
expect(res.missing).toEqual({
|
|
bins: [],
|
|
anyBins: ["bun", "deno"],
|
|
env: ["OPENAI_API_KEY"],
|
|
config: ["browser.enabled"],
|
|
os: ["darwin"],
|
|
});
|
|
expect(res.configChecks).toEqual([
|
|
{ path: "browser.enabled", satisfied: false },
|
|
{ path: "gateway.enabled", satisfied: true },
|
|
]);
|
|
expect(res.eligible).toBe(false);
|
|
});
|
|
|
|
it("clears missing requirements when always is true but preserves config checks", () => {
|
|
const res = evaluateRequirements({
|
|
always: true,
|
|
required: {
|
|
bins: ["node"],
|
|
anyBins: ["bun"],
|
|
env: ["OPENAI_API_KEY"],
|
|
config: ["browser.enabled"],
|
|
os: ["darwin"],
|
|
},
|
|
hasLocalBin: () => false,
|
|
localPlatform: "linux",
|
|
isEnvSatisfied: () => false,
|
|
isConfigSatisfied: () => false,
|
|
});
|
|
|
|
expect(res.missing).toEqual({ bins: [], anyBins: [], env: [], config: [], os: [] });
|
|
expect(res.configChecks).toEqual([{ path: "browser.enabled", satisfied: false }]);
|
|
expect(res.eligible).toBe(true);
|
|
});
|
|
|
|
it("evaluateRequirementsFromMetadataWithRemote wires remote predicates and platforms through", () => {
|
|
const res = evaluateRequirementsFromMetadataWithRemote({
|
|
always: false,
|
|
metadata: {
|
|
requires: { bins: ["node"], anyBins: ["bun"], env: ["OPENAI_API_KEY"] },
|
|
os: ["darwin"],
|
|
},
|
|
remote: {
|
|
hasBin: (bin) => bin === "node",
|
|
hasAnyBin: (bins) => bins.includes("bun"),
|
|
platforms: ["darwin"],
|
|
},
|
|
hasLocalBin: () => false,
|
|
localPlatform: "linux",
|
|
isEnvSatisfied: (name) => name === "OPENAI_API_KEY",
|
|
isConfigSatisfied: () => true,
|
|
});
|
|
|
|
expect(res.required).toEqual({
|
|
bins: ["node"],
|
|
anyBins: ["bun"],
|
|
env: ["OPENAI_API_KEY"],
|
|
config: [],
|
|
os: ["darwin"],
|
|
});
|
|
expect(res.missing).toEqual({ bins: [], anyBins: [], env: [], config: [], os: [] });
|
|
expect(res.eligible).toBe(true);
|
|
});
|
|
|
|
it("evaluateRequirementsFromMetadata defaults missing metadata to empty requirements", () => {
|
|
const res = evaluateRequirementsFromMetadata({
|
|
always: false,
|
|
hasLocalBin: () => false,
|
|
localPlatform: "linux",
|
|
isEnvSatisfied: () => false,
|
|
isConfigSatisfied: () => false,
|
|
});
|
|
|
|
expect(res.required).toEqual({
|
|
bins: [],
|
|
anyBins: [],
|
|
env: [],
|
|
config: [],
|
|
os: [],
|
|
});
|
|
expect(res.missing).toEqual({
|
|
bins: [],
|
|
anyBins: [],
|
|
env: [],
|
|
config: [],
|
|
os: [],
|
|
});
|
|
expect(res.configChecks).toEqual([]);
|
|
expect(res.eligible).toBe(true);
|
|
});
|
|
});
|