86 lines
2.8 KiB
TypeScript
86 lines
2.8 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { test } from "bun:test";
|
|
import { renderToStaticMarkup } from "react-dom/server";
|
|
|
|
import { MessageTracePanel } from "./MessageTracePanel";
|
|
import type { RunnerTrace } from "../../types/domain";
|
|
|
|
test("message trace panel renders assistant markdown rows through the shared renderer", () => {
|
|
const trace: RunnerTrace = {
|
|
traceId: "trc_markdown_row",
|
|
status: "completed",
|
|
events: [
|
|
{
|
|
seq: 1,
|
|
label: "agentrun:assistant:message",
|
|
type: "assistant",
|
|
status: "completed",
|
|
final: true,
|
|
replyAuthority: true,
|
|
message: "| hwpodId | node |\n|---|---|\n| `hwpod-f103` | pc-host-1 |"
|
|
}
|
|
],
|
|
eventCount: 1
|
|
};
|
|
|
|
const html = renderToStaticMarkup(<MessageTracePanel trace={trace} defaultOpen />);
|
|
|
|
assert.match(html, /data-body-format="markdown"/u);
|
|
assert.match(html, /message-trace-markdown/u);
|
|
assert.match(html, /<table>/u);
|
|
assert.match(html, /<code>hwpod-f103<\/code>/u);
|
|
assert.doesNotMatch(html, /<pre class="message-trace-body message-copy-markdown" data-body-format="markdown"/u);
|
|
});
|
|
|
|
test("message trace panel exposes running status for live trace animation", () => {
|
|
const trace: RunnerTrace = {
|
|
traceId: "trc_running_row",
|
|
status: "running",
|
|
events: [
|
|
{ seq: 1, label: "agentrun:request:accepted", status: "accepted" }
|
|
],
|
|
eventCount: 1
|
|
};
|
|
|
|
const html = renderToStaticMarkup(<MessageTracePanel trace={trace} />);
|
|
|
|
assert.match(html, /data-trace-status="running"/u);
|
|
assert.match(html, /open=""/u);
|
|
});
|
|
|
|
test("message trace panel collapses automatically when final response is available", () => {
|
|
const trace: RunnerTrace = {
|
|
traceId: "trc_completed_final",
|
|
status: "completed",
|
|
events: [
|
|
{ seq: 1, label: "agentrun:assistant:message", status: "completed", message: "最终回复" }
|
|
],
|
|
eventCount: 1
|
|
};
|
|
|
|
const html = renderToStaticMarkup(<MessageTracePanel trace={trace} defaultOpen collapseWhenFinalResponse />);
|
|
|
|
assert.match(html, /data-trace-status="completed"/u);
|
|
assert.doesNotMatch(html, /<details[^>]* open=""/u);
|
|
});
|
|
|
|
test("message trace panel renders persisted fallback for expired historical trace", () => {
|
|
const trace: RunnerTrace = {
|
|
traceId: "trc_issue932_expired",
|
|
status: "expired",
|
|
traceStatus: "expired",
|
|
events: [],
|
|
eventCount: 31,
|
|
fallback: { available: true, source: "agent-session-snapshot" },
|
|
traceSummary: { sourceEventCount: 31, terminalStatus: "completed", source: "agent-session-snapshot" },
|
|
finalResponse: { text: "历史最终回复" }
|
|
};
|
|
|
|
const html = renderToStaticMarkup(<MessageTracePanel trace={trace} defaultOpen />);
|
|
|
|
assert.match(html, /历史 trace 已过期/u);
|
|
assert.match(html, /历史最终回复/u);
|
|
assert.match(html, /sourceEventCount=31/u);
|
|
assert.doesNotMatch(html, /等待后端事件/u);
|
|
});
|