Files
bitvid/tests/storage-tombstone-buffer.test.mjs
T

47 lines
2.8 KiB
JavaScript

import test from 'node:test';
import assert from 'node:assert/strict';
import { tombstoneFixture, videoEvent, ids } from './test-helpers/storage-tombstone-fixture.mjs';
// Scenarios and deterministic IO boundaries: docs/testing/storage-cors-3-integrity.md.
for (const order of ['newer-first', 'delete-first', 'same-batch']) {
test(`buffer preserves strictly newer active content: ${order}`, async t => {
const f = tombstoneFixture(t); await f.load();
const newer = videoEvent('newer', 300);
const deletion = videoEvent('deletion', 200, { deleted: true });
if (order === 'same-batch') await f.ingest(newer, deletion);
else if (order === 'newer-first') { await f.ingest(newer); await f.ingest(deletion); }
else { await f.ingest(deletion); await f.ingest(newer); }
await f.ingest(videoEvent('unrelated', 100, { root: 'other', pubkey: 'b'.repeat(64) }));
assert.deepEqual(ids(f.client.getActiveVideos()), ['newer', 'unrelated']);
assert.equal(f.client.allEvents.get('newer').deleted, false);
assert.equal(f.client.tombstones.get('ROOT:target'), 200);
// Replayed markers must not erase a newer version either.
await f.ingest(deletion);
assert.deepEqual(ids(f.client.getActiveVideos()), ['newer', 'unrelated']);
});
}
test('newer/equal tombstone removes older versions, late zombies stay absent, newer content may return', async t => {
const f = tombstoneFixture(t); await f.load();
await f.ingest(videoEvent('first', 100), videoEvent('edit', 150), videoEvent('other', 100, { root: 'other' }));
await f.ingest(videoEvent('delete', 150, { deleted: true }));
assert.deepEqual(ids(f.client.getActiveVideos()), ['other']);
assert.equal(f.client.allEvents.get('first').deleted, true);
assert.equal(f.client.allEvents.get('edit').deleted, true);
await f.ingest(videoEvent('late', 120));
assert.equal(f.client.allEvents.get('late').deleted, true);
assert.deepEqual(ids(f.client.getActiveVideos()), ['other']);
await f.ingest(videoEvent('fresh', 151));
assert.deepEqual(ids(f.client.getActiveVideos()), ['fresh', 'other']);
});
test('legacy d-tag tombstones retain authoritative author scoping', async t => {
const f = tombstoneFixture(t); await f.load();
await f.ingest(videoEvent('target-legacy', 100, { root: `LEGACY:${'a'.repeat(64)}:same`, dTag: 'same' }), videoEvent('other-author', 100, { root: `LEGACY:${'b'.repeat(64)}:same`, dTag: 'same', pubkey: 'b'.repeat(64) }));
await f.ingest(videoEvent('delete-legacy', 200, { root: `LEGACY:${'a'.repeat(64)}:same`, dTag: 'same', deleted: true }));
assert.deepEqual(ids(f.client.getActiveVideos()), ['other-author']);
await f.ingest(videoEvent('target-late', 90, { root: `LEGACY:${'a'.repeat(64)}:same`, dTag: 'same' }));
assert.deepEqual(ids(f.client.getActiveVideos()), ['other-author']);
assert.equal(f.client.allEvents.get('target-late').deleted, true);
});