import assert from "node:assert/strict"; import test from "node:test"; import { createElement } from "react"; import { renderToStaticMarkup } from "react-dom/server"; import { GenerativeResultView } from "./GenerativeResultView"; import { CompoundResultView } from "./CompoundResultView"; import { presentationAction, presentationData, presentationFields, presentationMetrics, } from "./generative-presentation"; import type { AssistantResult, PresentationInteraction, } from "../../../shared/assets/assistant"; const result: AssistantResult = { resultId: "generated-result", sessionId: "demo", plan: { kind: "assets", category: "inventory", groupBy: "region", view: "chart", filters: {}, }, title: "库存分布", summary: "华东库存12台,华南8台。", source: "演示台账", fetchedAt: "2026-09-23T08:00:00Z", rows: [], metrics: [ { label: "总库存", value: 20, unit: "台" }, { label: "异动", value: 2, unit: "台" }, ], groups: [ { name: "华东", count: 12, operating: 0, rate: 0, keys: { region: "华东" }, }, { name: "华南", count: 8, operating: 0, rate: 0, keys: { region: "华南" } }, ], daily: [ { date: "2026-09-23", delivered: 1, returned: 2, replaced: 0, total: 3 }, ], presentation: { title: "库存情况", blocks: [ { id: "conclusion", kind: "summary" }, { id: "selected", kind: "metrics", metrics: ["异动", "总库存"] }, { id: "narrative", kind: "narrative", text: "" }, { id: "regions", kind: "table", dataset: "groups", columns: [ { field: "count", label: "库存数量" }, { field: "name", label: "所属区域" }, ], interactionId: "cities", }, ], interactions: [ { id: "cities", label: "查看城市分布", kind: "group", plan: { kind: "assets", category: "inventory", groupBy: "city", view: "chart", filters: {}, }, }, ], }, }; const callbacks = { ask: () => {}, operate: () => {}, restore: () => {}, activate: () => {}, showCorrection: () => {}, active: true, subject: "演示公司", disabled: false, }; test("model-selected metrics and columns preserve their order and never invent values", () => { assert.deepEqual( presentationMetrics(result, ["异动", "不存在", "总库存"]).map( (item) => item.value, ), [2, 20], ); assert.deepEqual( presentationFields({ id: "table", kind: "table", dataset: "groups", columns: [ { field: "count", label: "数量" }, { field: "secret", label: "无此字段" }, ], }), [{ field: "count", label: "数量" }], ); assert.deepEqual(presentationData(result, "groups")[0].keys, { region: "华东", }); assert.deepEqual(presentationData(result, "comparison"), []); }); test("exploration uses stored interaction ID and actual clicked keys or date", () => { const group = result.presentation!.interactions[0]; assert.deepEqual( presentationAction(group, presentationData(result, "groups")[1]), { type: "explore", interactionId: "cities", keys: { region: "华南" } }, ); assert.equal(presentationAction(group, { name: "华东" }), undefined); const point: PresentationInteraction = { ...group, id: "day", kind: "point" }; assert.deepEqual( presentationAction(point, presentationData(result, "daily")[0]), { type: "explore", interactionId: "day", date: "2026-09-23" }, ); assert.equal(presentationAction(point, { name: "昨天" }), undefined); assert.deepEqual(presentationAction({ ...group, kind: "followup" }), { type: "explore", interactionId: "cities", }); }); test("semantic render respects block order, real table fields, plain text, scope and answer anchors", () => { const html = renderToStaticMarkup( createElement(GenerativeResultView, { ...callbacks, result }), ); assert.ok( html.indexOf('data-block-id="selected"') < html.indexOf('data-block-id="regions"'), ); assert.ok(html.indexOf(">异动") < html.indexOf(">总库存")); assert.ok(html.indexOf(">库存数量") < html.indexOf(">所属区域")); assert.match(html, /<script>不能执行<\/script>/); assert.doesNotMatch(html, /