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, / |