Files
datahub/frontend/src/stores/__tests__/user.spec.ts
T
2026-03-18 16:34:27 +08:00

197 lines
6.3 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from 'vitest'
import { setActivePinia, createPinia } from 'pinia'
import { useUserStore } from '../user'
// Mock the api module
vi.mock('@/utils/request', () => ({
api: {
get: vi.fn(),
post: vi.fn(),
},
}))
describe('useUserStore', () => {
beforeEach(() => {
setActivePinia(createPinia())
localStorage.clear()
vi.restoreAllMocks()
})
describe('initial state', () => {
it('starts with null values when localStorage is empty', () => {
const store = useUserStore()
expect(store.token).toBeNull()
expect(store.refreshToken).toBeNull()
expect(store.user).toBeNull()
expect(store.isLoggedIn).toBe(false)
expect(store.username).toBe('')
})
it('restores token from localStorage', () => {
localStorage.setItem('access_token', 'header.payload.signature')
localStorage.setItem('refresh_token', 'rh.rp.rs')
const store = useUserStore()
expect(store.token).toBe('header.payload.signature')
expect(store.refreshToken).toBe('rh.rp.rs')
expect(store.isLoggedIn).toBe(true)
})
it('restores user info from localStorage', () => {
const savedUser = { id: 1, username: 'admin', email: 'a@b.com', role: 'admin', status: 1 }
localStorage.setItem('user', JSON.stringify(savedUser))
const store = useUserStore()
expect(store.user).toEqual(savedUser)
expect(store.username).toBe('admin')
expect(store.isAdmin).toBe(true)
})
it('handles corrupted user data in localStorage', () => {
localStorage.setItem('user', 'invalid-json{')
const store = useUserStore()
expect(store.user).toBeNull()
})
})
describe('setToken', () => {
it('sets tokens in store and localStorage', () => {
const store = useUserStore()
store.setToken('header.payload.signature', 'rh.rp.rs')
expect(store.token).toBe('header.payload.signature')
expect(store.refreshToken).toBe('rh.rp.rs')
expect(localStorage.getItem('access_token')).toBe('header.payload.signature')
expect(localStorage.getItem('refresh_token')).toBe('rh.rp.rs')
expect(store.isLoggedIn).toBe(true)
})
})
describe('setToken with remember=false', () => {
it('does not persist tokens to localStorage', () => {
const store = useUserStore()
store.setToken('h.p.s', 'r.p.s', false)
expect(store.token).toBe('h.p.s')
expect(store.refreshToken).toBe('r.p.s')
expect(localStorage.getItem('access_token')).toBeNull()
expect(localStorage.getItem('refresh_token')).toBeNull()
})
it('clears existing user from localStorage', () => {
localStorage.setItem('user', JSON.stringify({ id: 1, username: 'old' }))
const store = useUserStore()
store.setToken('h.p.s', 'r.p.s', false)
expect(localStorage.getItem('user')).toBeNull()
})
})
describe('setUser', () => {
it('persists to localStorage when remember=true', () => {
const store = useUserStore()
store.setToken('h.p.s', 'r.p.s', true)
const userInfo = { id: 1, username: 'test', email: 't@t.com', role: 'user', status: 1 }
store.setUser(userInfo)
expect(store.user).toEqual(userInfo)
expect(store.username).toBe('test')
expect(store.isAdmin).toBe(false)
expect(JSON.parse(localStorage.getItem('user')!)).toEqual(userInfo)
})
it('does not persist to localStorage by default (remember=false)', () => {
const store = useUserStore()
const userInfo = { id: 1, username: 'test', email: 't@t.com', role: 'user', status: 1 }
store.setUser(userInfo)
expect(store.user).toEqual(userInfo)
expect(localStorage.getItem('user')).toBeNull()
})
it('does not write to localStorage after setToken(remember=false)', () => {
const store = useUserStore()
store.setToken('h.p.s', 'r.p.s', false)
const userInfo = { id: 1, username: 'test', email: 't@t.com', role: 'user', status: 1 }
store.setUser(userInfo)
expect(store.user).toEqual(userInfo)
expect(localStorage.getItem('user')).toBeNull()
})
})
describe('logout', () => {
it('clears all state and localStorage', () => {
const store = useUserStore()
store.setToken('h.p.s', 'r.p.s')
store.setUser({ id: 1, username: 'a', email: 'a@a.com', role: 'admin', status: 1 })
store.logout()
expect(store.token).toBeNull()
expect(store.refreshToken).toBeNull()
expect(store.user).toBeNull()
expect(store.isLoggedIn).toBe(false)
expect(localStorage.getItem('access_token')).toBeNull()
expect(localStorage.getItem('refresh_token')).toBeNull()
expect(localStorage.getItem('user')).toBeNull()
})
it('resets _remember so subsequent setUser does not persist', () => {
const store = useUserStore()
store.setToken('h.p.s', 'r.p.s', true)
store.setUser({ id: 1, username: 'a', email: 'a@a.com', role: 'admin', status: 1 })
expect(localStorage.getItem('user')).not.toBeNull()
store.logout()
store.setUser({ id: 2, username: 'b', email: 'b@b.com', role: 'user', status: 1 })
expect(store.user?.username).toBe('b')
expect(localStorage.getItem('user')).toBeNull()
})
})
describe('fetchCurrentUser', () => {
it('fetches user from API and updates store', async () => {
const { api } = await import('@/utils/request')
const mockUser = { id: 1, username: 'fetched', email: 'f@f.com', role: 'admin', status: 1 }
vi.mocked(api.get).mockResolvedValueOnce(mockUser)
const store = useUserStore()
const result = await store.fetchCurrentUser()
expect(api.get).toHaveBeenCalledWith('/api/v1/me')
expect(result).toEqual(mockUser)
expect(store.user).toEqual(mockUser)
expect(store.isAdmin).toBe(true)
})
})
describe('computed properties', () => {
it('isAdmin returns true for admin role', () => {
const store = useUserStore()
store.setUser({ id: 1, username: 'a', email: 'a@a.com', role: 'admin', status: 1 })
expect(store.isAdmin).toBe(true)
})
it('isAdmin returns false for non-admin role', () => {
const store = useUserStore()
store.setUser({ id: 1, username: 'u', email: 'u@u.com', role: 'user', status: 1 })
expect(store.isAdmin).toBe(false)
})
})
})