Files
agentic-coding-workflow/web/src/utils/interactiveMessage.test.ts
T

74 lines
2.1 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { formatInteractiveQuestionAnswer, parseInteractiveMessage } from './interactiveMessage'
const questionBlock = `\`\`\`acw-question
{
"version": 1,
"id": "target_user",
"title": "这个需求主要面向谁?",
"description": "选择后我会补全场景。",
"mode": "single",
"options": [
{
"id": "admin",
"label": "后台管理员",
"summary": "负责配置和审核",
"details": "更关注权限、批量操作和审计。"
},
{
"id": "user",
"label": "普通用户"
}
],
"allowCustom": true
}
\`\`\``
describe('interactiveMessage', () => {
it('解析 acw-question 代码块并保留普通 Markdown', () => {
const parsed = parseInteractiveMessage(`# 前置说明\n\n${questionBlock}`)
expect(parsed.markdown).toBe('# 前置说明')
expect(parsed.question?.id).toBe('target_user')
expect(parsed.question?.options[0]).toMatchObject({
id: 'admin',
label: '后台管理员',
summary: '负责配置和审核',
})
})
it('非法 JSON 时回退为普通 Markdown', () => {
const content = '```acw-question\n{ broken }\n```'
const parsed = parseInteractiveMessage(content)
expect(parsed.question).toBeNull()
expect(parsed.markdown).toBe(content)
})
it('选项数量不合法时回退为普通 Markdown', () => {
const content = `\`\`\`acw-question
{"version":1,"id":"q","title":"Q","mode":"single","options":[{"id":"a","label":"A"}]}
\`\`\``
const parsed = parseInteractiveMessage(content)
expect(parsed.question).toBeNull()
expect(parsed.markdown).toBe(content)
})
it('格式化用户选择为稳定文本', () => {
const parsed = parseInteractiveMessage(questionBlock)
expect(parsed.question).not.toBeNull()
const text = formatInteractiveQuestionAnswer({
question: parsed.question!,
selectedOptionIds: ['admin'],
customText: '还需要导出日志',
})
expect(text).toContain('question_id: target_user')
expect(text).toContain('- admin: 后台管理员 - 负责配置和审核')
expect(text).toContain('还需要导出日志')
})
})