diff --git a/packages/server/tests/unit/session/manager.test.ts b/packages/server/tests/unit/session/manager.test.ts index 91ac2ee..88a79fe 100644 --- a/packages/server/tests/unit/session/manager.test.ts +++ b/packages/server/tests/unit/session/manager.test.ts @@ -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[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' });