mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-01-27 03:19:56 +00:00
Creating a copy with spread resulted in a copy which was not reactive. Solves a bug where all widgets on a node in vue mode would cease to be reactive after any connection is made to the node. ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-7802-Fix-reactivity-washing-in-refreshNodeSlots-2d96d73d3650819e842ff46030bebfa1) by [Unito](https://www.unito.io) --------- Co-authored-by: Alexander Brown <drjkl@comfy.org>
50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { setActivePinia } from 'pinia'
|
|
import { createTestingPinia } from '@pinia/testing'
|
|
import { describe, expect, it, vi } from 'vitest'
|
|
import { nextTick, watch } from 'vue'
|
|
|
|
import { useGraphNodeManager } from '@/composables/graph/useGraphNodeManager'
|
|
import { LGraph, LGraphNode } from '@/lib/litegraph/src/litegraph'
|
|
import { NodeSlotType } from '@/lib/litegraph/src/types/globalEnums'
|
|
|
|
setActivePinia(createTestingPinia())
|
|
|
|
function createTestGraph() {
|
|
const graph = new LGraph()
|
|
const node = new LGraphNode('test')
|
|
node.addInput('input', 'INT')
|
|
node.addWidget('number', 'testnum', 2, () => undefined, {})
|
|
graph.add(node)
|
|
|
|
const { vueNodeData } = useGraphNodeManager(graph)
|
|
const onReactivityUpdate = vi.fn()
|
|
watch(vueNodeData, onReactivityUpdate)
|
|
|
|
return [node, graph, onReactivityUpdate] as const
|
|
}
|
|
|
|
describe('Node Reactivity', () => {
|
|
it('should trigger on callback', async () => {
|
|
const [node, , onReactivityUpdate] = createTestGraph()
|
|
|
|
node.widgets![0].callback!(2)
|
|
await nextTick()
|
|
expect(onReactivityUpdate).toHaveBeenCalledTimes(1)
|
|
})
|
|
|
|
it('should remain reactive after a connection is made', async () => {
|
|
const [node, graph, onReactivityUpdate] = createTestGraph()
|
|
|
|
graph.trigger('node:slot-links:changed', {
|
|
nodeId: '1',
|
|
slotType: NodeSlotType.INPUT
|
|
})
|
|
await nextTick()
|
|
onReactivityUpdate.mockClear()
|
|
|
|
node.widgets![0].callback!(2)
|
|
await nextTick()
|
|
expect(onReactivityUpdate).toHaveBeenCalledTimes(1)
|
|
})
|
|
})
|