Files
X-Financial/web/tests/reimbursementTextInference.test.mjs
caoxiaozhu e701fa01da feat: 增强差旅报销审核流程与票据智能推理
优化本体解析和编排器的差旅场景处理能力,完善报销单草稿
保存和费用明细同步逻辑,前端报销创建页面增加行程推理和
票据审核交互,新增助手会话快照工具函数,补充单元测试。
2026-05-21 16:09:47 +08:00

74 lines
2.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import assert from 'node:assert/strict'
import test from 'node:test'
import {
buildLocalExtractionProgressMessages,
buildLocalIntentPreview,
inferLocalFlowCandidates,
shouldRequestExpenseIntentConfirmation,
shouldRequestExpenseSceneSelection,
summarizeSemanticIntentDetail
} from '../src/utils/reimbursementTextInference.js'
const ridingFareMessage = '业务发生时间:2026-03-04送客户去林萃小区办事请报销乘车费用'
test('local flow intent preview names transport expense for riding fare text', () => {
const candidates = inferLocalFlowCandidates(ridingFareMessage)
assert.equal(candidates.time, '2026-03-04')
assert.equal(candidates.event, '交通出行')
assert.equal(candidates.expenseType, '交通费')
assert.match(buildLocalIntentPreview(ridingFareMessage), /交通费/)
assert.ok(
buildLocalExtractionProgressMessages(ridingFareMessage).some(
(item) => item.includes('交通出行') && item.includes('交通费')
)
)
})
test('semantic intent detail includes recognized expense type', () => {
assert.equal(
summarizeSemanticIntentDetail({
scenario: 'expense',
intent: 'draft',
entities_json: [
{
type: 'expense_type',
value: '交通',
normalized_value: 'transport'
}
]
}),
'已识别为报销场景,当前目标是草稿生成,费用类型为交通费'
)
})
test('ambiguous expense prompt waits for scene selection before extraction preview', () => {
const ambiguousMessage = '业务发生时间:2026-02-20 至 2026-02-23去上海支持上海电力部署项目申请报销'
assert.equal(shouldRequestExpenseSceneSelection(ambiguousMessage), true)
assert.match(buildLocalIntentPreview(ambiguousMessage), /需要先由用户选择场景/)
assert.doesNotMatch(buildLocalIntentPreview(ambiguousMessage), /草稿生成/)
})
test('clear expense type does not request scene selection', () => {
const travelMessage = '业务发生时间:2026-02-20 至 2026-02-23去上海出差支持上海电力部署项目申请差旅报销'
assert.equal(shouldRequestExpenseSceneSelection(travelMessage), false)
assert.match(buildLocalIntentPreview(travelMessage), /差旅费/)
})
test('business activity without expense intent asks for reimbursement confirmation first', () => {
const businessMessage = '去上海电力支撑项目部署'
assert.equal(shouldRequestExpenseIntentConfirmation(businessMessage), true)
assert.match(buildLocalIntentPreview(businessMessage), /是否发起报销尚不明确/)
assert.equal(shouldRequestExpenseSceneSelection(businessMessage), false)
})
test('explicit technical operation does not ask for reimbursement confirmation', () => {
const operationMessage = '去上海电力支撑项目部署,帮我整理服务器部署步骤'
assert.equal(shouldRequestExpenseIntentConfirmation(operationMessage), false)
})