torrentclaw-mcp/tests/prompts.test.ts
2026-02-12 15:22:11 +01:00

83 lines
2.9 KiB
TypeScript

import { describe, it, expect, vi } from "vitest";
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { registerPrompts } from "../src/prompts.js";
type PromptHandler = (params: Record<string, string>) => {
messages: { role: string; content: { type: string; text: string } }[];
};
describe("registerPrompts", () => {
function createMockServer() {
const prompts = new Map<string, PromptHandler>();
const server = {
prompt: vi.fn(
(
name: string,
_description: string,
_schema: unknown,
handler: PromptHandler,
) => {
prompts.set(name, handler);
},
),
} as unknown as McpServer;
return { server, prompts };
}
it("registers 4 prompts", () => {
const { server, prompts } = createMockServer();
registerPrompts(server);
expect(prompts.size).toBe(4);
expect(prompts.has("search_movie")).toBe(true);
expect(prompts.has("search_show")).toBe(true);
expect(prompts.has("whats_new")).toBe(true);
expect(prompts.has("where_to_watch")).toBe(true);
});
it("search_movie includes title in prompt", () => {
const { server, prompts } = createMockServer();
registerPrompts(server);
const handler = prompts.get("search_movie")!;
const result = handler({ title: "Inception" });
expect(result.messages).toHaveLength(1);
expect(result.messages[0].role).toBe("user");
expect(result.messages[0].content.text).toContain("Inception");
expect(result.messages[0].content.text).toContain("search_content");
});
it("search_show includes title in prompt", () => {
const { server, prompts } = createMockServer();
registerPrompts(server);
const handler = prompts.get("search_show")!;
const result = handler({ title: "Breaking Bad" });
expect(result.messages[0].content.text).toContain("Breaking Bad");
});
it("whats_new returns discovery prompt", () => {
const { server, prompts } = createMockServer();
registerPrompts(server);
const handler = prompts.get("whats_new")!;
const result = handler({});
expect(result.messages[0].content.text).toContain("recently added");
});
it("where_to_watch includes country when provided", () => {
const { server, prompts } = createMockServer();
registerPrompts(server);
const handler = prompts.get("where_to_watch")!;
const result = handler({ title: "Dune", country: "ES" });
expect(result.messages[0].content.text).toContain("Dune");
expect(result.messages[0].content.text).toContain("ES");
});
it("where_to_watch works without country", () => {
const { server, prompts } = createMockServer();
registerPrompts(server);
const handler = prompts.get("where_to_watch")!;
const result = handler({ title: "Dune" });
expect(result.messages[0].content.text).toContain("Dune");
expect(result.messages[0].content.text).not.toContain("undefined");
});
});