refactor: dedupe plugin lazy runtime helpers

This commit is contained in:
Peter Steinberger
2026-03-17 09:24:14 -07:00
parent c94beb03b2
commit 39a8dab0da
20 changed files with 94 additions and 78 deletions

View File

@@ -255,6 +255,7 @@ export const baseConfig = (): OpenClawConfig =>
}) as OpenClawConfig;
vi.mock("@buape/carbon", () => {
class Command {}
class ReadyListener {}
class RateLimitError extends Error {
status = 429;
@@ -292,7 +293,7 @@ vi.mock("@buape/carbon", () => {
return clientGetPluginMock(name);
}
}
return { Client, RateLimitError, ReadyListener };
return { Client, Command, RateLimitError, ReadyListener };
});
vi.mock("@buape/carbon/gateway", () => ({
@@ -377,23 +378,23 @@ vi.mock("openclaw/plugin-sdk/infra-runtime", async () => {
};
});
vi.mock("../discord/src/accounts.js", () => ({
vi.mock("../../../extensions/discord/src/accounts.js", () => ({
resolveDiscordAccount: resolveDiscordAccountMock,
}));
vi.mock("../discord/src/probe.js", () => ({
vi.mock("../../../extensions/discord/src/probe.js", () => ({
fetchDiscordApplicationId: async () => "app-1",
}));
vi.mock("../discord/src/token.js", () => ({
vi.mock("../../../extensions/discord/src/token.js", () => ({
normalizeDiscordToken: (value?: string) => value,
}));
vi.mock("../discord/src/voice/command.js", () => ({
vi.mock("../../../extensions/discord/src/voice/command.js", () => ({
createDiscordVoiceCommand: () => ({ name: "voice-command" }),
}));
vi.mock("../discord/src/monitor/agent-components.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/agent-components.js", () => ({
createAgentComponentButton: () => ({ id: "btn" }),
createAgentSelectMenu: () => ({ id: "menu" }),
createDiscordComponentButton: () => ({ id: "btn2" }),
@@ -405,15 +406,15 @@ vi.mock("../discord/src/monitor/agent-components.js", () => ({
createDiscordComponentUserSelect: () => ({ id: "user" }),
}));
vi.mock("../discord/src/monitor/auto-presence.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/auto-presence.js", () => ({
createDiscordAutoPresenceController: createDiscordAutoPresenceControllerMock,
}));
vi.mock("../discord/src/monitor/commands.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/commands.js", () => ({
resolveDiscordSlashCommandConfig: () => ({ ephemeral: false }),
}));
vi.mock("../discord/src/monitor/exec-approvals.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/exec-approvals.js", () => ({
createExecApprovalButton: () => ({ id: "exec-approval" }),
DiscordExecApprovalHandler: class DiscordExecApprovalHandler {
async start() {
@@ -425,11 +426,11 @@ vi.mock("../discord/src/monitor/exec-approvals.js", () => ({
},
}));
vi.mock("../discord/src/monitor/gateway-plugin.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/gateway-plugin.js", () => ({
createDiscordGatewayPlugin: () => ({ id: "gateway-plugin" }),
}));
vi.mock("../discord/src/monitor/listeners.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/listeners.js", () => ({
DiscordMessageListener: class DiscordMessageListener {},
DiscordPresenceListener: class DiscordPresenceListener {},
DiscordReactionListener: class DiscordReactionListener {},
@@ -438,34 +439,34 @@ vi.mock("../discord/src/monitor/listeners.js", () => ({
registerDiscordListener: vi.fn(),
}));
vi.mock("../discord/src/monitor/message-handler.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/message-handler.js", () => ({
createDiscordMessageHandler: createDiscordMessageHandlerMock,
}));
vi.mock("../discord/src/monitor/native-command.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/native-command.js", () => ({
createDiscordCommandArgFallbackButton: () => ({ id: "arg-fallback" }),
createDiscordModelPickerFallbackButton: () => ({ id: "model-fallback-btn" }),
createDiscordModelPickerFallbackSelect: () => ({ id: "model-fallback-select" }),
createDiscordNativeCommand: createDiscordNativeCommandMock,
}));
vi.mock("../discord/src/monitor/presence.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/presence.js", () => ({
resolveDiscordPresenceUpdate: () => undefined,
}));
vi.mock("../discord/src/monitor/provider.allowlist.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/provider.allowlist.js", () => ({
resolveDiscordAllowlistConfig: resolveDiscordAllowlistConfigMock,
}));
vi.mock("../discord/src/monitor/provider.lifecycle.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/provider.lifecycle.js", () => ({
runDiscordGatewayLifecycle: monitorLifecycleMock,
}));
vi.mock("../discord/src/monitor/rest-fetch.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/rest-fetch.js", () => ({
resolveDiscordRestFetch: () => async () => undefined,
}));
vi.mock("../discord/src/monitor/thread-bindings.js", () => ({
vi.mock("../../../extensions/discord/src/monitor/thread-bindings.js", () => ({
createNoopThreadBindingManager: createNoopThreadBindingManagerMock,
createThreadBindingManager: createThreadBindingManagerMock,
reconcileAcpThreadBindingsOnStartup: reconcileAcpThreadBindingsOnStartupMock,

View File

@@ -0,0 +1,22 @@
import { vi } from "vitest";
export const pluginCommandMocks = {
getPluginCommandSpecs: vi.fn(() => []),
matchPluginCommand: vi.fn(() => null),
executePluginCommand: vi.fn(async () => ({ text: "ok" })),
};
vi.mock("openclaw/plugin-sdk/plugin-runtime", () => ({
getPluginCommandSpecs: pluginCommandMocks.getPluginCommandSpecs,
matchPluginCommand: pluginCommandMocks.matchPluginCommand,
executePluginCommand: pluginCommandMocks.executePluginCommand,
}));
export function resetPluginCommandMocks() {
pluginCommandMocks.getPluginCommandSpecs.mockClear();
pluginCommandMocks.getPluginCommandSpecs.mockReturnValue([]);
pluginCommandMocks.matchPluginCommand.mockClear();
pluginCommandMocks.matchPluginCommand.mockReturnValue(null);
pluginCommandMocks.executePluginCommand.mockClear();
pluginCommandMocks.executePluginCommand.mockResolvedValue({ text: "ok" });
}