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

158 lines
4.1 KiB
TypeScript

"use client";
import { describe, it, expect, vi } from "vitest";
import { parseAgUiEvent } from "../src/runtime/event-parser";
describe("parseAgUiEvent", () => {
it("parses text content event", () => {
const event = parseAgUiEvent({
type: "TEXT_MESSAGE_CONTENT",
messageId: "m1",
delta: "hi",
});
expect(event).toEqual({
type: "TEXT_MESSAGE_CONTENT",
messageId: "m1",
delta: "hi",
});
});
it("guards against invalid events", () => {
const event = parseAgUiEvent({ type: "TEXT_MESSAGE_CONTENT", delta: "" });
expect(event).toBeNull();
});
it("parses reasoning content with optional message id", () => {
const event = parseAgUiEvent({
type: "REASONING_MESSAGE_CONTENT",
messageId: "m-reason",
delta: "chain of thought",
});
expect(event).toEqual({
type: "REASONING_MESSAGE_CONTENT",
messageId: "m-reason",
delta: "chain of thought",
});
});
it("falls back to RAW for unknown types", () => {
const event = parseAgUiEvent({ type: "UNKNOWN_EVENT", foo: "bar" });
expect(event).toEqual({
type: "RAW",
event: { type: "UNKNOWN_EVENT", foo: "bar" },
source: "UNKNOWN_EVENT",
});
});
it("parses ACTIVITY_SNAPSHOT events", () => {
const event = parseAgUiEvent({
type: "ACTIVITY_SNAPSHOT",
messageId: "m1",
activityType: "mcp-apps",
content: {
resourceUri: "ui://srv/mcp-app.html",
toolInput: { city: "sf" },
},
replace: true,
});
expect(event).toEqual({
type: "ACTIVITY_SNAPSHOT",
activityType: "mcp-apps",
content: {
resourceUri: "ui://srv/mcp-app.html",
toolInput: { city: "sf" },
},
});
});
it("guards against ACTIVITY_SNAPSHOT missing activityType or content", () => {
expect(
parseAgUiEvent({ type: "ACTIVITY_SNAPSHOT", content: {} }),
).toBeNull();
expect(
parseAgUiEvent({ type: "ACTIVITY_SNAPSHOT", activityType: "mcp-apps" }),
).toBeNull();
});
it("passes RUN_FINISHED through with no outcome (legacy)", () => {
const event = parseAgUiEvent({ type: "RUN_FINISHED", runId: "r1" });
expect(event).toEqual({ type: "RUN_FINISHED", runId: "r1" });
});
it("parses RUN_FINISHED success outcome", () => {
const event = parseAgUiEvent({
type: "RUN_FINISHED",
runId: "r1",
outcome: { type: "success" },
});
expect(event).toEqual({
type: "RUN_FINISHED",
runId: "r1",
outcome: { type: "success" },
});
});
it("parses RUN_FINISHED interrupt outcome with interrupts", () => {
const event = parseAgUiEvent({
type: "RUN_FINISHED",
runId: "r1",
outcome: {
type: "interrupt",
interrupts: [
{
id: "int-1",
reason: "tool_call",
message: "approve?",
toolCallId: "call-1",
responseSchema: { type: "object" },
metadata: { foo: "bar" },
},
],
},
});
expect(event).toMatchObject({
type: "RUN_FINISHED",
runId: "r1",
outcome: {
type: "interrupt",
interrupts: [
{
id: "int-1",
reason: "tool_call",
message: "approve?",
toolCallId: "call-1",
responseSchema: { type: "object" },
metadata: { foo: "bar" },
},
],
},
});
});
it("drops malformed interrupt outcomes (no interrupts)", () => {
const event = parseAgUiEvent({
type: "RUN_FINISHED",
runId: "r1",
outcome: { type: "interrupt", interrupts: [] },
});
expect(event).toEqual({ type: "RUN_FINISHED", runId: "r1" });
});
it("logs a debug entry when interrupt outcome falls back silently", () => {
const debug = vi.fn();
parseAgUiEvent(
{
type: "RUN_FINISHED",
runId: "r1",
outcome: {
type: "interrupt",
interrupts: [{ id: "" }, { reason: "" }],
},
},
{ logger: { debug } as any },
);
expect(debug).toHaveBeenCalledTimes(1);
expect(debug.mock.calls[0][0]).toMatch(/no valid interrupts/);
});
});