import { describe, expect, it } from "vitest"; import { buildNpmResolutionInstallFields, recordPluginInstall } from "./installs.js"; describe("buildNpmResolutionInstallFields", () => { it("maps npm resolution metadata into install record fields", () => { const fields = buildNpmResolutionInstallFields({ name: "@openclaw/demo", version: "1.2.3", resolvedSpec: "@openclaw/demo@1.2.3", integrity: "sha512-abc", shasum: "deadbeef", resolvedAt: "2026-02-22T00:00:00.000Z", }); expect(fields).toEqual({ resolvedName: "@openclaw/demo", resolvedVersion: "1.2.3", resolvedSpec: "@openclaw/demo@1.2.3", integrity: "sha512-abc", shasum: "deadbeef", resolvedAt: "2026-02-22T00:00:00.000Z", }); }); it("returns undefined fields when resolution is missing", () => { expect(buildNpmResolutionInstallFields(undefined)).toEqual({ resolvedName: undefined, resolvedVersion: undefined, resolvedSpec: undefined, integrity: undefined, shasum: undefined, resolvedAt: undefined, }); }); }); describe("recordPluginInstall", () => { it("stores install metadata for the plugin id", () => { const next = recordPluginInstall({}, { pluginId: "demo", source: "npm", spec: "demo@latest" }); expect(next.plugins?.installs?.demo).toMatchObject({ source: "npm", spec: "demo@latest", }); expect(typeof next.plugins?.installs?.demo?.installedAt).toBe("string"); }); });