import assert from 'node:assert/strict' import test from 'node:test' import { renderAiConversationHtml } from '../src/utils/aiConversationHtmlRenderer.js' test('AI conversation renderer turns business copy into spacious semantic HTML', () => { const rendered = renderAiConversationHtml([ '### 出差申请办理确认', '', '**我已在您的输入中提取到关键信息**,如下表所示:', '', '> **前置查询结果**:我已查询您名下可关联的差旅申请单,当前未查到可关联单据。', '', '> **需要您确认**:发起新的出差申请属于业务操作,需要您手动确认后我再继续办理。', '', '点击下方 **确认发起出差申请** 后,我会继续完成:', '', '- **单据重叠核查**:检查同一时间段是否已有申请单,避免重复申请。', '- **预算与审批预审**:查看部门预算影响,判断是否可能增加预算管理者审核。' ].join('\n')) assert.match(rendered, /
/) assert.match(rendered, /

出差申请办理确认<\/h3>/) assert.match(rendered, /
/) assert.match(rendered, /
[\s\S]*前置查询结果[\s\S]*当前未查到可关联单据/) assert.match(rendered, /
[\s\S]*需要您确认[\s\S]*需要您手动确认后我再继续办理/) assert.match(rendered, /
    [\s\S]*单据重叠核查[\s\S]*预算与审批预审/) assert.doesNotMatch(rendered, /
    /) assert.doesNotMatch(rendered, /
      \s*
    • /) }) test('AI conversation renderer supports tables and escapes unsafe HTML', () => { const rendered = renderAiConversationHtml([ '### 查询结果', '', '| 字段 | 内容 |', '| --- | --- |', '| 事由 | 辅助 部署 |', '| 地点 | 上海 |' ].join('\n')) assert.match(rendered, /
      /) assert.match(rendered, /字段<\/th>/) assert.match(rendered, /<script>alert\(1\)<\/script>/) assert.doesNotMatch(rendered, /