import { expect, test } from "bun:test"; import type { Plugin } from "@opencode/plugin"; import quota from "../src/quota/quota-plugin.js"; import { QuotaRpc } from "../src/quota/quota-rpc.js"; test("Quota loads independently and retains its RPC ID and nullable status", async () => { let controller: ReadableStreamDefaultController; const stream = new ReadableStream({ start(value) { controller = value; }, }); let status: (() => Promise) | undefined; let disposed = false; let modelHook = false; const context = { options: {}, location: { directory: "/fixture" }, integration: { connection: { async active() { return undefined; }, }, }, event: { subscribe({ signal }: { signal: AbortSignal }) { signal.addEventListener("abort", () => controller.close(), { once: true }); return stream; }, }, rpc: { async register(definition: typeof QuotaRpc, handlers: { status: () => Promise }) { expect(definition.id).toBe("stanp-opencode.quota"); status = handlers.status; return { async dispose() { disposed = true; }, events: { async emit() {} }, }; }, }, session: { async hook(name: string) { expect(name).toBe("model.request"); modelHook = true; return { async dispose() {} }; }, }, }; // SAFETY: Quota with no credentials uses only these native host services. // Absent agent/model/MCP APIs fail if independence regresses. const setup = quota.setup as ( context: Pick, ) => ReturnType; const cleanup = await setup(context); expect(quota.id).toBe("stanp-opencode.quota"); expect(await status!()).toBeNull(); expect(modelHook).toBe(true); if (cleanup) await cleanup(); expect(disposed).toBe(true); });