40 lines
1.9 KiB
TypeScript
40 lines
1.9 KiB
TypeScript
import { expect, test } from 'bun:test'
|
|
|
|
import { createEditorStore } from '@/app/editor/session/create'
|
|
|
|
test('pasting a component and instance together remaps their component references', async () => {
|
|
const editor = createEditorStore()
|
|
const page = editor.state.currentPageId
|
|
const component = editor.graph.createNode('COMPONENT', page, { name: 'Master' })
|
|
const child = editor.graph.createNode('RECTANGLE', component.id, { name: 'Master child' })
|
|
const instance = editor.graph.createNode('INSTANCE', page, {
|
|
name: 'Instance',
|
|
componentId: component.id
|
|
})
|
|
const instanceChild = editor.graph.createNode('RECTANGLE', instance.id, {
|
|
name: 'Instance child',
|
|
componentId: child.id
|
|
})
|
|
instance.instanceOverrides.descendants.set(child.id, new Map([['name', 'Overridden']]))
|
|
editor.select([component.id, instance.id])
|
|
const payload = await editor.prepareCopy()
|
|
if (!payload.snapshot) throw new Error('Missing snapshot')
|
|
await editor.pasteSnapshot(payload.snapshot)
|
|
const pasted = [...editor.state.selectedIds].map((id) => editor.graph.getNode(id))
|
|
const master = pasted.find((node) => node?.type === 'COMPONENT')
|
|
const copy = pasted.find((node) => node?.type === 'INSTANCE')
|
|
if (!master || !copy) throw new Error('Missing pasted roots')
|
|
const copiedChild = editor.graph.getNode(copy.childIds[0])
|
|
if (!copiedChild) throw new Error('Missing pasted child')
|
|
const masterChildId = master.childIds[0]
|
|
expect(copy.componentId).toBe(master.id)
|
|
expect(copiedChild.id).not.toBe(instanceChild.id)
|
|
expect(copiedChild.componentId).toBe(masterChildId)
|
|
expect(copy.instanceOverrides.descendants.has(masterChildId)).toBe(true)
|
|
editor.undo.undo()
|
|
expect(editor.graph.getNode(copy.id)).toBeUndefined()
|
|
editor.undo.redo()
|
|
expect(editor.graph.getNode(copy.id)?.componentId).toBe(master.id)
|
|
expect(editor.graph.getNode(copiedChild.id)?.componentId).toBe(masterChildId)
|
|
})
|