File size: 3,680 Bytes
25d91a4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | import { describe, expect, it } from "vitest";
import type { OpenClawConfig } from "../config/types.openclaw.js";
import type { PluginInstallRecord } from "../config/types.plugins.js";
import { filterRecordsToActive } from "./active-payload-verification.js";
describe("filterRecordsToActive", () => {
it.each(["__proto__", "constructor", "toString"] as const)(
"retains active %s records as own enumerable entries without cloning",
(pluginId) => {
const record: PluginInstallRecord = { source: "npm", installPath: `/p/${pluginId}` };
const records = Object.create(null) as Record<string, PluginInstallRecord>;
Object.defineProperty(records, pluginId, {
configurable: true,
enumerable: true,
value: record,
writable: true,
});
const filtered = filterRecordsToActive({
cfg: { plugins: { enabled: true } } as unknown as OpenClawConfig,
records,
});
expect(Object.getPrototypeOf(filtered)).toBeNull();
expect(Object.keys(filtered)).toEqual([pluginId]);
expect(Object.hasOwn(filtered, pluginId)).toBe(true);
expect(Object.getOwnPropertyDescriptor(filtered, pluginId)).toMatchObject({
enumerable: true,
value: record,
});
expect(filtered[pluginId]).toBe(record);
},
);
it("retains records for plugins whose entry is enabled", () => {
const records = {
enabled: { source: "npm" as const, installPath: "/p/enabled" },
};
const filtered = filterRecordsToActive({
cfg: {
plugins: { enabled: true, entries: { enabled: { enabled: true } } },
} as unknown as OpenClawConfig,
records,
});
expect(filtered).toEqual(records);
});
it("drops records for plugins whose entry is explicitly disabled", () => {
const records = {
"stale-disabled": { source: "npm" as const, installPath: "/p/stale" },
"active-plugin": { source: "npm" as const, installPath: "/p/active" },
};
const filtered = filterRecordsToActive({
cfg: {
plugins: {
enabled: true,
entries: {
"stale-disabled": { enabled: false },
"active-plugin": { enabled: true },
},
},
} as unknown as OpenClawConfig,
records,
});
expect(filtered).toEqual({
"active-plugin": { source: "npm", installPath: "/p/active" },
});
});
it("drops records for plugins listed in plugins.deny", () => {
const records = {
denied: { source: "npm" as const, installPath: "/p/denied" },
};
const filtered = filterRecordsToActive({
cfg: {
plugins: {
enabled: true,
deny: ["denied"],
},
} as unknown as OpenClawConfig,
records,
});
expect(filtered).toEqual({});
});
it("retains a disabled trusted-source-linked official npm install (mirroring syncOfficialPluginInstalls policy)", () => {
// The Codex install record carries the trusted-source marker. The
// existing post-update sync path treats it as authoritative regardless
// of the entry's enable flag, so the convergence smoke check must too.
const records = {
codex: {
source: "npm" as const,
spec: "@openclaw/codex",
installPath: "/p/codex",
trustedSourceLinkedOfficial: true,
},
};
const filtered = filterRecordsToActive({
env: { OPENCLAW_DISABLE_BUNDLED_PLUGINS: "1" },
cfg: {
plugins: {
enabled: true,
entries: { codex: { enabled: false } },
},
} as unknown as OpenClawConfig,
records,
});
expect(filtered).toEqual(records);
});
});
|