P2-04: coalesce facade autosaves
This commit is contained in:
@@ -2,7 +2,7 @@ import { test } from 'node:test'
|
||||
import assert from 'node:assert/strict'
|
||||
import { createMockFacade } from '../src/facade/mockFacade'
|
||||
import { PROJECT_SCHEMA_MIGRATIONS, PROJECT_SCHEMA_SQL, PROJECT_SCHEMA_VERSION } from '../src/facade/projectSchema'
|
||||
import { PersistenceWriteQueue } from '../src/facade/projectStore'
|
||||
import { PersistenceWriteQueue, ProjectAutosaveScheduler } from '../src/facade/projectStore'
|
||||
|
||||
test('facade exposes a stable initial document projection', () => {
|
||||
const facade = createMockFacade()
|
||||
@@ -42,6 +42,20 @@ test('persistence writes are serialized and continue after a failed write', asyn
|
||||
assert.equal(results[2].status, 'fulfilled')
|
||||
})
|
||||
|
||||
test('autosave scheduler coalesces idle document changes and flushes the latest version', async () => {
|
||||
const savedVersions: number[] = []
|
||||
const scheduler = new ProjectAutosaveScheduler(async (document) => { savedVersions.push(document.version); return { documentId: document.id, documentVersion: document.version, persistedAt: Date.now(), mode: 'sqlite-memory' } }, 5)
|
||||
const document = (version: number) => ({ id: 'doc', label: 'Autosave', version, dirty: true, readOnly: false, units: 'mm', tree: [] })
|
||||
scheduler.schedule(document(1))
|
||||
scheduler.schedule(document(2))
|
||||
await new Promise((resolve) => setTimeout(resolve, 15))
|
||||
assert.deepEqual(savedVersions, [2])
|
||||
scheduler.schedule(document(3))
|
||||
const result = await scheduler.flush()
|
||||
assert.equal(result?.documentVersion, 3)
|
||||
scheduler.cancel()
|
||||
})
|
||||
|
||||
test('workbench and selection changes are event driven', () => {
|
||||
const facade = createMockFacade()
|
||||
const events: string[] = []
|
||||
|
||||
Reference in New Issue
Block a user