Files
stanp-opencode/tests/plugins.test.ts
StanPonomarev 59da616bc5
CI / verify (pull_request) Successful in 8s
reduce testing
2026-10-08 09:34:13 +02:00

64 lines
2.2 KiB
TypeScript

import { expect, test } from "bun:test";
import type { Plugin } from "@opencode/plugin";
import quota from "../src/quota-plugin.js";
import { QuotaRpc } from "../src/quota-rpc.js";
test("Quota loads independently and retains its RPC ID and nullable status", async () => {
let controller: ReadableStreamDefaultController<unknown>;
const stream = new ReadableStream({
start(value) {
controller = value;
},
});
let status: (() => Promise<null>) | 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<null> }) {
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<Plugin.Context, "options">,
) => ReturnType<typeof quota.setup>;
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);
});