P2/P5: coordinate tabs and render feature preview
This commit is contained in:
@@ -3,7 +3,7 @@ import assert from 'node:assert/strict'
|
||||
import { strToU8, zipSync } from 'fflate'
|
||||
import { createMockFacade } from '../src/facade/mockFacade'
|
||||
import { PROJECT_SCHEMA_MIGRATIONS, PROJECT_SCHEMA_SQL, PROJECT_SCHEMA_VERSION } from '../src/facade/projectSchema'
|
||||
import { PersistenceWriteQueue, ProjectAutosaveScheduler } from '../src/facade/projectStore'
|
||||
import { createSqliteProjectPersistence, PersistenceWriteQueue, ProjectAutosaveScheduler } from '../src/facade/projectStore'
|
||||
import { DependencyGraph } from '../src/facade/dependencyGraph'
|
||||
import { evaluateQuantityExpression, quantityFromNumber } from '../src/facade/units'
|
||||
import { createEdgeSubshapeRefs, createSubshapeRefs, createVertexSubshapeRefs, matchSubshapes, signatureForEdge, signatureForFace, signatureForVertex } from '../src/facade/topologyNaming'
|
||||
@@ -376,6 +376,27 @@ test('persistence writes are serialized and continue after a failed write', asyn
|
||||
assert.equal(results[2].status, 'fulfilled')
|
||||
})
|
||||
|
||||
test('project persistence broadcasts saved document versions across clients', async () => {
|
||||
const writer = createSqliteProjectPersistence()
|
||||
const observer = createSqliteProjectPersistence()
|
||||
const notice = new Promise<{ documentId: string; documentVersion: number }>((resolve, reject) => {
|
||||
const timer = setTimeout(() => reject(new Error('Expected cross-tab save notice.')), 250)
|
||||
const unsubscribe = observer.subscribeExternalChanges((change) => {
|
||||
clearTimeout(timer)
|
||||
unsubscribe()
|
||||
resolve(change)
|
||||
})
|
||||
})
|
||||
const document = recomputeDocumentFixture()
|
||||
const saved = await writer.save(document)
|
||||
assert.equal(writer.capabilities().crossTabWriteLock, 'local-queue')
|
||||
const received = await notice
|
||||
assert.equal(received.documentId, saved.documentId)
|
||||
assert.equal(received.documentVersion, saved.documentVersion)
|
||||
await writer.dispose()
|
||||
await observer.dispose()
|
||||
})
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user