Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
2.7 kB · 63 lines
JavaScript
at master
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364import { readFile } from 'node:fs/promises';import assert from 'node:assert/strict';import test from 'node:test';import { stripTypeScriptTypes } from 'node:module';
const source = await readFile(new URL('../src/components/spatial/boardSaveQueue.ts', import.meta.url), 'utf8');const outputText = stripTypeScriptTypes(source, { mode: 'transform' });const { BoardSaveQueue } = await import(`data:text/javascript;base64,${Buffer.from(outputText).toString('base64')}`);const tick = () => new Promise(resolve => setImmediate(resolve));
test('serializes edits made while a save is in flight and uses the returned version', async () => { const writes = [], acknowledgements = []; let complete; const queue = new BoardSaveQueue({ version: 1, title: 'initial' }, draft => { writes.push(draft); return new Promise(resolve => { complete = resolve; }); }, () => {}, saved => acknowledgements.push(saved)); queue.update({ version: 1, title: 'first' }); const saving = queue.flush(); assert.equal(queue.flush(), saving); await tick(); queue.update({ version: 1, title: 'second' }); complete({ version: 2, title: 'first' }); await tick(); assert.deepEqual(writes, [{ version: 1, title: 'first' }, { version: 2, title: 'second' }]); assert.equal(queue.value.title, 'second'); complete({ version: 3, title: 'second' }); await saving; assert.equal(queue.dirty, false); assert.equal(queue.saving, false); assert.equal(queue.value.version, 3); assert.equal(acknowledgements.length, 2);});
test('a failed save retains the draft and retries without silently advancing its version', async () => { let fail = true; const queue = new BoardSaveQueue({ version: 7, title: 'initial' }, async draft => { if (fail) throw new Error('offline'); return { ...draft, version: 8 }; }, () => {}, () => {}); queue.update({ version: 7, title: 'unsaved' }); await assert.rejects(queue.flush(), /offline/); assert.equal(queue.dirty, true); assert.equal(queue.saving, false); assert.equal(queue.value.version, 7); assert.equal(queue.value.title, 'unsaved'); fail = false; await queue.flush(); assert.equal(queue.error, null); assert.equal(queue.dirty, false);});
test('clean flushes do not write and synchronous transport errors remain retryable', async () => { let count = 0; const queue = new BoardSaveQueue({ version: 1 }, () => { count++; throw new Error('conflict'); }, () => {}, () => {}); await queue.flush(); assert.equal(count, 0); queue.update({ version: 99 }); await assert.rejects(queue.flush(), /conflict/); assert.equal(queue.value.version, 1); assert.equal(queue.dirty, true); assert.equal(queue.saving, false);});