Skip to main content
Glama
resumable.test.ts5.16 kB
/** * 可恢复任务测试 */ import { describe, it, expect, beforeEach, afterEach } from 'vitest'; import { ResumableTaskManager } from '../collaboration/resumable.js'; import { mkdirSync, rmSync, existsSync } from 'node:fs'; import { join } from 'node:path'; import { tmpdir } from 'node:os'; describe('ResumableTaskManager', () => { let manager: ResumableTaskManager; let testDir: string; beforeEach(() => { testDir = join(tmpdir(), `resumable-test-${Date.now()}`); mkdirSync(testDir, { recursive: true }); manager = new ResumableTaskManager(testDir); }); afterEach(() => { if (existsSync(testDir)) { rmSync(testDir, { recursive: true, force: true }); } }); describe('create', () => { it('应该创建可恢复任务', () => { const task = manager.create({ task: '测试任务', experts: [], subtasks: [ { id: 'sub1', expertId: 'exp1', description: '子任务1', dependencies: [], priority: 1 }, ], workflow: 'parallel', needsReview: false, }); expect(task.id).toBeTruthy(); expect(task.status).toBe('pending'); expect(task.subtaskStates['sub1'].status).toBe('pending'); }); }); describe('get', () => { it('应该获取保存的任务', () => { const created = manager.create({ task: '测试任务', experts: [], subtasks: [], workflow: 'sequential', needsReview: false, }); const retrieved = manager.get(created.id); expect(retrieved).not.toBeNull(); expect(retrieved?.task).toBe('测试任务'); }); it('应该返回 null 对于不存在的任务', () => { const result = manager.get('nonexistent'); expect(result).toBeNull(); }); }); describe('pause/resume', () => { it('应该暂停任务', () => { const task = manager.create({ task: '测试', experts: [], subtasks: [], workflow: 'parallel', needsReview: false, }); const paused = manager.pause(task.id, '用户请求'); expect(paused?.status).toBe('paused'); expect(paused?.pauseReason).toBe('用户请求'); }); it('应该恢复任务', () => { const task = manager.create({ task: '测试', experts: [], subtasks: [], workflow: 'parallel', needsReview: false, }); manager.pause(task.id); const resumed = manager.resume(task.id); expect(resumed?.status).toBe('running'); }); }); describe('updateSubtask', () => { it('应该更新子任务状态', () => { const task = manager.create({ task: '测试', experts: [], subtasks: [ { id: 'sub1', expertId: 'exp1', description: '子任务', dependencies: [], priority: 1 }, ], workflow: 'parallel', needsReview: false, }); const updated = manager.updateSubtask(task.id, 'sub1', { status: 'completed', output: { expertId: 'exp1', expertName: '专家1', content: '完成' }, }); expect(updated?.subtaskStates['sub1'].status).toBe('completed'); expect(updated?.completedOutputs.length).toBe(1); }); }); describe('list', () => { it('应该列出所有任务', () => { manager.create({ task: '任务1', experts: [], subtasks: [], workflow: 'parallel', needsReview: false }); manager.create({ task: '任务2', experts: [], subtasks: [], workflow: 'parallel', needsReview: false }); const tasks = manager.list(); expect(tasks.length).toBe(2); }); it('应该按状态过滤', () => { const t1 = manager.create({ task: '任务1', experts: [], subtasks: [], workflow: 'parallel', needsReview: false }); manager.create({ task: '任务2', experts: [], subtasks: [], workflow: 'parallel', needsReview: false }); manager.pause(t1.id); const paused = manager.list('paused'); expect(paused.length).toBe(1); }); }); describe('delete', () => { it('应该删除任务', () => { const task = manager.create({ task: '待删除', experts: [], subtasks: [], workflow: 'parallel', needsReview: false, }); const result = manager.delete(task.id); expect(result).toBe(true); expect(manager.get(task.id)).toBeNull(); }); }); describe('getPendingSubtasks', () => { it('应该返回待执行的子任务', () => { const task = manager.create({ task: '测试', experts: [], subtasks: [ { id: 'sub1', expertId: 'exp1', description: '子任务1', dependencies: [], priority: 1 }, { id: 'sub2', expertId: 'exp2', description: '子任务2', dependencies: [], priority: 2 }, ], workflow: 'parallel', needsReview: false, }); manager.updateSubtask(task.id, 'sub1', { status: 'completed' }); const updated = manager.get(task.id)!; const pending = manager.getPendingSubtasks(updated); expect(pending.length).toBe(1); expect(pending[0].id).toBe('sub2'); }); }); });

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/7836246/claude-team-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server