import type { MeResponse } from '@lingxi/shared'; import { beforeEach, describe, expect, it } from 'vitest'; import { authUserFromMe, DEMO_USER, isDemoSession, useAuthStore } from './auth-store'; const USER_ID = '01HZZZZZZZZZZZZZZZZZZZZZZ1'; const ROLE_ID = '01HZZZZZZZZZZZZZZZZZZZZZZ2'; const GROUP_ID = '01HZZZZZZZZZZZZZZZZZZZZZZ3'; const me: MeResponse = { user: { id: USER_ID, name: '沈知远', phoneMasked: '133****0071', account: 'shen.zhiyuan', departmentId: GROUP_ID, departmentName: '平台技术部', groupId: null, groupName: '部门直属', roles: [{ id: ROLE_ID, code: 'super_admin', name: '超级管理员', isSystem: true }], status: 'active', lastLoginAt: '2026-11-02T10:02:00.000Z', createdAt: '2026-09-01T00:00:00.000Z', }, roles: [{ id: ROLE_ID, code: 'super_admin', name: '超级管理员', isSystem: true }], permissions: ['user:view', 'user:manage'], dataScopes: [{ type: 'all' }], mustChangePassword: false, }; describe('会话状态', () => { beforeEach(() => { window.localStorage.clear(); useAuthStore.getState().clearSession(); }); it('/me 同步用户、权限与首登改密标记', () => { useAuthStore.getState().setSession({ accessToken: 'token', refreshToken: 'refresh', user: { id: USER_ID, name: '临时', account: 'tmp' }, permissions: [], }); useAuthStore.getState().syncFromMe({ ...me, mustChangePassword: true }); const state = useAuthStore.getState(); expect(state.user?.name).toBe('沈知远'); expect(state.user?.roleName).toBe('超级管理员'); expect(state.permissions).toEqual(['user:view', 'user:manage']); expect(state.mustChangePassword).toBe(true); useAuthStore.getState().markPasswordChanged(); expect(useAuthStore.getState().mustChangePassword).toBe(false); }); it('会话持久化与登出清理', () => { useAuthStore.getState().setSession({ accessToken: 'token', user: authUserFromMe(me), permissions: me.permissions, }); expect(window.localStorage.getItem('lingxi.auth.session')).toContain('token'); useAuthStore.getState().clearSession(); expect(window.localStorage.getItem('lingxi.auth.session')).toBeNull(); expect(useAuthStore.getState().user).toBeNull(); }); it('刷新令牌只更新 token,不动用户信息', () => { useAuthStore.getState().setSession({ accessToken: 'old', refreshToken: 'refresh-old', user: authUserFromMe(me), permissions: me.permissions, }); useAuthStore.getState().setTokens({ accessToken: 'new', refreshToken: 'refresh-new' }); expect(useAuthStore.getState().accessToken).toBe('new'); expect(useAuthStore.getState().refreshToken).toBe('refresh-new'); expect(useAuthStore.getState().user?.id).toBe(USER_ID); }); it('演示会话识别与演示权限写入', () => { useAuthStore.getState().signInDemo(); const state = useAuthStore.getState(); expect(isDemoSession(state.accessToken)).toBe(true); expect(state.user).toEqual(DEMO_USER); expect(state.permissions.length).toBeGreaterThan(0); expect(isDemoSession('real-token')).toBe(false); }); });