Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> git-subtree-dir: maquina-comercial-pessoal git-subtree-mainline:f5af038e19git-subtree-split:a9ef4d776d
71 lines
2.2 KiB
JavaScript
71 lines
2.2 KiB
JavaScript
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();
|
|
});
|