openclaw/src/cli/deps.test.ts
scoootscooob 439c21e078
refactor: remove channel shim directories, point all imports to extensions (#45967)
* refactor: remove channel shim directories, point all imports to extensions

Delete the 6 backward-compat shim directories (src/telegram, src/discord,
src/slack, src/signal, src/imessage, src/web) that were re-exporting from
extensions. Update all 112+ source files to import directly from
extensions/{channel}/src/ instead of through the shims.

Also:
- Move src/channels/telegram/ (allow-from, api) to extensions/telegram/src/
- Fix outbound adapters to use resolveOutboundSendDep (fixes 5 pre-existing TS errors)
- Update cross-extension imports (src/web/media.js → extensions/whatsapp/src/media.js)
- Update vitest, tsdown, knip, labeler, and script configs for new paths
- Update guard test allowlists for extension paths

After this, src/ has zero channel-specific implementation code — only the
generic plugin framework remains.

* fix: update raw-fetch guard allowlist line numbers after shim removal

* refactor: document direct extension channel imports

* test: mock transcript module in delivery helpers
2026-03-14 03:43:07 -07:00

96 lines
3.1 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from "vitest";
import { createDefaultDeps } from "./deps.js";
const moduleLoads = vi.hoisted(() => ({
whatsapp: vi.fn(),
telegram: vi.fn(),
discord: vi.fn(),
slack: vi.fn(),
signal: vi.fn(),
imessage: vi.fn(),
}));
const sendFns = vi.hoisted(() => ({
whatsapp: vi.fn(async () => ({ messageId: "w1", toJid: "whatsapp:1" })),
telegram: vi.fn(async () => ({ messageId: "t1", chatId: "telegram:1" })),
discord: vi.fn(async () => ({ messageId: "d1", channelId: "discord:1" })),
slack: vi.fn(async () => ({ messageId: "s1", channelId: "slack:1" })),
signal: vi.fn(async () => ({ messageId: "sg1", conversationId: "signal:1" })),
imessage: vi.fn(async () => ({ messageId: "i1", chatId: "imessage:1" })),
}));
vi.mock("../channels/web/index.js", () => {
moduleLoads.whatsapp();
return { sendMessageWhatsApp: sendFns.whatsapp };
});
vi.mock("../../extensions/telegram/src/send.js", () => {
moduleLoads.telegram();
return { sendMessageTelegram: sendFns.telegram };
});
vi.mock("../../extensions/discord/src/send.js", () => {
moduleLoads.discord();
return { sendMessageDiscord: sendFns.discord };
});
vi.mock("../../extensions/slack/src/send.js", () => {
moduleLoads.slack();
return { sendMessageSlack: sendFns.slack };
});
vi.mock("../../extensions/signal/src/send.js", () => {
moduleLoads.signal();
return { sendMessageSignal: sendFns.signal };
});
vi.mock("../../extensions/imessage/src/send.js", () => {
moduleLoads.imessage();
return { sendMessageIMessage: sendFns.imessage };
});
describe("createDefaultDeps", () => {
function expectUnusedModulesNotLoaded(exclude: keyof typeof moduleLoads): void {
const keys = Object.keys(moduleLoads) as Array<keyof typeof moduleLoads>;
for (const key of keys) {
if (key === exclude) {
continue;
}
expect(moduleLoads[key]).not.toHaveBeenCalled();
}
}
beforeEach(() => {
vi.clearAllMocks();
});
it("does not load provider modules until a dependency is used", async () => {
const deps = createDefaultDeps();
expect(moduleLoads.whatsapp).not.toHaveBeenCalled();
expect(moduleLoads.telegram).not.toHaveBeenCalled();
expect(moduleLoads.discord).not.toHaveBeenCalled();
expect(moduleLoads.slack).not.toHaveBeenCalled();
expect(moduleLoads.signal).not.toHaveBeenCalled();
expect(moduleLoads.imessage).not.toHaveBeenCalled();
const sendTelegram = deps["telegram"] as (...args: unknown[]) => Promise<unknown>;
await sendTelegram("chat", "hello", { verbose: false });
expect(moduleLoads.telegram).toHaveBeenCalledTimes(1);
expect(sendFns.telegram).toHaveBeenCalledTimes(1);
expectUnusedModulesNotLoaded("telegram");
});
it("reuses module cache after first dynamic import", async () => {
const deps = createDefaultDeps();
const sendDiscord = deps["discord"] as (...args: unknown[]) => Promise<unknown>;
await sendDiscord("channel", "first", { verbose: false });
await sendDiscord("channel", "second", { verbose: false });
expect(moduleLoads.discord).toHaveBeenCalledTimes(1);
expect(sendFns.discord).toHaveBeenCalledTimes(2);
});
});