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元/) })