89 lines
2.5 KiB
TypeScript
89 lines
2.5 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest'
|
|
import { TLDRAW_BLOCK_TYPE } from '../utils/tldrawMarkdown'
|
|
import {
|
|
updateTldrawBlockPropsSafely,
|
|
type TldrawBlockMutationEditor,
|
|
} from './tldrawBlockProps'
|
|
|
|
function tldrawBlock(props: {
|
|
boardId?: string
|
|
height?: string
|
|
id?: string
|
|
snapshot?: string
|
|
width?: string
|
|
}) {
|
|
return {
|
|
id: props.id ?? 'whiteboard-block',
|
|
props: {
|
|
boardId: props.boardId ?? 'planning-map',
|
|
height: props.height ?? '520',
|
|
snapshot: props.snapshot ?? '{}',
|
|
width: props.width ?? '',
|
|
},
|
|
type: TLDRAW_BLOCK_TYPE,
|
|
}
|
|
}
|
|
|
|
describe('tldraw block prop updates', () => {
|
|
it('ignores whiteboard callbacks after the owning BlockNote block disappears', () => {
|
|
const editor: TldrawBlockMutationEditor = {
|
|
getBlock: vi.fn(() => undefined),
|
|
updateBlock: vi.fn(),
|
|
}
|
|
|
|
expect(updateTldrawBlockPropsSafely({
|
|
blockId: 'whiteboard-block',
|
|
editor,
|
|
nextProps: (props) => ({ ...props, snapshot: '{ "store": {} }' }),
|
|
})).toBe(false)
|
|
expect(editor.updateBlock).not.toHaveBeenCalled()
|
|
})
|
|
|
|
it('resolves live whiteboard props before writing a debounced snapshot', () => {
|
|
const editor: TldrawBlockMutationEditor = {
|
|
getBlock: vi.fn(() => tldrawBlock({
|
|
boardId: 'fresh-board',
|
|
height: '640',
|
|
snapshot: '{ "store": "old" }',
|
|
width: '900',
|
|
})),
|
|
updateBlock: vi.fn(),
|
|
}
|
|
|
|
expect(updateTldrawBlockPropsSafely({
|
|
blockId: 'whiteboard-block',
|
|
editor,
|
|
nextProps: (props) => ({ ...props, snapshot: '{ "store": "next" }' }),
|
|
})).toBe(true)
|
|
expect(editor.updateBlock).toHaveBeenCalledWith('whiteboard-block', {
|
|
props: {
|
|
boardId: 'fresh-board',
|
|
height: '640',
|
|
snapshot: '{ "store": "next" }',
|
|
width: '900',
|
|
},
|
|
type: TLDRAW_BLOCK_TYPE,
|
|
})
|
|
})
|
|
|
|
it('turns a final missing-block race into a no-op', () => {
|
|
const missingBlockError = new Error('Block with ID whiteboard-block not found')
|
|
const warn = vi.spyOn(console, 'warn').mockImplementation(() => undefined)
|
|
const editor: TldrawBlockMutationEditor = {
|
|
getBlock: vi.fn(() => tldrawBlock({})),
|
|
updateBlock: vi.fn(() => {
|
|
throw missingBlockError
|
|
}),
|
|
}
|
|
|
|
expect(updateTldrawBlockPropsSafely({
|
|
blockId: 'whiteboard-block',
|
|
editor,
|
|
nextProps: (props) => ({ ...props, height: '720' }),
|
|
})).toBe(false)
|
|
expect(warn).toHaveBeenCalledWith('[editor] Ignored stale whiteboard block update:', missingBlockError)
|
|
|
|
warn.mockRestore()
|
|
})
|
|
})
|