import test from 'node:test'; import assert from 'node:assert/strict'; import { startOutreachScheduler } from '../src/outreach/scheduler.mjs'; test('scheduler nao sobrepoe ciclos', async () => { let active = 0; let maxActive = 0; let release; const gate = new Promise((resolve) => { release = resolve; }); const timers = []; const stop = startOutreachScheduler({ db: {}, whatsapp: {}, runBatch: async () => { active += 1; maxActive = Math.max(maxActive, active); await gate; active -= 1; }, setTimeoutFn: (fn) => { timers.push(fn); return { unref() {} }; }, setIntervalFn: (fn) => { timers.push(fn); return { unref() {} }; }, clearTimeoutFn: () => {}, clearIntervalFn: () => {} }); timers[0](); timers[1](); await new Promise((resolve) => setTimeout(resolve, 1)); assert.equal(maxActive, 1); release(); await stop(); }); test('stop aborta e aguarda o ciclo ativo', async () => { let release; let started; const gate = new Promise((resolve) => { release = resolve; }); const active = new Promise((resolve) => { started = resolve; }); const timers = []; let receivedSignal; const stop = startOutreachScheduler({ db: {}, whatsapp: {}, runBatch: async ({ signal }) => { receivedSignal = signal; started(); await gate; }, setTimeoutFn: (fn) => { timers.push(fn); return { unref() {} }; }, setIntervalFn: (fn) => { timers.push(fn); return { unref() {} }; }, clearTimeoutFn: () => {}, clearIntervalFn: () => {} }); timers[0](); await active; let stopped = false; const stopping = stop().then(() => { stopped = true; }); await new Promise((resolve) => setTimeout(resolve, 1)); assert.equal(receivedSignal.aborted, true); assert.equal(stopped, false); release(); await stopping; assert.equal(stopped, true); }); test('scheduler consulta a fila a cada 60 segundos', async () => { const intervals = []; const stop = startOutreachScheduler({ db: {}, whatsapp: {}, runBatch: async () => {}, setTimeoutFn: () => ({ unref() {} }), setIntervalFn: (_fn, ms) => { intervals.push(ms); return { unref() {} }; }, clearTimeoutFn: () => {}, clearIntervalFn: () => {} }); assert.deepEqual(intervals, [60_000]); await stop(); });