DodoTransfer/tests/unit/db-remove.test.js
2026-11-05 10:28:10 +09:00

67 lines
2.1 KiB
JavaScript

'use strict';
const { test } = require('node:test');
const assert = require('node:assert');
const fs = require('fs');
const path = require('path');
const os = require('os');
const Store = require('../../lib/store');
const DB = require('../../lib/db');
const KEY_A = '00000000-0000-4000-8000-00000000000a';
const KEY_B = '00000000-0000-4000-8000-00000000000b';
function setup() {
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'psi-db-'));
const db = new DB(dir, new Store(dir));
db.init();
fs.mkdirSync(path.join(dir, 'bucket'));
for (const key of [KEY_A, KEY_B]) {
fs.writeFileSync(path.join(dir, 'bucket', key), 'x');
fs.writeFileSync(path.join(dir, 'bucket', `${ key }.json`), '{}');
db.add('bucket', key, { metadata: { sid: 'bucket', key } });
}
return { dir, db };
}
test('concurrent remove of the same file neither throws nor removes other files', async () => {
const { dir, db } = setup();
try {
await Promise.all([db.remove('bucket', KEY_A), db.remove('bucket', KEY_A)]);
assert.deepStrictEqual(db.get('bucket').map(f => f.key), [KEY_B]);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});
test('remove tolerates an already deleted bucket', async () => {
const { dir, db } = setup();
try {
await Promise.all([
db.remove('bucket', KEY_A),
db.remove('bucket', KEY_B),
db.remove('bucket', KEY_B),
]);
assert.strictEqual(db.get('bucket'), undefined);
await db.remove('bucket', KEY_A);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});
test('claim is exclusive until released', () => {
const { dir, db } = setup();
try {
assert.strictEqual(db.claim('bucket', KEY_A), true);
assert.strictEqual(db.claim('bucket', KEY_A), false);
assert.strictEqual(db.isClaimed('bucket', KEY_A), true);
db.release('bucket', KEY_A);
assert.strictEqual(db.claim('bucket', KEY_A), true);
assert.strictEqual(db.claim('bucket', 'unknown'), false);
assert.strictEqual(db.claim('nobucket', KEY_A), false);
} finally {
fs.rmSync(dir, { recursive: true, force: true });
}
});