Files
xuanzhi-wx/tests/session.test.js
2026-04-22 18:54:52 +08:00

88 lines
2.1 KiB
JavaScript

const { createSessionStore } = require('../stores/modules/session')
describe('createSessionStore', () => {
test('hydrates persisted session and notifies subscribers on updates', () => {
const storage = new Map([
[
'session',
{
token: 'cached-token',
userInfo: { id: 1, name: 'Xuanzhi' },
permissions: ['dashboard:view']
}
]
])
const sessionStore = createSessionStore({
storageKey: 'session',
storage: {
get(key) {
return storage.get(key)
},
set(key, value) {
storage.set(key, value)
},
remove(key) {
storage.delete(key)
}
}
})
const subscriber = jest.fn()
sessionStore.subscribe(subscriber)
sessionStore.hydrate()
sessionStore.setSession({
token: 'next-token',
userInfo: { id: 2, name: 'Architect' },
permissions: ['dashboard:view', 'dashboard:edit']
})
expect(sessionStore.getState()).toEqual({
isLoggedIn: true,
token: 'next-token',
userInfo: { id: 2, name: 'Architect' },
permissions: ['dashboard:view', 'dashboard:edit']
})
expect(storage.get('session')).toEqual({
token: 'next-token',
userInfo: { id: 2, name: 'Architect' },
permissions: ['dashboard:view', 'dashboard:edit']
})
expect(subscriber).toHaveBeenCalled()
})
test('clears persisted state on logout', () => {
const storage = new Map()
const sessionStore = createSessionStore({
storageKey: 'session',
storage: {
get(key) {
return storage.get(key)
},
set(key, value) {
storage.set(key, value)
},
remove(key) {
storage.delete(key)
}
}
})
sessionStore.setSession({
token: 'next-token',
userInfo: { id: 2, name: 'Architect' },
permissions: ['dashboard:view', 'dashboard:edit']
})
sessionStore.clearSession()
expect(sessionStore.getState()).toEqual({
isLoggedIn: false,
token: '',
userInfo: null,
permissions: []
})
expect(storage.has('session')).toBe(false)
})
})