56 lines
1.7 KiB
JavaScript
56 lines
1.7 KiB
JavaScript
import { test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { JobQueue } from '../src/jobQueue.js';
|
|
import { createLogger } from '../src/logger.js';
|
|
|
|
const silentLogger = createLogger({}).child({});
|
|
// Silence output for these tests by pointing at a level above error.
|
|
process.env.LOG_LEVEL = 'error';
|
|
|
|
test('runs the job for a fresh key', async () => {
|
|
const queue = new JobQueue(silentLogger);
|
|
let ran = false;
|
|
await queue.runExclusive('a', async () => {
|
|
ran = true;
|
|
});
|
|
assert.equal(ran, true);
|
|
assert.equal(queue.isRunning('a'), false);
|
|
});
|
|
|
|
test('skips a second call for the same key while the first is running', async () => {
|
|
const queue = new JobQueue(silentLogger);
|
|
let resolveFirst;
|
|
const first = queue.runExclusive('a', () => new Promise((r) => (resolveFirst = r)));
|
|
|
|
assert.equal(queue.isRunning('a'), true);
|
|
let secondRan = false;
|
|
await queue.runExclusive('a', async () => {
|
|
secondRan = true;
|
|
});
|
|
assert.equal(secondRan, false);
|
|
|
|
resolveFirst();
|
|
await first;
|
|
assert.equal(queue.isRunning('a'), false);
|
|
});
|
|
|
|
test('different keys run independently', async () => {
|
|
const queue = new JobQueue(silentLogger);
|
|
const order = [];
|
|
let resolveA;
|
|
const a = queue.runExclusive('a', () => new Promise((r) => (resolveA = r))).then(() => order.push('a'));
|
|
const b = queue.runExclusive('b', async () => order.push('b'));
|
|
await b;
|
|
resolveA();
|
|
await a;
|
|
assert.deepEqual(order, ['b', 'a']);
|
|
});
|
|
|
|
test('clears the running key even when the job throws', async () => {
|
|
const queue = new JobQueue(silentLogger);
|
|
await queue.runExclusive('a', async () => {
|
|
throw new Error('boom');
|
|
});
|
|
assert.equal(queue.isRunning('a'), false);
|
|
});
|