Files
knowai/test/auth/session-manager.test.ts
tobegold574 6a81b7bb13
Some checks reported errors
continuous-integration/drone/push Build was killed
feat(image): 新建 knowai-core:1.0.0 镜像并完成推送
- 搭建 api、auth、utils 等逻辑模块
- 通过 tsc、eslint、vitest 测试验证

BREAKING CHANGE: 新镜像分支
2025-11-10 20:20:25 +08:00

149 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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);
});
});
});