test: add coverage for isTaskContainer and idleWaiting reset
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -318,6 +318,66 @@ describe('GroupQueue', () => {
|
|||||||
await vi.advanceTimersByTimeAsync(10);
|
await vi.advanceTimersByTimeAsync(10);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('sendMessage resets idleWaiting so a subsequent task enqueue does not preempt', async () => {
|
||||||
|
const fs = await import('fs');
|
||||||
|
let resolveProcess: () => void;
|
||||||
|
|
||||||
|
const processMessages = vi.fn(async () => {
|
||||||
|
await new Promise<void>((resolve) => {
|
||||||
|
resolveProcess = resolve;
|
||||||
|
});
|
||||||
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
|
queue.setProcessMessagesFn(processMessages);
|
||||||
|
queue.enqueueMessageCheck('group1@g.us');
|
||||||
|
await vi.advanceTimersByTimeAsync(10);
|
||||||
|
queue.registerProcess('group1@g.us', {} as any, 'container-1', 'test-group');
|
||||||
|
|
||||||
|
// Container becomes idle
|
||||||
|
queue.notifyIdle('group1@g.us');
|
||||||
|
|
||||||
|
// A new user message arrives — resets idleWaiting
|
||||||
|
queue.sendMessage('group1@g.us', 'hello');
|
||||||
|
|
||||||
|
// Task enqueued after message reset — should NOT preempt (agent is working)
|
||||||
|
const writeFileSync = vi.mocked(fs.default.writeFileSync);
|
||||||
|
writeFileSync.mockClear();
|
||||||
|
|
||||||
|
const taskFn = vi.fn(async () => {});
|
||||||
|
queue.enqueueTask('group1@g.us', 'task-1', taskFn);
|
||||||
|
|
||||||
|
const closeWrites = writeFileSync.mock.calls.filter(
|
||||||
|
(call) => typeof call[0] === 'string' && call[0].endsWith('_close'),
|
||||||
|
);
|
||||||
|
expect(closeWrites).toHaveLength(0);
|
||||||
|
|
||||||
|
resolveProcess!();
|
||||||
|
await vi.advanceTimersByTimeAsync(10);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('sendMessage returns false for task containers so user messages queue up', async () => {
|
||||||
|
let resolveTask: () => void;
|
||||||
|
|
||||||
|
const taskFn = vi.fn(async () => {
|
||||||
|
await new Promise<void>((resolve) => {
|
||||||
|
resolveTask = resolve;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Start a task (sets isTaskContainer = true)
|
||||||
|
queue.enqueueTask('group1@g.us', 'task-1', taskFn);
|
||||||
|
await vi.advanceTimersByTimeAsync(10);
|
||||||
|
queue.registerProcess('group1@g.us', {} as any, 'container-1', 'test-group');
|
||||||
|
|
||||||
|
// sendMessage should return false — user messages must not go to task containers
|
||||||
|
const result = queue.sendMessage('group1@g.us', 'hello');
|
||||||
|
expect(result).toBe(false);
|
||||||
|
|
||||||
|
resolveTask!();
|
||||||
|
await vi.advanceTimersByTimeAsync(10);
|
||||||
|
});
|
||||||
|
|
||||||
it('preempts when idle arrives with pending tasks', async () => {
|
it('preempts when idle arrives with pending tasks', async () => {
|
||||||
const fs = await import('fs');
|
const fs = await import('fs');
|
||||||
let resolveProcess: () => void;
|
let resolveProcess: () => void;
|
||||||
|
|||||||
Reference in New Issue
Block a user