Files
X-Financial/web/tests/ai-workbench-conversation-store.test.mjs

70 lines
2.2 KiB
JavaScript
Raw Normal View History

import assert from 'node:assert/strict'
import test from 'node:test'
import {
deleteAiWorkbenchConversation,
loadAiWorkbenchConversationHistory,
saveAiWorkbenchConversation
} from '../src/utils/aiWorkbenchConversationStore.js'
function installLocalStorageMock() {
const store = new Map()
globalThis.window = {
localStorage: {
getItem(key) {
return store.has(key) ? store.get(key) : null
},
setItem(key, value) {
store.set(key, String(value))
},
removeItem(key) {
store.delete(key)
},
clear() {
store.clear()
}
}
}
return store
}
test('AI workbench conversation store persists scoped history for sidebar sessions', () => {
installLocalStorageMock()
const user = { username: 'caoxiaozhu', email: 'caoxiaozhu@xf.com', name: '曹笑竹' }
const anotherUser = { username: 'budget-user' }
saveAiWorkbenchConversation(user, {
id: 'conv-first',
title: '',
updatedAt: Date.now() - 3000,
messages: [
{ id: 'u1', role: 'user', content: '帮我核对差旅报销口径' },
{ id: 'a1', role: 'assistant', content: '我会根据制度和票据要求继续核对。' }
]
})
saveAiWorkbenchConversation(user, {
id: 'conv-second',
title: '预算占用分析',
updatedAt: Date.now(),
stewardState: { intent: 'budget_check' },
messages: [
{ id: 'u2', role: 'user', content: '分析本月预算占用' },
{ id: 'a2', role: 'assistant', content: '本月预算占用需要结合部门额度和已提交单据。' }
]
})
const history = loadAiWorkbenchConversationHistory(user)
assert.equal(history.length, 2)
assert.equal(history[0].id, 'conv-second')
assert.equal(history[0].title, '预算占用分析')
assert.equal(history[0].stewardState.intent, 'budget_check')
assert.equal(history[1].title, '帮我核对差旅报销口径')
assert.equal(history[1].prompt, '帮我核对差旅报销口径')
assert.ok(history[0].time)
assert.deepEqual(loadAiWorkbenchConversationHistory(anotherUser), [])
const nextHistory = deleteAiWorkbenchConversation(user, 'conv-second')
assert.equal(nextHistory.length, 1)
assert.equal(nextHistory[0].id, 'conv-first')
})