mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-11 00:14:34 +00:00
test(integration): dedupe messaging, secrets, and plugin test suites
This commit is contained in:
@@ -26,6 +26,27 @@ async function withStateDir<T>(stateDir: string, fn: () => Promise<T>) {
|
||||
);
|
||||
}
|
||||
|
||||
function writePluginPackageManifest(params: {
|
||||
packageDir: string;
|
||||
packageName: string;
|
||||
extensions: string[];
|
||||
}) {
|
||||
fs.writeFileSync(
|
||||
path.join(params.packageDir, "package.json"),
|
||||
JSON.stringify({
|
||||
name: params.packageName,
|
||||
openclaw: { extensions: params.extensions },
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
}
|
||||
|
||||
function expectEscapesPackageDiagnostic(diagnostics: Array<{ message: string }>) {
|
||||
expect(diagnostics.some((entry) => entry.message.includes("escapes package directory"))).toBe(
|
||||
true,
|
||||
);
|
||||
}
|
||||
|
||||
afterEach(() => {
|
||||
for (const dir of tempDirs.splice(0)) {
|
||||
try {
|
||||
@@ -95,14 +116,11 @@ describe("discoverOpenClawPlugins", () => {
|
||||
const globalExt = path.join(stateDir, "extensions", "pack");
|
||||
fs.mkdirSync(path.join(globalExt, "src"), { recursive: true });
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(globalExt, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "pack",
|
||||
openclaw: { extensions: ["./src/one.ts", "./src/two.ts"] },
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
writePluginPackageManifest({
|
||||
packageDir: globalExt,
|
||||
packageName: "pack",
|
||||
extensions: ["./src/one.ts", "./src/two.ts"],
|
||||
});
|
||||
fs.writeFileSync(
|
||||
path.join(globalExt, "src", "one.ts"),
|
||||
"export default function () {}",
|
||||
@@ -128,14 +146,11 @@ describe("discoverOpenClawPlugins", () => {
|
||||
const globalExt = path.join(stateDir, "extensions", "voice-call-pack");
|
||||
fs.mkdirSync(path.join(globalExt, "src"), { recursive: true });
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(globalExt, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "@openclaw/voice-call",
|
||||
openclaw: { extensions: ["./src/index.ts"] },
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
writePluginPackageManifest({
|
||||
packageDir: globalExt,
|
||||
packageName: "@openclaw/voice-call",
|
||||
extensions: ["./src/index.ts"],
|
||||
});
|
||||
fs.writeFileSync(
|
||||
path.join(globalExt, "src", "index.ts"),
|
||||
"export default function () {}",
|
||||
@@ -155,14 +170,11 @@ describe("discoverOpenClawPlugins", () => {
|
||||
const packDir = path.join(stateDir, "packs", "demo-plugin-dir");
|
||||
fs.mkdirSync(packDir, { recursive: true });
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(packDir, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "@openclaw/demo-plugin-dir",
|
||||
openclaw: { extensions: ["./index.js"] },
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
writePluginPackageManifest({
|
||||
packageDir: packDir,
|
||||
packageName: "@openclaw/demo-plugin-dir",
|
||||
extensions: ["./index.js"],
|
||||
});
|
||||
fs.writeFileSync(path.join(packDir, "index.js"), "module.exports = {}", "utf-8");
|
||||
|
||||
const { candidates } = await withStateDir(stateDir, async () => {
|
||||
@@ -178,14 +190,11 @@ describe("discoverOpenClawPlugins", () => {
|
||||
const outside = path.join(stateDir, "outside.js");
|
||||
fs.mkdirSync(globalExt, { recursive: true });
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(globalExt, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "@openclaw/escape-pack",
|
||||
openclaw: { extensions: ["../../outside.js"] },
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
writePluginPackageManifest({
|
||||
packageDir: globalExt,
|
||||
packageName: "@openclaw/escape-pack",
|
||||
extensions: ["../../outside.js"],
|
||||
});
|
||||
fs.writeFileSync(outside, "export default function () {}", "utf-8");
|
||||
|
||||
const result = await withStateDir(stateDir, async () => {
|
||||
@@ -193,9 +202,7 @@ describe("discoverOpenClawPlugins", () => {
|
||||
});
|
||||
|
||||
expect(result.candidates).toHaveLength(0);
|
||||
expect(
|
||||
result.diagnostics.some((diag) => diag.message.includes("escapes package directory")),
|
||||
).toBe(true);
|
||||
expectEscapesPackageDiagnostic(result.diagnostics);
|
||||
});
|
||||
|
||||
it("rejects package extension entries that escape via symlink", async () => {
|
||||
@@ -212,23 +219,18 @@ describe("discoverOpenClawPlugins", () => {
|
||||
return;
|
||||
}
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(globalExt, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "@openclaw/pack",
|
||||
openclaw: { extensions: ["./linked/escape.ts"] },
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
writePluginPackageManifest({
|
||||
packageDir: globalExt,
|
||||
packageName: "@openclaw/pack",
|
||||
extensions: ["./linked/escape.ts"],
|
||||
});
|
||||
|
||||
const { candidates, diagnostics } = await withStateDir(stateDir, async () => {
|
||||
return discoverOpenClawPlugins({});
|
||||
});
|
||||
|
||||
expect(candidates.some((candidate) => candidate.idHint === "pack")).toBe(false);
|
||||
expect(diagnostics.some((entry) => entry.message.includes("escapes package directory"))).toBe(
|
||||
true,
|
||||
);
|
||||
expectEscapesPackageDiagnostic(diagnostics);
|
||||
});
|
||||
|
||||
it("rejects package extension entries that are hardlinked aliases", async () => {
|
||||
@@ -252,23 +254,18 @@ describe("discoverOpenClawPlugins", () => {
|
||||
throw err;
|
||||
}
|
||||
|
||||
fs.writeFileSync(
|
||||
path.join(globalExt, "package.json"),
|
||||
JSON.stringify({
|
||||
name: "@openclaw/pack",
|
||||
openclaw: { extensions: ["./escape.ts"] },
|
||||
}),
|
||||
"utf-8",
|
||||
);
|
||||
writePluginPackageManifest({
|
||||
packageDir: globalExt,
|
||||
packageName: "@openclaw/pack",
|
||||
extensions: ["./escape.ts"],
|
||||
});
|
||||
|
||||
const { candidates, diagnostics } = await withStateDir(stateDir, async () => {
|
||||
return discoverOpenClawPlugins({});
|
||||
});
|
||||
|
||||
expect(candidates.some((candidate) => candidate.idHint === "pack")).toBe(false);
|
||||
expect(diagnostics.some((entry) => entry.message.includes("escapes package directory"))).toBe(
|
||||
true,
|
||||
);
|
||||
expectEscapesPackageDiagnostic(diagnostics);
|
||||
});
|
||||
|
||||
it("ignores package manifests that are hardlinked aliases", async () => {
|
||||
|
||||
Reference in New Issue
Block a user