test(server): 添加 server 模块单元测试
- 新增 vitest 配置和测试基础设施 - 添加 adapter.test.ts: 测试 Core 模块初始化和 Agent 管理 (18 tests) - 添加 token.test.ts: 测试 Token 生成、验证和中间件 (25 tests) - 添加 handler.test.ts: 测试权限处理器 (18 tests) - 添加 ws.test.ts: 测试 WebSocket 连接和消息处理 (19 tests) - 添加 sse.test.ts: 测试 SSE 事件发送 (14 tests) - 添加 sessions.test.ts: 测试会话路由 (16 tests) - 添加 config.test.ts: 测试配置路由 (10 tests) - 添加 context.test.ts: 测试上下文压缩路由 (9 tests) - 添加 providers.test.ts: 测试 Provider 管理路由 (18 tests) - 添加 manager.test.ts: 测试 SessionManager (48 tests) 总计 195 个测试,覆盖率从 0% 提升至 29.59%
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
/**
|
||||
* Hono 框架 Mock 工厂
|
||||
*
|
||||
* 提供 Hono Context 和 WebSocket Context 的 mock 实现
|
||||
*/
|
||||
|
||||
import { vi } from 'vitest';
|
||||
|
||||
/**
|
||||
* 创建 Mock Hono Context
|
||||
*/
|
||||
export function createMockHonoContext(options: {
|
||||
params?: Record<string, string>;
|
||||
body?: unknown;
|
||||
query?: Record<string, string>;
|
||||
headers?: Record<string, string>;
|
||||
} = {}) {
|
||||
const jsonMock = vi.fn((data: unknown, status?: number) => {
|
||||
return new Response(JSON.stringify(data), {
|
||||
status: status ?? 200,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
});
|
||||
});
|
||||
|
||||
const textMock = vi.fn((text: string, status?: number) => {
|
||||
return new Response(text, {
|
||||
status: status ?? 200,
|
||||
headers: { 'Content-Type': 'text/plain' },
|
||||
});
|
||||
});
|
||||
|
||||
return {
|
||||
req: {
|
||||
param: vi.fn((key: string) => options.params?.[key]),
|
||||
json: vi.fn().mockResolvedValue(options.body ?? {}),
|
||||
query: vi.fn((key: string) => options.query?.[key]),
|
||||
header: vi.fn((key: string) => options.headers?.[key.toLowerCase()]),
|
||||
url: 'http://localhost:3000/api/test',
|
||||
method: 'GET',
|
||||
path: '/api/test',
|
||||
},
|
||||
json: jsonMock,
|
||||
text: textMock,
|
||||
status: vi.fn().mockReturnThis(),
|
||||
header: vi.fn().mockReturnThis(),
|
||||
get: vi.fn((key: string) => {
|
||||
if (key === 'sessionId') return options.params?.sessionId;
|
||||
return undefined;
|
||||
}),
|
||||
set: vi.fn(),
|
||||
// 用于测试验证
|
||||
_jsonMock: jsonMock,
|
||||
_textMock: textMock,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建 Mock WebSocket Context
|
||||
*/
|
||||
export function createMockWSContext() {
|
||||
const sendMock = vi.fn();
|
||||
const closeMock = vi.fn();
|
||||
|
||||
return {
|
||||
send: sendMock,
|
||||
close: closeMock,
|
||||
readyState: 1, // WebSocket.OPEN
|
||||
// 用于测试验证
|
||||
_sendMock: sendMock,
|
||||
_closeMock: closeMock,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建 Mock SSE Stream
|
||||
*/
|
||||
export function createMockSSEStream() {
|
||||
const writeMock = vi.fn();
|
||||
const closeMock = vi.fn();
|
||||
|
||||
return {
|
||||
write: writeMock,
|
||||
close: closeMock,
|
||||
writeSSE: vi.fn((data: { event?: string; data: string; id?: string }) => {
|
||||
writeMock(`event: ${data.event ?? 'message'}\ndata: ${data.data}\n\n`);
|
||||
}),
|
||||
// 用于测试验证
|
||||
_writeMock: writeMock,
|
||||
_closeMock: closeMock,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建 Mock Next 函数
|
||||
*/
|
||||
export function createMockNext() {
|
||||
return vi.fn().mockResolvedValue(undefined);
|
||||
}
|
||||
Reference in New Issue
Block a user