diff --git a/src/stores/imagePreviewStore.test.ts b/src/stores/imagePreviewStore.test.ts index 4b796e479..b9a4ce240 100644 --- a/src/stores/imagePreviewStore.test.ts +++ b/src/stores/imagePreviewStore.test.ts @@ -14,7 +14,9 @@ vi.mock('@/utils/litegraphUtil', () => ({ vi.mock('@/scripts/app', () => ({ app: { - getPreviewFormatParam: vi.fn(() => '&format=test_webp') + getPreviewFormatParam: vi.fn(() => '&format=test_webp'), + nodeOutputs: {} as Record, + nodePreviewImages: {} as Record } })) @@ -29,6 +31,62 @@ const createMockOutputs = ( images?: ExecutedWsMessage['output']['images'] ): ExecutedWsMessage['output'] => ({ images }) +vi.mock('@/stores/executionStore', () => ({ + useExecutionStore: vi.fn(() => ({ + executionIdToNodeLocatorId: vi.fn((id: string) => id) + })) +})) + +vi.mock('@/platform/workflow/management/stores/workflowStore', () => ({ + useWorkflowStore: vi.fn(() => ({ + nodeIdToNodeLocatorId: vi.fn((id: string | number) => String(id)), + nodeToNodeLocatorId: vi.fn((node: { id: number }) => String(node.id)) + })) +})) + +describe('imagePreviewStore setNodeOutputsByExecutionId with merge', () => { + beforeEach(() => { + setActivePinia(createTestingPinia({ stubActions: false })) + vi.clearAllMocks() + app.nodeOutputs = {} + app.nodePreviewImages = {} + }) + + it('should update reactive nodeOutputs.value when merging outputs', () => { + const store = useNodeOutputStore() + const executionId = '1' + + const initialOutput = createMockOutputs([{ filename: 'a.png' }]) + store.setNodeOutputsByExecutionId(executionId, initialOutput) + + expect(app.nodeOutputs[executionId]?.images).toHaveLength(1) + expect(store.nodeOutputs[executionId]?.images).toHaveLength(1) + + const newOutput = createMockOutputs([{ filename: 'b.png' }]) + store.setNodeOutputsByExecutionId(executionId, newOutput, { merge: true }) + + expect(app.nodeOutputs[executionId]?.images).toHaveLength(2) + expect(store.nodeOutputs[executionId]?.images).toHaveLength(2) + }) + + it('should assign to reactive ref after merge for Vue reactivity', () => { + const store = useNodeOutputStore() + const executionId = '1' + + const initialOutput = createMockOutputs([{ filename: 'a.png' }]) + store.setNodeOutputsByExecutionId(executionId, initialOutput) + + const newOutput = createMockOutputs([{ filename: 'b.png' }]) + + store.setNodeOutputsByExecutionId(executionId, newOutput, { merge: true }) + + expect(store.nodeOutputs[executionId]).toStrictEqual( + app.nodeOutputs[executionId] + ) + expect(store.nodeOutputs[executionId]?.images).toHaveLength(2) + }) +}) + describe('imagePreviewStore getPreviewParam', () => { beforeEach(() => { setActivePinia(createTestingPinia({ stubActions: false })) diff --git a/src/stores/imagePreviewStore.ts b/src/stores/imagePreviewStore.ts index db2c9abaa..d2aa2d4e0 100644 --- a/src/stores/imagePreviewStore.ts +++ b/src/stores/imagePreviewStore.ts @@ -148,6 +148,7 @@ export const useNodeOutputStore = defineStore('nodeOutput', () => { existingOutput[k] = newValue } } + nodeOutputs.value[nodeLocatorId] = existingOutput return } }