PettyUI/packages/mcp/tests/tools/compose.test.ts
2026-03-31 21:42:28 +07:00

34 lines
1.5 KiB
TypeScript

import { describe, it, expect } from "vitest";
import { handleCompose } from "../../src/tools/compose.js";
import { ComponentRegistry } from "../../src/registry.js";
describe("pettyui.compose", () => {
const registry = new ComponentRegistry();
it("generates JSX for specified components — Dialog + Button both present", () => {
const result = handleCompose(registry, { components: ["Dialog", "Button"] });
expect(result.jsx).toContain("Dialog");
expect(result.jsx).toContain("Button");
expect(result.imports).toContain("pettyui/dialog");
expect(result.imports).toContain("pettyui/button");
});
it("generates imports for all — Form + TextField + Button → 3 imports", () => {
const result = handleCompose(registry, { components: ["Form", "TextField", "Button"] });
expect(result.imports).toHaveLength(3);
});
it("uses required parts — Dialog → jsx contains Dialog.Content and Dialog.Title", () => {
const result = handleCompose(registry, { components: ["Dialog"] });
expect(result.jsx).toContain("Dialog.Content");
expect(result.jsx).toContain("Dialog.Title");
});
it("skips unknown with warning — FakeComponent gets warning, Dialog still in jsx", () => {
const result = handleCompose(registry, { components: ["Dialog", "FakeComponent"] });
expect(result.warnings).toContain('Component "FakeComponent" not found');
expect(result.jsx).toContain("Dialog");
expect(result.imports).toHaveLength(1);
});
});