91 lines
2.8 KiB
TypeScript
91 lines
2.8 KiB
TypeScript
import { describe, it, expect, vi } from "vitest";
|
|
import {
|
|
generateA2uiImpl,
|
|
buildA2uiOperationsFromToolCall,
|
|
RENDER_A2UI_TOOL_SCHEMA,
|
|
CUSTOM_CATALOG_ID,
|
|
} from "../generate-a2ui";
|
|
|
|
describe("generateA2uiImpl", () => {
|
|
it("returns system prompt from context entries", () => {
|
|
const result = generateA2uiImpl({
|
|
messages: [],
|
|
contextEntries: [
|
|
{ value: "Component catalog info" },
|
|
{ value: "More context" },
|
|
],
|
|
});
|
|
expect(result.systemPrompt).toContain("Component catalog info");
|
|
expect(result.systemPrompt).toContain("More context");
|
|
});
|
|
|
|
it("filters empty/missing context values", () => {
|
|
const result = generateA2uiImpl({
|
|
messages: [],
|
|
contextEntries: [{ value: "" }, { noValue: true }, { value: "keep" }],
|
|
});
|
|
expect(result.systemPrompt).toBe("keep");
|
|
});
|
|
|
|
it("returns tool schema and choice", () => {
|
|
const result = generateA2uiImpl({ messages: [] });
|
|
expect(result.toolSchema.name).toBe("render_a2ui");
|
|
expect(result.toolChoice).toBe("render_a2ui");
|
|
});
|
|
|
|
it("passes messages through", () => {
|
|
const msgs = [{ role: "user", content: "hello" }];
|
|
const result = generateA2uiImpl({ messages: msgs });
|
|
expect(result.messages).toBe(msgs);
|
|
});
|
|
|
|
it("returns the default catalog ID", () => {
|
|
const result = generateA2uiImpl({ messages: [] });
|
|
expect(result.catalogId).toBe(CUSTOM_CATALOG_ID);
|
|
});
|
|
});
|
|
|
|
describe("buildA2uiOperationsFromToolCall", () => {
|
|
it("builds create_surface + update_components", () => {
|
|
const result = buildA2uiOperationsFromToolCall({
|
|
surfaceId: "s1",
|
|
catalogId: "cat1",
|
|
components: [{ id: "root", component: "Title" }],
|
|
});
|
|
expect(result.a2ui_operations).toHaveLength(2);
|
|
expect(result.a2ui_operations[0].type).toBe("create_surface");
|
|
expect(result.a2ui_operations[1].type).toBe("update_components");
|
|
});
|
|
|
|
it("includes update_data_model when data provided", () => {
|
|
const result = buildA2uiOperationsFromToolCall({
|
|
surfaceId: "s1",
|
|
catalogId: "cat1",
|
|
components: [{ id: "root" }],
|
|
data: { key: "value" },
|
|
});
|
|
expect(result.a2ui_operations).toHaveLength(3);
|
|
expect(result.a2ui_operations[2].type).toBe("update_data_model");
|
|
});
|
|
|
|
it("defaults surfaceId and catalogId", () => {
|
|
const result = buildA2uiOperationsFromToolCall({ components: [] });
|
|
expect(result.a2ui_operations[0].surfaceId).toBe("dynamic-surface");
|
|
expect(result.a2ui_operations[0].catalogId).toBe(CUSTOM_CATALOG_ID);
|
|
});
|
|
|
|
it("warns on empty components", () => {
|
|
const spy = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
buildA2uiOperationsFromToolCall({
|
|
surfaceId: "s1",
|
|
catalogId: "c1",
|
|
components: [],
|
|
});
|
|
expect(spy).toHaveBeenCalledWith(
|
|
expect.stringContaining("empty components"),
|
|
"s1",
|
|
);
|
|
spy.mockRestore();
|
|
});
|
|
});
|