diff --git a/src/group-queue.test.ts b/src/group-queue.test.ts index f236b22..75ef506 100644 --- a/src/group-queue.test.ts +++ b/src/group-queue.test.ts @@ -318,6 +318,66 @@ describe('GroupQueue', () => { 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((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((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 () => { const fs = await import('fs'); let resolveProcess: () => void;