From ed93beaeefd79c9d32668fa65ee83aa31d7f9cca Mon Sep 17 00:00:00 2001 From: DrJKL Date: Tue, 12 May 2026 20:40:56 -0700 Subject: [PATCH] test(usePromotedPreviews): clean up mocks, parameterize media-type cases - Replace vi.clearAllMocks() + four explicit mockReset() calls with single vi.resetAllMocks(). - Drop dead nodeOutputStore variable; inline the per-test mock store assignment. - Parameterize video/audio media-type cases via it.for. - Rename the previously misleading 'uses preview exposures by source preview name' test to clearly target the default-image branch when previewMediaType is unset. - Extract arrangePromotedPreview() helper to collapse repeating four-line setup boilerplate. - Replace '$$canvas-image-preview' magic strings with the existing CANVAS_IMAGE_PREVIEW_WIDGET constant. Amp-Thread-ID: https://ampcode.com/threads/T-019e1f3a-a617-70b4-8945-3f0fbd34c1de Co-authored-by: Amp --- .../node/usePromotedPreviews.test.ts | 134 +++++++++--------- 1 file changed, 65 insertions(+), 69 deletions(-) diff --git a/src/composables/node/usePromotedPreviews.test.ts b/src/composables/node/usePromotedPreviews.test.ts index 0f527abeec..463ce01d97 100644 --- a/src/composables/node/usePromotedPreviews.test.ts +++ b/src/composables/node/usePromotedPreviews.test.ts @@ -12,6 +12,7 @@ import { useNodeOutputStore } from '@/stores/nodeOutputStore' import { usePreviewExposureStore } from '@/stores/previewExposureStore' import { createNodeLocatorId } from '@/types/nodeIdentification' +import { CANVAS_IMAGE_PREVIEW_WIDGET } from './canvasImagePreviewTypes' import { usePromotedPreviews } from './usePromotedPreviews' type MockNodeOutputStore = Pick< @@ -103,7 +104,7 @@ function seedPreviewImages( function exposePreview( setup: ReturnType, sourceNodeId: string, - sourcePreviewName = '$$canvas-image-preview' + sourcePreviewName = CANVAS_IMAGE_PREVIEW_WIDGET ) { usePreviewExposureStore().addExposure( setup.subgraphNode.rootGraph.id, @@ -112,19 +113,31 @@ function exposePreview( ) } -describe(usePromotedPreviews, () => { - let nodeOutputStore: MockNodeOutputStore +interface ArrangeOptions { + id?: number + previewMediaType?: 'image' | 'video' | 'audio' | 'model' + urls?: string[] +} +function arrangePromotedPreview(options: ArrangeOptions = {}) { + const { + id = 10, + previewMediaType, + urls = ['/view?filename=output.png'] + } = options + const setup = createSetup() + addInteriorNode(setup, { id, previewMediaType }) + exposePreview(setup, String(id)) + seedOutputs(setup.subgraph.id, [id]) + getNodeImageUrls.mockReturnValue(urls) + return { setup, urls } +} + +describe(usePromotedPreviews, () => { beforeEach(() => { setActivePinia(createTestingPinia({ stubActions: false })) - vi.clearAllMocks() - getNodeImageUrls.mockReset() - getNodeImageUrlsByExecutionId.mockReset() - getNodeOutputByExecutionId.mockReset() - getNodePreviewImagesByExecutionId.mockReset() - - nodeOutputStore = createMockNodeOutputStore() - useNodeOutputStoreMock.mockReturnValue(nodeOutputStore) + vi.resetAllMocks() + useNodeOutputStoreMock.mockReturnValue(createMockNodeOutputStore()) }) it('returns empty array for non-SubgraphNode', () => { @@ -147,21 +160,17 @@ describe(usePromotedPreviews, () => { }) it('returns image preview for promoted $$ widget with outputs', () => { - const setup = createSetup() - addInteriorNode(setup, { id: 10, previewMediaType: 'image' }) - exposePreview(setup, '10') - - const mockUrls = ['/view?filename=output.png'] - seedOutputs(setup.subgraph.id, [10]) - getNodeImageUrls.mockReturnValue(mockUrls) + const { setup, urls } = arrangePromotedPreview({ + previewMediaType: 'image' + }) const { promotedPreviews } = usePromotedPreviews(() => setup.subgraphNode) expect(promotedPreviews.value).toEqual([ { sourceNodeId: '10', - sourceWidgetName: '$$canvas-image-preview', + sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET, type: 'image', - urls: mockUrls + urls } ]) }) @@ -176,7 +185,7 @@ describe(usePromotedPreviews, () => { createNodeLocatorId(rootGraphId, setup.subgraphNode.id), { sourceNodeId: '10', - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET } ) @@ -192,33 +201,34 @@ describe(usePromotedPreviews, () => { ).toEqual([ expect.objectContaining({ sourceNodeId: '10', - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET }) ]) }) - it('returns video type when interior node has video previewMediaType', () => { - const setup = createSetup() - addInteriorNode(setup, { id: 10, previewMediaType: 'video' }) - exposePreview(setup, '10') + it.for([ + ['video', '/view?filename=output.webm'], + ['audio', '/view?filename=output.mp3'] + ] as const)( + 'returns %s type when interior node has %s previewMediaType', + ([mediaType, url]) => { + const { setup } = arrangePromotedPreview({ + previewMediaType: mediaType, + urls: [url] + }) - seedOutputs(setup.subgraph.id, [10]) - getNodeImageUrls.mockReturnValue(['/view?filename=output.webm']) + const { promotedPreviews } = usePromotedPreviews(() => setup.subgraphNode) + expect(promotedPreviews.value[0].type).toBe(mediaType) + } + ) + + it('defaults preview type to image when previewMediaType is unset', () => { + const { setup, urls } = arrangePromotedPreview() const { promotedPreviews } = usePromotedPreviews(() => setup.subgraphNode) - expect(promotedPreviews.value[0].type).toBe('video') - }) - - it('returns audio type when interior node has audio previewMediaType', () => { - const setup = createSetup() - addInteriorNode(setup, { id: 10, previewMediaType: 'audio' }) - exposePreview(setup, '10') - - seedOutputs(setup.subgraph.id, [10]) - getNodeImageUrls.mockReturnValue(['/view?filename=output.mp3']) - - const { promotedPreviews } = usePromotedPreviews(() => setup.subgraphNode) - expect(promotedPreviews.value[0].type).toBe('audio') + expect(promotedPreviews.value).toEqual([ + expect.objectContaining({ type: 'image', urls }) + ]) }) it('returns separate entries for multiple promoted $$ widgets', () => { @@ -260,7 +270,7 @@ describe(usePromotedPreviews, () => { expect(promotedPreviews.value).toEqual([ { sourceNodeId: '10', - sourceWidgetName: '$$canvas-image-preview', + sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET, type: 'image', urls: [blobUrl] } @@ -282,7 +292,7 @@ describe(usePromotedPreviews, () => { expect(promotedPreviews.value).toEqual([ { sourceNodeId: '10', - sourceWidgetName: '$$canvas-image-preview', + sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET, type: 'image', urls: [blobUrl] } @@ -306,20 +316,6 @@ describe(usePromotedPreviews, () => { expect(promotedPreviews.value).toEqual([]) }) - it('uses preview exposures by source preview name', () => { - const setup = createSetup() - addInteriorNode(setup, { id: 10 }) - exposePreview(setup, '10') - - const mockUrls = ['/view?filename=img.png'] - seedOutputs(setup.subgraph.id, [10]) - getNodeImageUrls.mockReturnValue(mockUrls) - - const { promotedPreviews } = usePromotedPreviews(() => setup.subgraphNode) - expect(promotedPreviews.value).toHaveLength(1) - expect(promotedPreviews.value[0].urls).toEqual(mockUrls) - }) - it('renders leaf media exposed through a nested subgraph host', () => { const innerSetup = createSetup() const leafNode = addInteriorNode(innerSetup, { @@ -337,7 +333,7 @@ describe(usePromotedPreviews, () => { String(innerHost.id), { sourceNodeId: String(leafNode.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET } ) store.addExposure( @@ -345,7 +341,7 @@ describe(usePromotedPreviews, () => { String(outerSetup.subgraphNode.id), { sourceNodeId: String(innerHost.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET } ) @@ -361,7 +357,7 @@ describe(usePromotedPreviews, () => { expect(promotedPreviews.value).toEqual([ { sourceNodeId: '10', - sourceWidgetName: '$$canvas-image-preview', + sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET, type: 'image', urls: mockUrls } @@ -386,12 +382,12 @@ describe(usePromotedPreviews, () => { createNodeLocatorId(rootGraphId, innerHost.id), { sourceNodeId: String(leafNode.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET } ) store.addExposure(rootGraphId, String(outerSetup.subgraphNode.id), { sourceNodeId: String(innerHost.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET }) const mockUrls = ['/view?filename=leaf.png'] @@ -409,7 +405,7 @@ describe(usePromotedPreviews, () => { expect(store.getExposures(rootGraphId, nestedHostLocator)).toEqual([ expect.objectContaining({ sourceNodeId: '10', - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET }) ]) }) @@ -436,19 +432,19 @@ describe(usePromotedPreviews, () => { const store = usePreviewExposureStore() store.addExposure(firstHost.rootGraph.id, firstHostLocator, { sourceNodeId: String(innerHost.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET }) store.addExposure(firstHost.rootGraph.id, secondHostLocator, { sourceNodeId: String(innerHost.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET }) store.addExposure(firstHost.rootGraph.id, firstNestedLocator, { sourceNodeId: String(leafNode.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET }) store.addExposure(firstHost.rootGraph.id, secondNestedLocator, { sourceNodeId: String(leafNode.id), - sourcePreviewName: '$$canvas-image-preview' + sourcePreviewName: CANVAS_IMAGE_PREVIEW_WIDGET }) getNodePreviewImagesByExecutionId.mockImplementation((executionId) => { @@ -466,7 +462,7 @@ describe(usePromotedPreviews, () => { [ { sourceNodeId: '10', - sourceWidgetName: '$$canvas-image-preview', + sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET, type: 'image', urls: ['blob:first'] } @@ -477,7 +473,7 @@ describe(usePromotedPreviews, () => { ).toEqual([ { sourceNodeId: '10', - sourceWidgetName: '$$canvas-image-preview', + sourceWidgetName: CANVAS_IMAGE_PREVIEW_WIDGET, type: 'image', urls: ['blob:second'] }