feat(image): 新建 knowai-core:1.0.0 镜像并完成推送
Some checks reported errors
continuous-integration/drone/push Build was killed
Some checks reported errors
continuous-integration/drone/push Build was killed
- 搭建 api、auth、utils 等逻辑模块 - 通过 tsc、eslint、vitest 测试验证 BREAKING CHANGE: 新镜像分支
This commit is contained in:
149
test/auth/session-manager.test.ts
Normal file
149
test/auth/session-manager.test.ts
Normal file
@@ -0,0 +1,149 @@
|
||||
/**
|
||||
* 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);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user