import assert from 'node:assert/strict' import { readFileSync } from 'node:fs' import test from 'node:test' import { fileURLToPath } from 'node:url' import { buildStructuredComposerSubmitText } from '../src/views/scripts/useTravelReimbursementComposerTools.js' const submitComposerScript = readFileSync( fileURLToPath(new URL('../src/views/scripts/useTravelReimbursementSubmitComposer.js', import.meta.url)), 'utf8' ) const createViewTemplate = readFileSync( fileURLToPath(new URL('../src/views/TravelReimbursementCreateView.vue', import.meta.url)), 'utf8' ) const composerToolsScript = readFileSync( fileURLToPath(new URL('../src/views/scripts/useTravelReimbursementComposerTools.js', import.meta.url)), 'utf8' ) test('composer formats date-picker expense text into readable structured fields', () => { const formatted = buildStructuredComposerSubmitText( '发生时间:2026-05-20 至 2026-05-23,去上海支撑上海国电的服务器部署,出差3天', { mode: 'range', start_date: '2026-05-20', end_date: '2026-05-23', business_time: '2026-05-20 至 2026-05-23' } ) assert.equal( formatted, [ '发生时间:2026-05-20 至 2026-05-23', '地点:上海', '事由:支撑上海国电的服务器部署', '天数:3天' ].join('\n') ) }) test('composer extracts destination and reason from compact travel text', () => { const formatted = buildStructuredComposerSubmitText( '出差上海,支撑国网服务器上线部署', { mode: 'single', start_date: '2026-05-25', end_date: '2026-05-25', business_time: '2026-05-25' } ) assert.equal( formatted, [ '发生时间:2026-05-25', '地点:上海', '事由:支撑国网服务器上线部署', '天数:1天' ].join('\n') ) }) test('composer strips raw date picker prefix before building structured display', () => { const formatted = buildStructuredComposerSubmitText( '2026-05-20 至 2026-05-23,去上海支撑上海国电的服务器部署,出差3天', { mode: 'range', start_date: '2026-05-20', end_date: '2026-05-23', business_time: '2026-05-20 至 2026-05-23' } ) assert.equal( formatted, [ '发生时间:2026-05-20 至 2026-05-23', '地点:上海', '事由:支撑上海国电的服务器部署', '天数:3天' ].join('\n') ) }) test('composer date selection shows raw date capsule labels', () => { assert.match(createViewTemplate, /aria-label="选择日期"/) assert.match(createViewTemplate, /aria-label="日期选择"/) assert.match(createViewTemplate, /aria-label="移除日期"/) assert.match(createViewTemplate, /handleComposerDateInputChange\('single'\)/) assert.match(createViewTemplate, /handleComposerDateInputChange\('range-start'\)/) assert.match(createViewTemplate, /handleComposerDateInputChange\('range-end'\)/) assert.doesNotMatch(createViewTemplate, /@click="applyComposerDateSelection"/) assert.doesNotMatch(createViewTemplate, /aria-label="选择业务发生时间"/) assert.doesNotMatch(createViewTemplate, /aria-label="移除业务发生时间"/) assert.doesNotMatch(composerToolsScript, /return `发生时间:\$\{composerSingleDate\.value\}`/) assert.match(composerToolsScript, /return composerSingleDate\.value/) assert.match(composerToolsScript, /return `\$\{composerRangeStartDate\.value\} 至 \$\{composerRangeEndDate\.value\}`/) assert.match(composerToolsScript, /function commitComposerDateSelection/) assert.match(composerToolsScript, /onComposerDateSelection\?\.\(selection\)/) }) test('composer keeps backend raw text but displays structured user message', () => { assert.match(submitComposerScript, /const rawText = resolveComposerSubmitText\(options\.rawText\)\.trim\(\)/) assert.match(submitComposerScript, /resolveComposerDisplaySubmitText\(rawText\)/) }) test('knowledge questions keep enough request time for LightRAG retrieval', () => { assert.match(submitComposerScript, /timeoutMs:\s*75000/) assert.match(submitComposerScript, /知识问答仍在检索整理/) })