Files
claude-hook/test/jobQueue.test.js
T
2026-09-28 16:15:50 +02:00

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);
});