test(server): 修复 SessionManager 测试的 session 清理问题

- 添加 afterEach 钩子清理测试中创建的 session
- 引入 createTrackedSession 辅助函数追踪需要清理的 session
- 防止测试产生的 session 持久化到磁盘影响用户数据
This commit is contained in:
2025-12-15 00:55:02 +08:00
parent 5b20420ccd
commit a657af9bb7
@@ -7,15 +7,18 @@
* 测试中会创建新实例并记录初始会话数量,以确保测试独立性。
*/
import { describe, it, expect, beforeEach, vi } from 'vitest';
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
import { SessionManager, getSessionManager } from '../../../src/session/manager.js';
describe('SessionManager', () => {
let manager: SessionManager;
let initialCount: number;
// 追踪测试中创建的 session ID,用于清理
let createdSessionIds: string[] = [];
beforeEach(async () => {
vi.clearAllMocks();
createdSessionIds = [];
// Create a fresh instance for each test
manager = new SessionManager();
await manager.init();
@@ -23,11 +26,29 @@ describe('SessionManager', () => {
initialCount = manager.count();
});
afterEach(async () => {
// 清理测试中创建的所有 session
for (const sessionId of createdSessionIds) {
try {
await manager.delete(sessionId);
} catch {
// 忽略删除失败(可能已经被测试删除)
}
}
});
// 辅助函数:创建 session 并追踪 ID
async function createTrackedSession(data: Parameters<SessionManager['create']>[0]) {
const session = await manager.create(data);
createdSessionIds.push(session.id);
return session;
}
describe('init - 初始化', () => {
it('初始化成功', async () => {
// Manager is already initialized in beforeEach
// Verify it works by creating a session
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
expect(session).toBeDefined();
});
@@ -36,14 +57,14 @@ describe('SessionManager', () => {
await manager.init();
// 不会抛错,可以正常工作
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
expect(session).toBeDefined();
});
});
describe('create - 创建会话', () => {
it('创建新会话', async () => {
const session = await manager.create({ name: 'New Session' });
const session = await createTrackedSession({ name: 'New Session' });
expect(session).toBeDefined();
expect(session.name).toBe('New Session');
@@ -52,14 +73,14 @@ describe('SessionManager', () => {
});
it('生成唯一 ID', async () => {
const session1 = await manager.create({ name: 'Session 1' });
const session2 = await manager.create({ name: 'Session 2' });
const session1 = await createTrackedSession({ name: 'Session 1' });
const session2 = await createTrackedSession({ name: 'Session 2' });
expect(session1.id).not.toBe(session2.id);
});
it('使用自定义工作目录', async () => {
const session = await manager.create({
const session = await createTrackedSession({
name: 'Custom Workdir',
workdir: '/custom/path',
});
@@ -68,7 +89,7 @@ describe('SessionManager', () => {
});
it('无名称时创建匿名会话', async () => {
const session = await manager.create({});
const session = await createTrackedSession({});
expect(session).toBeDefined();
expect(session.name).toBeUndefined();
@@ -76,7 +97,7 @@ describe('SessionManager', () => {
it('设置正确的时间戳', async () => {
const before = new Date().toISOString();
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const after = new Date().toISOString();
expect(session.createdAt).toBeDefined();
@@ -87,7 +108,7 @@ describe('SessionManager', () => {
it('创建后 count 增加', async () => {
const before = manager.count();
await manager.create({ name: 'Test' });
await createTrackedSession({ name: 'Test' });
expect(manager.count()).toBe(before + 1);
});
});
@@ -95,16 +116,16 @@ describe('SessionManager', () => {
describe('list - 列出会话', () => {
it('返回所有会话(包含新创建的)', async () => {
const countBefore = manager.list().length;
await manager.create({ name: 'Session 1' });
await manager.create({ name: 'Session 2' });
await createTrackedSession({ name: 'Session 1' });
await createTrackedSession({ name: 'Session 2' });
const sessions = manager.list();
expect(sessions.length).toBe(countBefore + 2);
});
it('按更新时间排序(最新在前)', async () => {
const session1 = await manager.create({ name: 'Older Session' });
const session2 = await manager.create({ name: 'Newer Session' });
const session1 = await createTrackedSession({ name: 'Older Session' });
const session2 = await createTrackedSession({ name: 'Newer Session' });
// Wait a bit and update session1
await new Promise((resolve) => setTimeout(resolve, 10));
@@ -123,7 +144,7 @@ describe('SessionManager', () => {
describe('get - 获取会话', () => {
it('返回存在的会话', async () => {
const created = await manager.create({ name: 'Test' });
const created = await createTrackedSession({ name: 'Test' });
const session = manager.get(created.id);
expect(session).toBeDefined();
@@ -138,6 +159,7 @@ describe('SessionManager', () => {
describe('delete - 删除会话', () => {
it('删除存在的会话', async () => {
// 注意:这个测试会自己删除 session,不需要追踪
const session = await manager.create({ name: 'To Delete' });
const result = await manager.delete(session.id);
@@ -151,6 +173,7 @@ describe('SessionManager', () => {
});
it('删除会话时同时删除消息', async () => {
// 注意:这个测试会自己删除 session,不需要追踪
const session = await manager.create({ name: 'With Messages' });
await manager.addMessage(session.id, { role: 'user', content: 'Hello' });
@@ -160,6 +183,7 @@ describe('SessionManager', () => {
});
it('删除后 count 减少', async () => {
// 注意:这个测试会自己删除 session,不需要追踪
const session = await manager.create({ name: 'Test' });
const countAfterCreate = manager.count();
@@ -170,21 +194,21 @@ describe('SessionManager', () => {
describe('updateStatus - 更新状态', () => {
it('更新会话状态', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const updated = manager.updateStatus(session.id, 'active');
expect(updated?.status).toBe('active');
});
it('更新为 busy 状态', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const updated = manager.updateStatus(session.id, 'busy');
expect(updated?.status).toBe('busy');
});
it('更新为 idle 状态', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
manager.updateStatus(session.id, 'active');
const updated = manager.updateStatus(session.id, 'idle');
@@ -192,7 +216,7 @@ describe('SessionManager', () => {
});
it('更新时更新 updatedAt', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const originalUpdatedAt = session.updatedAt;
// Wait a bit to ensure time difference
@@ -210,7 +234,7 @@ describe('SessionManager', () => {
describe('getMessages - 获取消息', () => {
it('返回会话消息', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
await manager.addMessage(session.id, { role: 'user', content: 'Hello' });
await manager.addMessage(session.id, { role: 'assistant', content: 'Hi!' });
@@ -222,7 +246,7 @@ describe('SessionManager', () => {
});
it('新会话消息为空', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const messages = manager.getMessages(session.id);
expect(messages).toEqual([]);
});
@@ -235,7 +259,7 @@ describe('SessionManager', () => {
describe('addMessage - 添加消息', () => {
it('添加用户消息', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const message = await manager.addMessage(session.id, {
role: 'user',
content: 'Hello',
@@ -249,7 +273,7 @@ describe('SessionManager', () => {
});
it('添加助手消息', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const message = await manager.addMessage(session.id, {
role: 'assistant',
content: 'Hello!',
@@ -259,7 +283,7 @@ describe('SessionManager', () => {
});
it('添加系统消息', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const message = await manager.addMessage(session.id, {
role: 'system',
content: 'System prompt',
@@ -269,7 +293,7 @@ describe('SessionManager', () => {
});
it('消息有唯一 ID', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const msg1 = await manager.addMessage(session.id, { role: 'user', content: 'Hello' });
const msg2 = await manager.addMessage(session.id, { role: 'assistant', content: 'Hi!' });
@@ -277,7 +301,7 @@ describe('SessionManager', () => {
});
it('消息有正确的时间戳', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const before = new Date().toISOString();
const message = await manager.addMessage(session.id, { role: 'user', content: 'Hello' });
const after = new Date().toISOString();
@@ -288,7 +312,7 @@ describe('SessionManager', () => {
});
it('更新会话的 messageCount', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
expect(session.messageCount).toBe(0);
await manager.addMessage(session.id, { role: 'user', content: 'Hello' });
@@ -298,7 +322,7 @@ describe('SessionManager', () => {
});
it('更新会话的 updatedAt', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const originalUpdatedAt = session.updatedAt;
await new Promise((resolve) => setTimeout(resolve, 10));
@@ -320,14 +344,14 @@ describe('SessionManager', () => {
describe('updateSessionName - 更新名称', () => {
it('更新会话名称', async () => {
const session = await manager.create({ name: 'Old Name' });
const session = await createTrackedSession({ name: 'Old Name' });
const updated = await manager.updateSessionName(session.id, 'New Name');
expect(updated?.name).toBe('New Name');
});
it('更新名称更新 updatedAt', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const originalUpdatedAt = session.updatedAt;
await new Promise((resolve) => setTimeout(resolve, 10));
@@ -342,7 +366,7 @@ describe('SessionManager', () => {
});
it('更新为空名称', async () => {
const session = await manager.create({ name: 'Has Name' });
const session = await createTrackedSession({ name: 'Has Name' });
const updated = await manager.updateSessionName(session.id, '');
expect(updated?.name).toBe('');
@@ -352,13 +376,13 @@ describe('SessionManager', () => {
describe('count - 会话数量', () => {
it('创建后数量增加', async () => {
const before = manager.count();
await manager.create({ name: 'Session 1' });
await createTrackedSession({ name: 'Session 1' });
expect(manager.count()).toBe(before + 1);
await manager.create({ name: 'Session 2' });
await createTrackedSession({ name: 'Session 2' });
expect(manager.count()).toBe(before + 2);
await manager.create({ name: 'Session 3' });
await createTrackedSession({ name: 'Session 3' });
expect(manager.count()).toBe(before + 3);
});
@@ -370,7 +394,7 @@ describe('SessionManager', () => {
describe('exists - 检查存在', () => {
it('存在的会话返回 true', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
expect(manager.exists(session.id)).toBe(true);
});
@@ -379,6 +403,7 @@ describe('SessionManager', () => {
});
it('删除后返回 false', async () => {
// 注意:这个测试会自己删除 session,不需要追踪
const session = await manager.create({ name: 'Test' });
await manager.delete(session.id);
expect(manager.exists(session.id)).toBe(false);
@@ -387,12 +412,12 @@ describe('SessionManager', () => {
describe('边界情况', () => {
it('处理特殊字符的会话名称', async () => {
const session = await manager.create({ name: '测试会话 <>&"\'`' });
const session = await createTrackedSession({ name: '测试会话 <>&"\'`' });
expect(session.name).toBe('测试会话 <>&"\'`');
});
it('处理长消息内容', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const longContent = 'x'.repeat(10000);
const message = await manager.addMessage(session.id, {
role: 'user',
@@ -403,7 +428,7 @@ describe('SessionManager', () => {
});
it('处理空字符串消息', async () => {
const session = await manager.create({ name: 'Test' });
const session = await createTrackedSession({ name: 'Test' });
const message = await manager.addMessage(session.id, {
role: 'user',
content: '',
@@ -413,8 +438,8 @@ describe('SessionManager', () => {
});
it('多个会话独立的消息', async () => {
const session1 = await manager.create({ name: 'Session 1' });
const session2 = await manager.create({ name: 'Session 2' });
const session1 = await createTrackedSession({ name: 'Session 1' });
const session2 = await createTrackedSession({ name: 'Session 2' });
await manager.addMessage(session1.id, { role: 'user', content: 'Message for session 1' });
await manager.addMessage(session2.id, { role: 'user', content: 'Message for session 2' });