Files
wehub-resource-sync 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
chore: import upstream snapshot with attribution
2026-07-13 13:40:13 +08:00

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);
});
});