From 8a77f299eed540f2b0f21b501f730acb1b385b67 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 1 May 2026 16:44:53 +0100 Subject: [PATCH] test(plugins): materialize runtime deps fixtures --- src/plugins/bundled-runtime-root.test.ts | 51 ++++------------------- src/plugins/public-surface-loader.test.ts | 13 ++++++ 2 files changed, 20 insertions(+), 44 deletions(-) diff --git a/src/plugins/bundled-runtime-root.test.ts b/src/plugins/bundled-runtime-root.test.ts index 7fe2edf747c..7b5f982a056 100644 --- a/src/plugins/bundled-runtime-root.test.ts +++ b/src/plugins/bundled-runtime-root.test.ts @@ -244,14 +244,7 @@ describe("prepareBundledPluginRuntimeRoot", () => { "utf8", ); const pluginInstallRoot = resolveBundledRuntimeDependencyInstallRoot(pluginRoot, { env }); - fs.mkdirSync(path.join(pluginInstallRoot, "node_modules", `${pluginId}-runtime`), { - recursive: true, - }); - fs.writeFileSync( - path.join(pluginInstallRoot, "node_modules", `${pluginId}-runtime`, "package.json"), - JSON.stringify({ name: `${pluginId}-runtime`, version: "1.0.0", type: "module" }), - "utf8", - ); + writeInstalledRuntimeDepPackage(pluginInstallRoot, `${pluginId}-runtime`, "1.0.0"); } writeGeneratedRuntimeDepsManifest(installRoot, ["alpha-runtime@1.0.0", "beta-runtime@1.0.0"]); @@ -323,12 +316,7 @@ describe("prepareBundledPluginRuntimeRoot", () => { "utf8", ); const installRoot = resolveBundledRuntimeDependencyInstallRoot(pluginRoot, { env }); - fs.mkdirSync(path.join(installRoot, "node_modules", "alpha-runtime"), { recursive: true }); - fs.writeFileSync( - path.join(installRoot, "node_modules", "alpha-runtime", "package.json"), - JSON.stringify({ name: "alpha-runtime", version: "1.0.0", type: "module" }), - "utf8", - ); + writeInstalledRuntimeDepPackage(installRoot, "alpha-runtime", "1.0.0"); writeGeneratedRuntimeDepsManifest(installRoot, ["alpha-runtime@1.0.0"]); const realReaddirSync = fs.readdirSync.bind(fs); @@ -389,12 +377,7 @@ describe("prepareBundledPluginRuntimeRoot", () => { ), "utf8", ); - fs.mkdirSync(path.join(installRoot, "node_modules", "qqbot-runtime"), { recursive: true }); - fs.writeFileSync( - path.join(installRoot, "node_modules", "qqbot-runtime", "package.json"), - JSON.stringify({ name: "qqbot-runtime", version: "1.0.0", type: "module" }), - "utf8", - ); + writeInstalledRuntimeDepPackage(installRoot, "qqbot-runtime", "1.0.0"); writeGeneratedRuntimeDepsManifest(installRoot, ["qqbot-runtime@1.0.0"]); const prepared = prepareBundledPluginRuntimeRoot({ @@ -473,12 +456,7 @@ describe("prepareBundledPluginRuntimeRoot", () => { "utf8", ); const installRoot = resolveBundledRuntimeDependencyInstallRoot(runtimePluginRoot, { env }); - fs.mkdirSync(path.join(installRoot, "node_modules", "qqbot-runtime"), { recursive: true }); - fs.writeFileSync( - path.join(installRoot, "node_modules", "qqbot-runtime", "package.json"), - JSON.stringify({ name: "qqbot-runtime", version: "1.0.0", type: "module" }), - "utf8", - ); + writeInstalledRuntimeDepPackage(installRoot, "qqbot-runtime", "1.0.0"); writeGeneratedRuntimeDepsManifest(installRoot, ["qqbot-runtime@1.0.0"]); const prepared = prepareBundledPluginRuntimeRoot({ @@ -539,12 +517,7 @@ describe("prepareBundledPluginRuntimeRoot", () => { "utf8", ); const installRoot = resolveBundledRuntimeDependencyInstallRoot(runtimePluginRoot, { env }); - fs.mkdirSync(path.join(installRoot, "node_modules", "qqbot-runtime"), { recursive: true }); - fs.writeFileSync( - path.join(installRoot, "node_modules", "qqbot-runtime", "package.json"), - JSON.stringify({ name: "qqbot-runtime", version: "1.0.0", type: "module" }), - "utf8", - ); + writeInstalledRuntimeDepPackage(installRoot, "qqbot-runtime", "1.0.0"); writeGeneratedRuntimeDepsManifest(installRoot, ["qqbot-runtime@1.0.0"]); const lockPath = path.join(installRoot, ".openclaw-runtime-mirror.lock"); @@ -602,12 +575,7 @@ describe("prepareBundledPluginRuntimeRoot", () => { "utf8", ); const installRoot = resolveBundledRuntimeDependencyInstallRoot(pluginRoot, { env }); - fs.mkdirSync(path.join(installRoot, "node_modules", "whatsapp-runtime"), { recursive: true }); - fs.writeFileSync( - path.join(installRoot, "node_modules", "whatsapp-runtime", "package.json"), - JSON.stringify({ name: "whatsapp-runtime", version: "1.0.0", type: "module" }), - "utf8", - ); + writeInstalledRuntimeDepPackage(installRoot, "whatsapp-runtime", "1.0.0"); writeGeneratedRuntimeDepsManifest(installRoot, ["whatsapp-runtime@1.0.0"]); const prepared = prepareBundledPluginRuntimeRoot({ @@ -759,12 +727,7 @@ describe("prepareBundledPluginRuntimeRoot", () => { "utf8", ); const installRoot = resolveBundledRuntimeDependencyInstallRoot(pluginRoot, { env }); - fs.mkdirSync(path.join(installRoot, "node_modules", "whatsapp-runtime"), { recursive: true }); - fs.writeFileSync( - path.join(installRoot, "node_modules", "whatsapp-runtime", "package.json"), - JSON.stringify({ name: "whatsapp-runtime", version: "1.0.0", type: "module" }), - "utf8", - ); + writeInstalledRuntimeDepPackage(installRoot, "whatsapp-runtime", "1.0.0"); writeGeneratedRuntimeDepsManifest(installRoot, ["whatsapp-runtime@1.0.0"]); const prepared = prepareBundledPluginRuntimeRoot({ diff --git a/src/plugins/public-surface-loader.test.ts b/src/plugins/public-surface-loader.test.ts index fdfba878deb..21c69e84903 100644 --- a/src/plugins/public-surface-loader.test.ts +++ b/src/plugins/public-surface-loader.test.ts @@ -5,6 +5,7 @@ import { importFreshModule } from "openclaw/plugin-sdk/test-fixtures"; import { afterEach, describe, expect, it, vi } from "vitest"; import { resolveBundledRuntimeDependencyInstallRoot } from "./bundled-runtime-deps-roots.js"; import { clearBundledRuntimeDependencyNodePaths } from "./bundled-runtime-deps.js"; +import { writeGeneratedRuntimeDepsManifest } from "./test-helpers/bundled-runtime-deps-fixtures.js"; const tempDirs: string[] = []; const originalBundledPluginsDir = process.env.OPENCLAW_BUNDLED_PLUGINS_DIR; @@ -79,6 +80,7 @@ function createPackagedPublicArtifactWithStagedRuntimeDep(): { "utf8", ); fs.writeFileSync(path.join(depRoot, "index.js"), 'export const marker = "staged";\n', "utf8"); + writeGeneratedRuntimeDepsManifest(installRoot, ["public-artifact-runtime-dep@1.0.0"]); return { bundledPluginsDir: path.join(packageRoot, "dist", "extensions"), @@ -94,6 +96,7 @@ afterEach(() => { vi.restoreAllMocks(); vi.resetModules(); vi.doUnmock("jiti"); + vi.doUnmock("./native-module-require.js"); vi.doUnmock("node:module"); clearBundledRuntimeDependencyNodePaths(); if (originalBundledPluginsDir === undefined) { @@ -114,6 +117,11 @@ describe("bundled plugin public surface loader", () => { vi.doMock("jiti", () => ({ createJiti, })); + vi.doMock("./native-module-require.js", () => ({ + isJavaScriptModulePath: (modulePath: string) => + modulePath.endsWith(".js") || modulePath.endsWith(".mjs") || modulePath.endsWith(".cjs"), + tryNativeRequireJavaScriptModule: () => ({ ok: false }), + })); const platformSpy = vi.spyOn(process, "platform", "get").mockReturnValue("win32"); vi.resetModules(); @@ -193,6 +201,11 @@ describe("bundled plugin public surface loader", () => { vi.doMock("jiti", () => ({ createJiti, })); + vi.doMock("./native-module-require.js", () => ({ + isJavaScriptModulePath: (modulePath: string) => + modulePath.endsWith(".js") || modulePath.endsWith(".mjs") || modulePath.endsWith(".cjs"), + tryNativeRequireJavaScriptModule: () => ({ ok: false }), + })); vi.resetModules(); const publicSurfaceLoader = await importFreshModule<