feat(image): 新建 knowai-core:1.0.0 镜像并完成推送
Some checks reported errors
continuous-integration/drone/push Build was killed

- 搭建 api、auth、utils 等逻辑模块
- 通过 tsc、eslint、vitest 测试验证

BREAKING CHANGE: 新镜像分支
This commit is contained in:
tobegold574
2025-11-10 20:20:25 +08:00
commit 6a81b7bb13
73 changed files with 10511 additions and 0 deletions

View 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);
});
});
});