You've already forked agentic-coding-workflow
74 lines
2.1 KiB
TypeScript
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('还需要导出日志')
|
|
})
|
|
})
|