updated
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user