import { describe, it, expect } from "vitest";
import { z } from "zod";
import { handleHelpAction, type HelpInput } from "./help-handler.js";
// Create test schema with help action and other actions
const TestSchema = z.discriminatedUnion("action", [
z.object({
action: z.literal("help"),
topic: z.string().optional().describe("Optional help topic"),
format: z.enum(["markdown", "json"]).optional().describe("Output format")
}).describe("Get help information"),
z.object({
action: z.literal("test"),
name: z.string().describe("Test name")
}).describe("A test action")
]);
describe("handleHelpAction", () => {
it("returns markdown by default", () => {
const input: HelpInput = { action: "help" };
const result = handleHelpAction(input, TestSchema);
expect(result).toContain("#");
expect(typeof result).toBe("string");
});
it("returns JSON when format is json", () => {
const input: HelpInput = { action: "help", format: "json" };
const result = handleHelpAction(input, TestSchema);
expect(() => JSON.parse(result)).not.toThrow();
const parsed = JSON.parse(result);
expect(Array.isArray(parsed)).toBe(true);
});
it("filters by topic when provided", () => {
const input: HelpInput = { action: "help", topic: "test" };
const result = handleHelpAction(input, TestSchema);
expect(result).toContain("test");
});
it("returns empty result for non-existent topic", () => {
const input: HelpInput = { action: "help", topic: "nonexistent" };
const result = handleHelpAction(input, TestSchema);
// Should return valid output but with no matching entries
expect(typeof result).toBe("string");
});
it("includes action descriptions in markdown output", () => {
const input: HelpInput = { action: "help" };
const result = handleHelpAction(input, TestSchema);
// Should include the action names from schema
expect(result).toContain("help");
});
it("works with complex schemas", () => {
const complexSchema = z.discriminatedUnion("action", [
z.object({
action: z.literal("help"),
topic: z.string().optional(),
format: z.enum(["markdown", "json"]).optional()
}).describe("Help action"),
z.object({
action: z.literal("list"),
filter: z.string().optional().describe("Filter expression"),
limit: z.number().optional().describe("Max items")
}).describe("List items"),
z.object({
action: z.literal("create"),
name: z.string().describe("Item name"),
type: z.enum(["a", "b"]).describe("Item type")
}).describe("Create item")
]);
const input: HelpInput = { action: "help" };
const result = handleHelpAction(input, complexSchema);
expect(result).toContain("list");
expect(result).toContain("create");
});
});