e30e75b5d4
Changesets / Create Version PR (push) Has been cancelled
Deploy Shadcn Registry / Deploy Production (push) Has been cancelled
Template Metrics / LOC + Bundle Size (push) Has been cancelled
Code Quality / Oxlint + Oxfmt (push) Has been cancelled
Code Quality / Template Sync (push) Has been cancelled
Code Quality / Build Changed Packages (push) Has been cancelled
Code Quality / Test Changed Packages (push) Has been cancelled
Deploy Expo Example / Deploy Production (push) Has been cancelled
Deploy Ink Example / Deploy Production (push) Has been cancelled
Python Tests / pytest (assistant-stream, 3.10) (push) Has been cancelled
Python Tests / pytest (assistant-stream, 3.12) (push) Has been cancelled
Python Tests / pytest (assistant-ui-sync-server-api, 3.10) (push) Has been cancelled
Python Tests / pytest (assistant-ui-sync-server-api, 3.12) (push) Has been cancelled
62 lines
1.6 KiB
TypeScript
62 lines
1.6 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import {
|
|
generativeUISpecSchema,
|
|
isLeakedRenderGuiText,
|
|
parseRenderGuiResult,
|
|
renderGuiToolResultSchema,
|
|
} from "./render-gui-tool";
|
|
|
|
describe("render-gui-tool", () => {
|
|
it("accepts a valid Card + Button spec", () => {
|
|
const spec = {
|
|
root: {
|
|
component: "Card",
|
|
props: { title: "Welcome" },
|
|
children: [
|
|
{
|
|
component: "Button",
|
|
props: { label: "Get started", variant: "primary" },
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
expect(generativeUISpecSchema.parse(spec)).toEqual(spec);
|
|
expect(
|
|
parseRenderGuiResult(renderGuiToolResultSchema.parse({ spec })),
|
|
).toEqual(spec);
|
|
});
|
|
|
|
it("rejects a spec with empty component name", () => {
|
|
expect(() =>
|
|
generativeUISpecSchema.parse({
|
|
root: { component: "", props: { title: "Bad" } },
|
|
}),
|
|
).toThrow();
|
|
});
|
|
|
|
it("returns undefined for malformed tool results", () => {
|
|
expect(parseRenderGuiResult({ notSpec: true })).toBeUndefined();
|
|
expect(parseRenderGuiResult(null)).toBeUndefined();
|
|
});
|
|
|
|
it("detects leaked render_gui tool result text", () => {
|
|
const payload = renderGuiToolResultSchema.parse({
|
|
spec: {
|
|
root: {
|
|
component: "Card",
|
|
children: [{ component: "Text", children: ["Hello"] }],
|
|
},
|
|
},
|
|
});
|
|
|
|
expect(isLeakedRenderGuiText(JSON.stringify(payload, null, 2))).toBe(true);
|
|
expect(
|
|
isLeakedRenderGuiText(
|
|
"```json\n" + JSON.stringify(payload, null, 2) + "\n```",
|
|
),
|
|
).toBe(true);
|
|
expect(isLeakedRenderGuiText("Here is your card.")).toBe(false);
|
|
});
|
|
});
|