openpencil/tests/engine/app/document/io/source-identity.test.ts
Danila Poyarkov f6e446a789
fix(app): reuse tabs for repeated file opens (#423)
- 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>
2026-07-26 00:22:36 +03:00

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()
})
})