From b4c4ea103a0eb83678afbced7013d3671c83b6ae Mon Sep 17 00:00:00 2001 From: Johnpaul Date: Tue, 20 Jan 2026 01:46:46 +0100 Subject: [PATCH] test: remove any types from useJobMenu.test.ts Replace all 8 `any` types with proper TypeScript types: - Use proper function signatures in mock definitions - Use JobListItem['state'] for state type assertion - Use Partial for partial task mocks - Use typed parameters for all mock functions (downloadFile, copyToClipboard, interrupt, deleteItem, etc.) - Use Record for nodeDefsByName - Handle optional parameters correctly in downloadFile mock All 36 tests passing, 0 typecheck errors. --- src/composables/queue/useJobMenu.test.ts | 60 ++++++++++++++++-------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/src/composables/queue/useJobMenu.test.ts b/src/composables/queue/useJobMenu.test.ts index 1b339d09c..093dea473 100644 --- a/src/composables/queue/useJobMenu.test.ts +++ b/src/composables/queue/useJobMenu.test.ts @@ -7,13 +7,18 @@ import type { MenuEntry } from '@/composables/queue/useJobMenu' const downloadFileMock = vi.fn() vi.mock('@/base/common/downloadUtil', () => ({ - downloadFile: (...args: any[]) => downloadFileMock(...args) + downloadFile: (url: string, filename?: string) => { + if (filename === undefined) { + return downloadFileMock(url) + } + return downloadFileMock(url, filename) + } })) const copyToClipboardMock = vi.fn() vi.mock('@/composables/useCopyToClipboard', () => ({ useCopyToClipboard: () => ({ - copyToClipboard: (...args: any[]) => copyToClipboardMock(...args) + copyToClipboard: (text: string) => copyToClipboardMock(text) }) })) @@ -26,8 +31,8 @@ vi.mock('@/i18n', () => ({ const mapTaskOutputToAssetItemMock = vi.fn() vi.mock('@/platform/assets/composables/media/assetMappers', () => ({ - mapTaskOutputToAssetItem: (...args: any[]) => - mapTaskOutputToAssetItemMock(...args) + mapTaskOutputToAssetItem: (taskItem: TaskItemImpl, output: ResultItemImpl) => + mapTaskOutputToAssetItemMock(taskItem, output) })) const mediaAssetActionsMock = { @@ -62,14 +67,16 @@ const interruptMock = vi.fn() const deleteItemMock = vi.fn() vi.mock('@/scripts/api', () => ({ api: { - interrupt: (...args: any[]) => interruptMock(...args), - deleteItem: (...args: any[]) => deleteItemMock(...args) + interrupt: (runningPromptId: string | null) => + interruptMock(runningPromptId), + deleteItem: (type: string, id: string) => deleteItemMock(type, id) } })) const downloadBlobMock = vi.fn() vi.mock('@/scripts/utils', () => ({ - downloadBlob: (...args: any[]) => downloadBlobMock(...args) + downloadBlob: (filename: string, blob: Blob) => + downloadBlobMock(filename, blob) })) const dialogServiceMock = { @@ -90,7 +97,7 @@ vi.mock('@/services/litegraphService', () => ({ })) const nodeDefStoreMock = { - nodeDefsByName: {} as Record + nodeDefsByName: {} as Record } vi.mock('@/stores/nodeDefStore', () => ({ useNodeDefStore: () => nodeDefStoreMock @@ -106,12 +113,13 @@ vi.mock('@/stores/queueStore', () => ({ const getJobWorkflowMock = vi.fn() vi.mock('@/services/jobOutputCache', () => ({ - getJobWorkflow: (...args: any[]) => getJobWorkflowMock(...args) + getJobWorkflow: (jobId: string) => getJobWorkflowMock(jobId) })) const createAnnotatedPathMock = vi.fn() vi.mock('@/utils/createAnnotatedPath', () => ({ - createAnnotatedPath: (...args: any[]) => createAnnotatedPathMock(...args) + createAnnotatedPath: (filename: string, subfolder: string, type: string) => + createAnnotatedPathMock(filename, subfolder, type) })) const appendJsonExtMock = vi.fn((value: string) => @@ -123,7 +131,7 @@ vi.mock('@/utils/formatUtil', () => ({ })) import { useJobMenu } from '@/composables/queue/useJobMenu' -import type { TaskItemImpl } from '@/stores/queueStore' +import type { ResultItemImpl, TaskItemImpl } from '@/stores/queueStore' type MockTaskRef = Record @@ -245,7 +253,7 @@ describe('useJobMenu', () => { ['initialization', interruptMock, deleteItemMock] ])('cancels %s job via interrupt', async (state) => { const { cancelJob } = mountJobMenu() - setCurrentItem(createJobItem({ state: state as any })) + setCurrentItem(createJobItem({ state: state as JobListItem['state'] })) await cancelJob() @@ -280,7 +288,9 @@ describe('useJobMenu', () => { setCurrentItem( createJobItem({ state: 'failed', - taskRef: { errorMessage: 'Something went wrong' } as any + taskRef: { + errorMessage: 'Something went wrong' + } as Partial }) ) @@ -312,7 +322,7 @@ describe('useJobMenu', () => { errorMessage: 'CUDA out of memory', executionError, createTime: 12345 - } as any + } as Partial }) ) @@ -332,7 +342,9 @@ describe('useJobMenu', () => { setCurrentItem( createJobItem({ state: 'failed', - taskRef: { errorMessage: 'Job failed with error' } as any + taskRef: { + errorMessage: 'Job failed with error' + } as Partial }) ) @@ -354,7 +366,7 @@ describe('useJobMenu', () => { setCurrentItem( createJobItem({ state: 'failed', - taskRef: { errorMessage: undefined } as any + taskRef: { errorMessage: undefined } as Partial }) ) @@ -502,7 +514,12 @@ describe('useJobMenu', () => { it('ignores add-to-current entry when preview missing entirely', async () => { const { jobMenuEntries } = mountJobMenu() - setCurrentItem(createJobItem({ state: 'completed', taskRef: {} as any })) + setCurrentItem( + createJobItem({ + state: 'completed', + taskRef: {} as Partial + }) + ) await nextTick() const entry = findActionEntry(jobMenuEntries.value, 'add-to-current') @@ -531,7 +548,12 @@ describe('useJobMenu', () => { it('ignores download request when preview missing', async () => { const { jobMenuEntries } = mountJobMenu() - setCurrentItem(createJobItem({ state: 'completed', taskRef: {} as any })) + setCurrentItem( + createJobItem({ + state: 'completed', + taskRef: {} as Partial + }) + ) await nextTick() const entry = findActionEntry(jobMenuEntries.value, 'download') @@ -739,7 +761,7 @@ describe('useJobMenu', () => { setCurrentItem( createJobItem({ state: 'failed', - taskRef: { errorMessage: 'Some error' } as any + taskRef: { errorMessage: 'Some error' } as Partial }) )