From 9d6313fed685a3fdbbc4f7a5d3dcafc0efca2d51 Mon Sep 17 00:00:00 2001 From: Connor Byrne Date: Wed, 13 May 2026 13:54:10 -0700 Subject: [PATCH] test: add non-error path tests for QueueSelectedOutputNodes and GroupSelectedNodes - Add test for successful queue of selected output nodes - Add test for successful group creation with selected items - Add required mocks for filterOutputNodes, getExecutionIdsForSelectedNodes, and LGraphGroup Addresses review feedback: https://github.com/Comfy-Org/ComfyUI_frontend/pull/11148#discussion_r3187402906 https://github.com/Comfy-Org/ComfyUI_frontend/pull/11148#discussion_r3187405105 --- src/composables/useCoreCommands.test.ts | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/composables/useCoreCommands.test.ts b/src/composables/useCoreCommands.test.ts index 785ebd26c5..f97e922e83 100644 --- a/src/composables/useCoreCommands.test.ts +++ b/src/composables/useCoreCommands.test.ts @@ -273,6 +273,46 @@ vi.mock('@/platform/support/config', () => ({ buildSupportUrl: vi.fn(() => 'https://support.test.com') })) +const mockFilterOutputNodes = vi.hoisted(() => vi.fn((): LGraphNode[] => [])) +vi.mock('@/utils/nodeFilterUtil', () => ({ + filterOutputNodes: mockFilterOutputNodes +})) + +const mockGetExecutionIdsForSelectedNodes = vi.hoisted(() => + vi.fn((): number[] => []) +) +const mockGetAllNonIoNodesInSubgraph = vi.hoisted(() => + vi.fn((): LGraphNode[] => []) +) +vi.mock('@/utils/graphTraversalUtil', () => ({ + getAllNonIoNodesInSubgraph: mockGetAllNonIoNodesInSubgraph, + getExecutionIdsForSelectedNodes: mockGetExecutionIdsForSelectedNodes +})) + +vi.mock('@/stores/queueStore', () => ({ + useQueueSettingsStore: vi.fn(() => ({ batchCount: 1 })), + useQueueStore: vi.fn(() => ({})), + useQueueUIStore: vi.fn(() => ({})) +})) + +const mockLGraphGroupInstance = vi.hoisted(() => ({ + resizeTo: vi.fn(), + recomputeInsideNodes: vi.fn() +})) +const MockLGraphGroup = vi.hoisted( + () => + function (this: typeof mockLGraphGroupInstance) { + Object.assign(this, mockLGraphGroupInstance) + } +) +vi.mock('@/lib/litegraph/src/litegraph', async () => { + const actual = await vi.importActual('@/lib/litegraph/src/litegraph') + return { + ...actual, + LGraphGroup: MockLGraphGroup + } +}) + describe('useCoreCommands', () => { const createMockNode = (id: number, comfyClass: string): LGraphNode => { const baseNode = createMockLGraphNode({ id }) @@ -397,6 +437,10 @@ describe('useCoreCommands', () => { it('should preserve input/output nodes when clearing subgraph', async () => { app.canvas.subgraph = mockSubgraph + mockGetAllNonIoNodesInSubgraph.mockReturnValue([ + mockSubgraph.nodes[2], + mockSubgraph.nodes[3] + ]) await findCommand('Comfy.ClearWorkflow').function() @@ -599,6 +643,18 @@ describe('useCoreCommands', () => { ) expect(app.queuePrompt).not.toHaveBeenCalled() }) + + it('should queue selected output nodes when valid selection exists', async () => { + const mockNode = createMockLGraphNode({ id: 1 }) + mockSelectedItems.getSelectedNodes.mockReturnValue([mockNode]) + mockFilterOutputNodes.mockReturnValue([mockNode]) + mockGetExecutionIdsForSelectedNodes.mockReturnValue([1]) + + await findCommand('Comfy.QueueSelectedOutputNodes').function() + + expect(app.queuePrompt).toHaveBeenCalledWith(0, 1, [1]) + expect(mockTelemetry.trackWorkflowExecution).toHaveBeenCalled() + }) }) describe('MoveSelectedNodes commands', () => { @@ -915,6 +971,18 @@ describe('useCoreCommands', () => { expect.objectContaining({ severity: 'error' }) ) }) + + it('should create group when items are selected', async () => { + const mockNode = createMockLGraphNode({ id: 1 }) + app.canvas.selectedItems = new Set([ + mockNode + ]) as typeof app.canvas.selectedItems + + await findCommand('Comfy.Graph.GroupSelectedNodes').function() + + expect(mockLGraphGroupInstance.resizeTo).toHaveBeenCalled() + expect(app.canvas.graph!.add).toHaveBeenCalled() + }) }) describe('ConvertToSubgraph command', () => {