27 lines
1.1 KiB
JavaScript
27 lines
1.1 KiB
JavaScript
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
import { mkdtempSync, rmSync, mkdirSync } from 'node:fs';
|
|
import { tmpdir } from 'node:os';
|
|
import { join } from 'node:path';
|
|
import { acquireThemeLock, isThemeLocked } from './secretary-lock.mjs';
|
|
|
|
let dir;
|
|
beforeEach(() => { dir = mkdtempSync(join(tmpdir(), 'seclock-')); mkdirSync(join(dir, '_worker'), { recursive: true }); });
|
|
afterEach(() => { rmSync(dir, { recursive: true, force: true }); });
|
|
|
|
describe('secretary-lock', () => {
|
|
it('first acquire succeeds and returns a release fn; second acquire fails while held', async () => {
|
|
const release = await acquireThemeLock(dir);
|
|
expect(typeof release).toBe('function');
|
|
expect(await isThemeLocked(dir)).toBe(true);
|
|
await expect(acquireThemeLock(dir)).rejects.toBeTruthy();
|
|
await release();
|
|
expect(await isThemeLocked(dir)).toBe(false);
|
|
});
|
|
it('acquire returns null instead of throwing when graceful:true and already held', async () => {
|
|
const release = await acquireThemeLock(dir);
|
|
const second = await acquireThemeLock(dir, { graceful: true });
|
|
expect(second).toBe(null);
|
|
await release();
|
|
});
|
|
});
|