74 lines
2.8 KiB
JavaScript
74 lines
2.8 KiB
JavaScript
|
|
import assert from 'node:assert/strict'
|
||
|
|
import test from 'node:test'
|
||
|
|
|
||
|
|
import {
|
||
|
|
applyAiExpenseAnswer,
|
||
|
|
buildAiExpenseStepPrompt,
|
||
|
|
buildAiExpenseSummary,
|
||
|
|
createAiExpenseDraft,
|
||
|
|
getAiExpenseCurrentStep,
|
||
|
|
isAiExpenseDraftComplete
|
||
|
|
} from '../src/utils/aiExpenseDraftModel.js'
|
||
|
|
|
||
|
|
test('draft starts at the reason step regardless of expense type', () => {
|
||
|
|
const draft = createAiExpenseDraft('transport', '交通费')
|
||
|
|
assert.equal(draft.expenseType, 'transport')
|
||
|
|
assert.equal(draft.expenseTypeLabel, '交通费')
|
||
|
|
assert.equal(draft.stepKey, 'reason')
|
||
|
|
assert.equal(getAiExpenseCurrentStep(draft).key, 'reason')
|
||
|
|
})
|
||
|
|
|
||
|
|
test('answers advance through fields in order and reach the summary step', () => {
|
||
|
|
let draft = createAiExpenseDraft('office', '办公用品费')
|
||
|
|
draft = applyAiExpenseAnswer(draft, '项目现场临时采购', [])
|
||
|
|
assert.equal(draft.stepKey, 'time_range')
|
||
|
|
draft = applyAiExpenseAnswer(draft, '2026-06-15', [])
|
||
|
|
assert.equal(draft.stepKey, 'location')
|
||
|
|
draft = applyAiExpenseAnswer(draft, '京东', [])
|
||
|
|
assert.equal(draft.stepKey, 'amount')
|
||
|
|
draft = applyAiExpenseAnswer(draft, '320元', [])
|
||
|
|
assert.equal(draft.stepKey, 'attachments')
|
||
|
|
draft = applyAiExpenseAnswer(draft, '稍后上传', [])
|
||
|
|
assert.ok(isAiExpenseDraftComplete(draft))
|
||
|
|
})
|
||
|
|
|
||
|
|
test('attachments step collects uploaded file names', () => {
|
||
|
|
let draft = createAiExpenseDraft('office', '办公用品费')
|
||
|
|
draft = applyAiExpenseAnswer(draft, '事由', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '2026-06-15', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '京东', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '320元', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '', [{ name: '发票.pdf' }])
|
||
|
|
assert.deepEqual(draft.values.attachment_names, ['发票.pdf'])
|
||
|
|
assert.ok(isAiExpenseDraftComplete(draft))
|
||
|
|
})
|
||
|
|
|
||
|
|
test('step prompt names the type and the current field', () => {
|
||
|
|
const draft = createAiExpenseDraft('transport', '交通费')
|
||
|
|
const prompt = buildAiExpenseStepPrompt(draft)
|
||
|
|
assert.match(prompt, /交通费/)
|
||
|
|
assert.match(prompt, /事由/)
|
||
|
|
})
|
||
|
|
|
||
|
|
test('summary lists every filled field and the linked application', () => {
|
||
|
|
let draft = createAiExpenseDraft('transport', '交通费')
|
||
|
|
draft = {
|
||
|
|
...draft,
|
||
|
|
applicationClaim: {
|
||
|
|
application_claim_no: 'AP-202606-001',
|
||
|
|
application_reason: '送客户去机场',
|
||
|
|
application_business_time: '2026-06-15',
|
||
|
|
application_location: '公司至机场'
|
||
|
|
}
|
||
|
|
}
|
||
|
|
draft = applyAiExpenseAnswer(draft, '送客户去机场', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '2026-06-15', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '公司至机场', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '85元', [])
|
||
|
|
draft = applyAiExpenseAnswer(draft, '稍后上传', [])
|
||
|
|
const summary = buildAiExpenseSummary(draft)
|
||
|
|
assert.match(summary, /交通费/)
|
||
|
|
assert.match(summary, /AP-202606-001/)
|
||
|
|
assert.match(summary, /85元/)
|
||
|
|
})
|