2026-05-22 16:00:19 +08:00
|
|
|
|
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'
|
|
|
|
|
|
)
|
2026-05-30 15:46:51 +08:00
|
|
|
|
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'
|
|
|
|
|
|
)
|
2026-05-22 16:00:19 +08:00
|
|
|
|
|
|
|
|
|
|
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')
|
|
|
|
|
|
)
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-05-25 13:35:39 +08:00
|
|
|
|
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')
|
|
|
|
|
|
)
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-05-30 15:46:51 +08:00
|
|
|
|
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\)/)
|
|
|
|
|
|
})
|
|
|
|
|
|
|
2026-05-22 16:00:19 +08:00
|
|
|
|
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\)/)
|
|
|
|
|
|
})
|
2026-05-23 19:54:42 +08:00
|
|
|
|
|
|
|
|
|
|
test('knowledge questions keep enough request time for LightRAG retrieval', () => {
|
|
|
|
|
|
assert.match(submitComposerScript, /timeoutMs:\s*75000/)
|
|
|
|
|
|
assert.match(submitComposerScript, /知识问答仍在检索整理/)
|
|
|
|
|
|
})
|