diff --git a/src/lib/litegraph/src/canvas/ToInputFromIoNodeLink.ts b/src/lib/litegraph/src/canvas/ToInputFromIoNodeLink.ts index e98c59d87a..073c777f1f 100644 --- a/src/lib/litegraph/src/canvas/ToInputFromIoNodeLink.ts +++ b/src/lib/litegraph/src/canvas/ToInputFromIoNodeLink.ts @@ -63,6 +63,9 @@ export class ToInputFromIoNodeLink implements RenderLink { if (existingLink) { // Moving an existing link + const { input, inputNode } = existingLink.resolve(this.network) + if (inputNode && input) + this.node._disconnectNodeInput(inputNode, input, existingLink) events.dispatch('input-moved', this) } else { // Creating a new link diff --git a/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts b/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts index 9570765261..072a0fb4c3 100644 --- a/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts +++ b/tests-ui/tests/litegraph/canvas/LinkConnectorSubgraphInputValidation.test.ts @@ -1,15 +1,20 @@ // TODO: Fix these tests after migration import { beforeEach, describe, expect, it, vi } from 'vitest' -import { LinkConnector } from '@/lib/litegraph/src/litegraph' -import { MovingOutputLink } from '@/lib/litegraph/src/litegraph' -import { ToOutputRenderLink } from '@/lib/litegraph/src/litegraph' -import { LGraphNode, LLink } from '@/lib/litegraph/src/litegraph' +import { + LinkConnector, + MovingOutputLink, + ToOutputRenderLink, + LGraphNode, + LLink +} from '@/lib/litegraph/src/litegraph' +import { ToInputFromIoNodeLink } from '@/lib/litegraph/src/canvas/ToInputFromIoNodeLink' import type { NodeInputSlot } from '@/lib/litegraph/src/litegraph' +import { LinkDirection } from '@/lib/litegraph/src/types/globalEnums' import { createTestSubgraph } from '../subgraph/fixtures/subgraphHelpers' -describe.skip('LinkConnector SubgraphInput connection validation', () => { +describe('LinkConnector SubgraphInput connection validation', () => { let connector: LinkConnector const mockSetConnectingLinks = vi.fn() @@ -17,8 +22,50 @@ describe.skip('LinkConnector SubgraphInput connection validation', () => { connector = new LinkConnector(mockSetConnectingLinks) vi.clearAllMocks() }) + describe('Link disconnection validation', () => { + it('should properly cleanup a moved input link', () => { + const subgraph = createTestSubgraph({ + inputs: [{ name: 'number_input', type: 'number' }] + }) + + const fromTargetNode = new LGraphNode('TargetNode') + fromTargetNode.addInput('number_in', 'number') + subgraph.add(fromTargetNode) + + const toTargetNode = new LGraphNode('TargetNode') + toTargetNode.addInput('number_in', 'number') + subgraph.add(toTargetNode) + + const startLink = subgraph.inputNode.slots[0].connect( + fromTargetNode.inputs[0], + fromTargetNode + ) + + fromTargetNode.onConnectionsChange = vi.fn() + toTargetNode.onConnectionsChange = vi.fn() + + const renderLink = new ToInputFromIoNodeLink( + subgraph, + subgraph.inputNode, + subgraph.inputNode.slots[0], + undefined, + LinkDirection.CENTER, + startLink + ) + renderLink.connectToInput( + toTargetNode, + toTargetNode.inputs[0], + connector.events + ) + + expect(fromTargetNode.inputs[0].link).toBeNull() + expect(toTargetNode.inputs[0].link).not.toBeNull() + expect(toTargetNode.onConnectionsChange).toHaveBeenCalledTimes(1) + expect(fromTargetNode.onConnectionsChange).toHaveBeenCalledTimes(1) + }) + }) - describe.skip('MovingOutputLink validation', () => { + describe('MovingOutputLink validation', () => { it('should implement canConnectToSubgraphInput method', () => { const subgraph = createTestSubgraph({ inputs: [{ name: 'number_input', type: 'number' }] @@ -113,7 +160,7 @@ describe.skip('LinkConnector SubgraphInput connection validation', () => { }) }) - describe.skip('ToOutputRenderLink validation', () => { + describe('ToOutputRenderLink validation', () => { it('should implement canConnectToSubgraphInput method', () => { // Create a minimal valid setup const subgraph = createTestSubgraph() @@ -130,7 +177,7 @@ describe.skip('LinkConnector SubgraphInput connection validation', () => { }) }) - describe.skip('dropOnIoNode validation', () => { + describe('dropOnIoNode validation', () => { it('should prevent invalid connections when dropping on SubgraphInputNode', () => { const subgraph = createTestSubgraph({ inputs: [{ name: 'number_input', type: 'number' }] @@ -232,7 +279,7 @@ describe.skip('LinkConnector SubgraphInput connection validation', () => { }) }) - describe.skip('isSubgraphInputValidDrop', () => { + describe('isSubgraphInputValidDrop', () => { it('should check if render links can connect to SubgraphInput', () => { const subgraph = createTestSubgraph({ inputs: [{ name: 'number_input', type: 'number' }]