import { describe, expect, it } from "vitest"; import { projectAddInputSchema, projectAddResultSchema, projectSearchEntriesInputSchema, projectSearchEntriesResultSchema, projectListResultSchema, projectRemoveInputSchema, projectUpdateScriptsInputSchema, projectUpdateScriptsResultSchema, } from "./project"; describe("project contracts", () => { it("parses project list result", () => { const result = projectListResultSchema.parse([ { id: "project-1", cwd: "/tmp/project", name: "project", scripts: [], createdAt: "2026-02-10T00:00:00.000Z", updatedAt: "2026-02-10T00:00:00.000Z", }, ]); expect(result).toHaveLength(1); expect(result[0]?.id).toBe("project-1"); }); it("trims add input cwd", () => { const parsed = projectAddInputSchema.parse({ cwd: " /tmp/project " }); expect(parsed.cwd).toBe("/tmp/project"); }); it("requires add result created flag", () => { const parsed = projectAddResultSchema.parse({ project: { id: "project-1", cwd: "/tmp/project", name: "project", scripts: [], createdAt: "2026-02-10T00:00:00.000Z", updatedAt: "2026-02-10T00:00:00.000Z", }, created: true, }); expect(parsed.created).toBe(true); }); it("parses remove input", () => { const parsed = projectRemoveInputSchema.parse({ id: "project-1" }); expect(parsed.id).toBe("project-1"); }); it("parses workspace entry search input with defaults", () => { const parsed = projectSearchEntriesInputSchema.parse({ cwd: " /tmp/project ", query: " src ", }); expect(parsed).toEqual({ cwd: "/tmp/project", query: "src", limit: 80, }); }); it("parses workspace entry search result", () => { const parsed = projectSearchEntriesResultSchema.parse({ entries: [ { path: "src/components", kind: "directory", parentPath: "src", }, { path: "src/components/Button.tsx", kind: "file", parentPath: "src/components", }, ], truncated: false, }); expect(parsed.entries).toHaveLength(2); expect(parsed.entries[0]?.kind).toBe("directory"); }); it("parses update scripts input", () => { const parsed = projectUpdateScriptsInputSchema.parse({ id: "project-1", scripts: [ { id: "test", name: "Test", command: "bun test", icon: "test", runOnWorktreeCreate: false, }, ], }); expect(parsed.scripts).toHaveLength(1); expect(parsed.scripts[0]?.id).toBe("test"); }); it("parses debug icon in scripts", () => { const parsed = projectUpdateScriptsInputSchema.parse({ id: "project-1", scripts: [ { id: "debug", name: "Debug", command: "bun --inspect test", icon: "debug", runOnWorktreeCreate: false, }, ], }); expect(parsed.scripts[0]?.icon).toBe("debug"); }); it("parses update scripts result", () => { const parsed = projectUpdateScriptsResultSchema.parse({ project: { id: "project-1", cwd: "/tmp/project", name: "project", scripts: [ { id: "setup", name: "Setup", command: "bun install", icon: "configure", runOnWorktreeCreate: true, }, ], createdAt: "2026-02-10T00:00:00.000Z", updatedAt: "2026-02-10T00:00:00.000Z", }, }); expect(parsed.project.scripts[0]?.id).toBe("setup"); }); });