diff --git a/src/canvas/ToOutputRenderLink.ts b/src/canvas/ToOutputRenderLink.ts index 061fb6aec..8130a75f3 100644 --- a/src/canvas/ToOutputRenderLink.ts +++ b/src/canvas/ToOutputRenderLink.ts @@ -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) diff --git a/test/ToOutputRenderLink.test.ts b/test/ToOutputRenderLink.test.ts new file mode 100644 index 000000000..e6ff8eb26 --- /dev/null +++ b/test/ToOutputRenderLink.test.ts @@ -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, + ) + }) + }) +})