[Bug] Fix drag link from input to output (#859)

Resolves https://github.com/Comfy-Org/litegraph.js/issues/858
This commit is contained in:
Chenlei Hu
2025-03-26 14:53:30 -04:00
committed by GitHub
parent 808d78169b
commit 6fd6c60b9f
2 changed files with 93 additions and 1 deletions

View File

@@ -45,7 +45,7 @@ export class ToOutputRenderLink implements RenderLink {
connectToOutput(node: LGraphNode, output: INodeOutputSlot, events: LinkConnectorEventTarget) {
const { node: inputNode, fromSlot, fromReroute } = this
if (inputNode) return
if (!inputNode) return
const newLink = node.connectSlots(output, inputNode, fromSlot, fromReroute?.id)
events.dispatch("link-created", newLink)

View File

@@ -0,0 +1,92 @@
import { describe, expect, it, vi } from "vitest"
import { ToOutputRenderLink } from "@/canvas/ToOutputRenderLink"
import { LinkDirection } from "@/types/globalEnums"
describe("ToOutputRenderLink", () => {
describe("connectToOutput", () => {
it("should return early if inputNode is null", () => {
// Setup
const mockNetwork = {}
const mockFromSlot = {}
const mockNode = { id: "test-id", inputs: [mockFromSlot], getInputPos: vi.fn().mockReturnValue([0, 0]) }
const renderLink = new ToOutputRenderLink(
mockNetwork as any,
mockNode as any,
mockFromSlot as any,
undefined,
LinkDirection.CENTER,
)
// Override the node property to simulate null case
Object.defineProperty(renderLink, "node", {
value: null,
})
const mockTargetNode = {
connectSlots: vi.fn(),
}
const mockEvents = {
dispatch: vi.fn(),
}
// Act
renderLink.connectToOutput(
mockTargetNode as any,
{} as any,
mockEvents as any,
)
// Assert
expect(mockTargetNode.connectSlots).not.toHaveBeenCalled()
expect(mockEvents.dispatch).not.toHaveBeenCalled()
})
it("should create connection and dispatch event when inputNode exists", () => {
// Setup
const mockNetwork = {}
const mockFromSlot = {}
const mockNode = {
id: "test-id",
inputs: [mockFromSlot],
getInputPos: vi.fn().mockReturnValue([0, 0]),
}
const renderLink = new ToOutputRenderLink(
mockNetwork as any,
mockNode as any,
mockFromSlot as any,
undefined,
LinkDirection.CENTER,
)
const mockNewLink = { id: "new-link" }
const mockTargetNode = {
connectSlots: vi.fn().mockReturnValue(mockNewLink),
}
const mockEvents = {
dispatch: vi.fn(),
}
// Act
renderLink.connectToOutput(
mockTargetNode as any,
{} as any,
mockEvents as any,
)
// Assert
expect(mockTargetNode.connectSlots).toHaveBeenCalledWith(
expect.anything(),
mockNode,
mockFromSlot,
undefined,
)
expect(mockEvents.dispatch).toHaveBeenCalledWith(
"link-created",
mockNewLink,
)
})
})
})