- Match documents by desktop path or File System Access handle - Share concurrent duplicate loads while allowing unrelated files to load in parallel - Publish source identity only after successful opens and saves Co-authored-by: Joseph Cumines <joeycumines@gmail.com>
65 lines
1.9 KiB
TypeScript
65 lines
1.9 KiB
TypeScript
import { describe, expect, test, vi } from 'bun:test'
|
|
|
|
import { createDefaultEditorState } from '@open-pencil/core/editor'
|
|
|
|
import { createSaveActions } from '@/app/document/io/save'
|
|
|
|
function makeWritableHandle(name: string): FileSystemFileHandle {
|
|
return {
|
|
kind: 'file',
|
|
name,
|
|
createWritable: vi.fn(async () => ({
|
|
write: vi.fn(async () => undefined),
|
|
close: vi.fn(async () => undefined)
|
|
}))
|
|
} as FileSystemFileHandle
|
|
}
|
|
|
|
function createSaveHarness(handle: FileSystemFileHandle) {
|
|
const state = {
|
|
...createDefaultEditorState('page'),
|
|
documentName: 'Untitled'
|
|
}
|
|
const setSourceIdentity = vi.fn()
|
|
const actions = createSaveActions({
|
|
state,
|
|
buildFigFile: () => new Uint8Array([1, 2, 3]),
|
|
getFilePath: () => null,
|
|
setFilePath: vi.fn(),
|
|
getFileHandle: () => handle,
|
|
setFileHandle: vi.fn(),
|
|
getDownloadName: () => null,
|
|
setDownloadName: vi.fn(),
|
|
setSourceIdentity,
|
|
setSavedVersion: vi.fn(),
|
|
setLastWriteTime: vi.fn(),
|
|
startWatchingFile: vi.fn()
|
|
})
|
|
return { actions, setSourceIdentity }
|
|
}
|
|
|
|
describe('saved document identity', () => {
|
|
test('publishes the writable handle after a successful save', async () => {
|
|
const handle = makeWritableHandle('saved.fig')
|
|
const { actions, setSourceIdentity } = createSaveHarness(handle)
|
|
|
|
await actions.saveFigFile()
|
|
|
|
expect(setSourceIdentity).toHaveBeenCalledWith({ handle, path: null })
|
|
})
|
|
|
|
test('does not publish an identity when writing fails', async () => {
|
|
const handle = {
|
|
kind: 'file',
|
|
name: 'failed.fig',
|
|
createWritable: vi.fn(async () => {
|
|
throw new Error('write failed')
|
|
})
|
|
} as FileSystemFileHandle
|
|
const { actions, setSourceIdentity } = createSaveHarness(handle)
|
|
|
|
await expect(actions.saveFigFile()).rejects.toThrow('write failed')
|
|
expect(setSourceIdentity).not.toHaveBeenCalled()
|
|
})
|
|
})
|