import { describe, expect, it } from "vitest"; import { buildConfigChecks, evaluateRequirementsFromMetadata, 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: ["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: ["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); }); });