mirror of
https://bitbucket.org/siakitem/my-pi.git
synced 2026-08-28 08:35:57 +00:00
feat: vendor permission system source
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import { describe, expect, test } from "vitest";
|
||||
|
||||
import {
|
||||
type ToolInputFormatter,
|
||||
ToolInputFormatterRegistry,
|
||||
} from "#src/tool-input-formatter-registry";
|
||||
|
||||
const noopFormatter: ToolInputFormatter = () => "preview";
|
||||
|
||||
describe("ToolInputFormatterRegistry", () => {
|
||||
describe("register", () => {
|
||||
test("stores a formatter so get() returns it", () => {
|
||||
const registry = new ToolInputFormatterRegistry();
|
||||
registry.register("my-tool", noopFormatter);
|
||||
expect(registry.get("my-tool")).toBe(noopFormatter);
|
||||
});
|
||||
|
||||
test("returns a disposer that removes the formatter", () => {
|
||||
const registry = new ToolInputFormatterRegistry();
|
||||
const dispose = registry.register("my-tool", noopFormatter);
|
||||
dispose();
|
||||
expect(registry.get("my-tool")).toBeUndefined();
|
||||
});
|
||||
|
||||
test("throws when a formatter is already registered for the same tool name", () => {
|
||||
const registry = new ToolInputFormatterRegistry();
|
||||
registry.register("my-tool", noopFormatter);
|
||||
expect(() => registry.register("my-tool", () => undefined)).toThrow(
|
||||
"my-tool",
|
||||
);
|
||||
});
|
||||
|
||||
test("allows registering different tool names independently", () => {
|
||||
const registry = new ToolInputFormatterRegistry();
|
||||
const formatterA: ToolInputFormatter = () => "a";
|
||||
const formatterB: ToolInputFormatter = () => "b";
|
||||
registry.register("tool-a", formatterA);
|
||||
registry.register("tool-b", formatterB);
|
||||
expect(registry.get("tool-a")).toBe(formatterA);
|
||||
expect(registry.get("tool-b")).toBe(formatterB);
|
||||
});
|
||||
});
|
||||
|
||||
describe("disposer identity guard", () => {
|
||||
test("stale disposer does not evict a later registration", () => {
|
||||
const registry = new ToolInputFormatterRegistry();
|
||||
const first: ToolInputFormatter = () => "first";
|
||||
const second: ToolInputFormatter = () => "second";
|
||||
|
||||
const disposeFirst = registry.register("my-tool", first);
|
||||
disposeFirst(); // removes first
|
||||
|
||||
registry.register("my-tool", second); // second registration is now valid
|
||||
disposeFirst(); // calling stale disposer again — must not remove second
|
||||
|
||||
expect(registry.get("my-tool")).toBe(second);
|
||||
});
|
||||
});
|
||||
|
||||
describe("get", () => {
|
||||
test("returns undefined for an unregistered tool name", () => {
|
||||
const registry = new ToolInputFormatterRegistry();
|
||||
expect(registry.get("unknown")).toBeUndefined();
|
||||
});
|
||||
|
||||
test("the registered formatter is callable and returns its result", () => {
|
||||
const registry = new ToolInputFormatterRegistry();
|
||||
const fmt: ToolInputFormatter = (input) =>
|
||||
typeof input.cmd === "string" ? `runs ${input.cmd}` : undefined;
|
||||
registry.register("run", fmt);
|
||||
expect(registry.get("run")?.({ cmd: "ls" })).toBe("runs ls");
|
||||
expect(registry.get("run")?.({ other: true })).toBeUndefined();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user