/** * SessionManager测试用例 * 验证SessionManager的功能和安全性 */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { DefaultSessionManager, createSessionManager } from '../../auth/session-manager'; import { MemoryStorageAdapter } from '../../auth/storage-adapter'; import type { User } from '@/types'; import type { ApiClient } from '@/api/types'; // 模拟ApiClient const mockApiClient = { get: vi.fn(), post: vi.fn(), put: vi.fn(), delete: vi.fn(), patch: vi.fn(), request: vi.fn(), addRequestInterceptor: vi.fn(), addResponseInterceptor: vi.fn(), removeRequestInterceptor: vi.fn(), removeResponseInterceptor: vi.fn(), setDefaults: vi.fn(), setBaseURL: vi.fn(), createInstance: vi.fn() } as unknown as ApiClient; describe('SessionManager', () => { let sessionManager: DefaultSessionManager; let mockStorage: MemoryStorageAdapter; beforeEach(() => { vi.clearAllMocks(); mockStorage = new MemoryStorageAdapter(); sessionManager = new DefaultSessionManager(mockApiClient, mockStorage); }); afterEach(() => { vi.restoreAllMocks(); }); describe('isAuthenticated', () => { it('当用户认证成功时返回true', async () => { // 模拟API返回用户信息 const mockUser: User = { id: 'user-123', username: 'testuser', }; mockApiClient.get.mockResolvedValue({ user: mockUser }); // 验证认证状态 const result = await sessionManager.isAuthenticated(); expect(result).toBe(true); expect(mockApiClient.get).toHaveBeenCalledWith('/auth/me'); }); it('当用户认证失败时返回false', async () => { // 模拟API返回错误 mockApiClient.get.mockRejectedValue(new Error('Unauthorized')); // 验证认证状态 const result = await sessionManager.isAuthenticated(); expect(result).toBe(false); expect(mockApiClient.get).toHaveBeenCalledWith('/auth/me'); }); }); describe('getUserInfo', () => { it('当用户认证成功时返回用户信息', async () => { // 模拟API返回用户信息 const mockUser: User = { id: 'user-123', username: 'testuser', email: 'test@example.com', avatar: '', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }; mockApiClient.get.mockResolvedValue({ user: mockUser }); // 获取用户信息 const user = await sessionManager.getUserInfo(); expect(user).toEqual(mockUser); expect(mockApiClient.get).toHaveBeenCalledWith('/auth/me'); }); it('当用户认证失败时抛出错误', async () => { // 模拟API返回错误 mockApiClient.get.mockRejectedValue(new Error('Unauthorized')); // 获取用户信息应该抛出错误 await expect(sessionManager.getUserInfo()).rejects.toThrow('Unauthorized'); expect(mockApiClient.get).toHaveBeenCalledWith('/auth/me'); }); it('每次调用都从服务器获取最新用户信息', async () => { // 模拟API返回用户信息 const mockUser: User = { id: 'user-123', username: 'testuser', email: 'test@example.com', avatar: '', createdAt: new Date().toISOString(), updatedAt: new Date().toISOString() }; mockApiClient.get.mockResolvedValue({ user: mockUser }); // 第一次调用 const user1 = await sessionManager.getUserInfo(); expect(user1).toEqual(mockUser); expect(mockApiClient.get).toHaveBeenCalledTimes(1); // 第二次调用应该再次调用API,因为getUserInfo是幂等操作 const user2 = await sessionManager.getUserInfo(); expect(user2).toEqual(mockUser); expect(mockApiClient.get).toHaveBeenCalledTimes(2); // 有额外调用 }); }); describe('clearCache', () => { it('应该清除缓存', () => { // 设置一些存储项 mockStorage.setItem('user_preferences', '{"theme":"dark"}'); mockStorage.setItem('ui_state', '{"sidebarOpen":true}'); // 验证存储项存在 expect(mockStorage.getItem('user_preferences')).toBe('{"theme":"dark"}'); expect(mockStorage.getItem('ui_state')).toBe('{"sidebarOpen":true}'); // 清除缓存 sessionManager.clearCache(); // 验证存储项已清除 expect(mockStorage.getItem('user_preferences')).toBeNull(); expect(mockStorage.getItem('ui_state')).toBeNull(); }); }); describe('createSessionManager', () => { it('创建SessionManager实例', () => { const newSessionManager = createSessionManager(mockApiClient, mockStorage); expect(newSessionManager).toBeInstanceOf(DefaultSessionManager); }); }); });