Files
X-Financial/web/tests/personal-workbench-assistant.test.mjs

67 lines
2.6 KiB
JavaScript
Raw Normal View History

import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
import { fileURLToPath } from 'node:url'
import { assistantCapabilities } from '../src/data/personalWorkbench.js'
import {
buildWorkbenchCapabilityAssistantPayload,
resolveWorkbenchCapabilityAssistantEntry
} from '../src/utils/personalWorkbenchAssistantEntry.js'
const workbench = readFileSync(
fileURLToPath(new URL('../src/components/business/PersonalWorkbench.vue', import.meta.url)),
'utf8'
)
test('workbench assistant greets the current employee without the old helper tag', () => {
assert.doesNotMatch(workbench, /assistant-tag/)
assert.doesNotMatch(workbench, /AI 报销助手/)
assert.match(workbench, /嗨,\{\{ displayUserName \}\},我是您的 <span>AI 费用助手<\/span>/)
assert.match(workbench, /placeholder="请输入费用申请、报销问题、预算查询或制度问答\.\.\."/)
assert.match(workbench, /const displayUserName = computed/)
assert.match(workbench, /user\.name/)
})
test('workbench capability cards open assistant without injecting canned prompts', () => {
assert.match(workbench, /@click="openCapabilityAssistant\(item\)"/)
assert.doesNotMatch(workbench, /openPromptAssistant\(item\.prompt\)/)
for (const item of assistantCapabilities) {
const payload = buildWorkbenchCapabilityAssistantPayload(item, {
prompt: '',
source: 'workbench',
files: []
})
assert.equal(payload.prompt, '')
assert.equal(payload.conversation, null)
assert.notEqual(payload.prompt, item.prompt)
assert.ok(resolveWorkbenchCapabilityAssistantEntry(item).sessionType)
}
})
test('workbench capability cards keep user-entered context only', () => {
const [expenseApplication] = assistantCapabilities
const files = [{ name: 'invoice.pdf' }]
const payload = buildWorkbenchCapabilityAssistantPayload(expenseApplication, {
prompt: '我需要申请下周出差费用',
source: 'workbench',
files
})
assert.equal(payload.prompt, '我需要申请下周出差费用')
assert.equal(payload.source, 'application')
assert.equal(payload.sessionType, 'application')
assert.equal(payload.files, files)
})
test('workbench submit shows intent recognition feedback before assistant opens', () => {
assert.match(workbench, /class="assistant-intent-status"/)
assert.match(workbench, /aria-live="polite"/)
assert.match(workbench, /正在识别意图,准备进入对应助手/)
assert.match(workbench, /startPendingAction\('intent'\)/)
assert.match(workbench, /if \(open\) \{\s*clearPendingAction\(\)/)
assert.match(workbench, /:readonly="isComposerPending"/)
})