remove dummy type; revert queuestore

This commit is contained in:
Richard Yu
2025-12-03 22:29:13 -08:00
parent 4c22b2d64a
commit b9537d352a
6 changed files with 127 additions and 141 deletions

View File

@@ -13,7 +13,7 @@ type TestTask = {
executionTime?: number
executionEndTimestamp?: number
createTime?: number
workflow?: { id?: string }
workflowId?: string
}
const translations: Record<string, string> = {
@@ -185,7 +185,7 @@ const createTask = (
executionTime: overrides.executionTime,
executionEndTimestamp: overrides.executionEndTimestamp,
createTime: overrides.createTime,
workflow: overrides.workflow
workflowId: overrides.workflowId
})
const mountUseJobList = () => {
@@ -387,13 +387,13 @@ describe('useJobList', () => {
promptId: 'wf-1',
queueIndex: 2,
mockState: 'pending',
workflow: { id: 'workflow-1' }
workflowId: 'workflow-1'
}),
createTask({
promptId: 'wf-2',
queueIndex: 1,
mockState: 'pending',
workflow: { id: 'workflow-2' }
workflowId: 'workflow-2'
})
]

View File

@@ -1,71 +1,78 @@
import { describe, it, expect } from 'vitest'
import { useResultGallery } from '@/composables/queue/useResultGallery'
import type { JobListItem } from '@/composables/queue/useJobList'
import type { ResultItemImpl } from '@/stores/queueStore'
import type { JobListItem as JobListViewItem } from '@/composables/queue/useJobList'
import type { JobListItem } from '@/platform/remote/comfyui/jobs'
import { ResultItemImpl, TaskItemImpl } from '@/stores/queueStore'
type PreviewLike = Pick<ResultItemImpl, 'url' | 'supportsPreview'>
/**
* Mock task interface matching what useResultGallery expects.
* Uses structural typing - no need to import the internal GalleryTask type.
*/
interface MockTask {
readonly promptId: string
readonly outputsCount?: number
readonly flatOutputs: readonly ResultItemImpl[]
readonly previewOutput?: ResultItemImpl
loadFullOutputs(
fetchApi: (url: string) => Promise<Response>
): Promise<MockTask>
const createResultItem = (
url: string,
supportsPreview = true
): ResultItemImpl => {
const item = new ResultItemImpl({
filename: url,
subfolder: '',
type: 'output',
nodeId: 'node-1',
mediaType: supportsPreview ? 'images' : 'unknown'
})
// Override url getter for test matching
Object.defineProperty(item, 'url', { get: () => url })
Object.defineProperty(item, 'supportsPreview', { get: () => supportsPreview })
return item
}
const createPreview = (url: string, supportsPreview = true): PreviewLike => ({
url,
supportsPreview
const createMockJob = (id: string, outputsCount = 1): JobListItem => ({
id,
status: 'completed',
create_time: Date.now(),
preview_output: null,
outputs_count: outputsCount,
priority: 0
})
const createMockTask = (
preview?: PreviewLike,
allOutputs?: PreviewLike[]
): MockTask => ({
previewOutput: preview as ResultItemImpl | undefined,
flatOutputs: (allOutputs ?? (preview ? [preview] : [])) as ResultItemImpl[],
outputsCount: 1,
promptId: `task-${Math.random().toString(36).slice(2)}`,
loadFullOutputs: async () => createMockTask(preview, allOutputs)
})
const createTask = (
preview?: ResultItemImpl,
allOutputs?: ResultItemImpl[],
outputsCount = 1
): TaskItemImpl => {
const job = createMockJob(
`task-${Math.random().toString(36).slice(2)}`,
outputsCount
)
const flatOutputs = allOutputs ?? (preview ? [preview] : [])
return new TaskItemImpl(job, {}, flatOutputs)
}
const createJobItem = (
const createJobViewItem = (
id: string,
preview?: PreviewLike,
taskRef?: MockTask
): JobListItem =>
taskRef?: TaskItemImpl
): JobListViewItem =>
({
id,
title: `Job ${id}`,
meta: '',
state: 'completed',
showClear: false,
taskRef: taskRef ?? (preview ? { previewOutput: preview } : undefined)
}) as JobListItem
taskRef
}) as JobListViewItem
describe('useResultGallery', () => {
it('collects only previewable outputs and preserves their order', async () => {
const previewable = [createPreview('p-1'), createPreview('p-2')]
const nonPreviewable = { url: 'skip-me', supportsPreview: false }
const previewable = [createResultItem('p-1'), createResultItem('p-2')]
const nonPreviewable = createResultItem('skip-me', false)
const tasks = [
createMockTask(previewable[0]),
createMockTask(nonPreviewable),
createMockTask(previewable[1]),
createMockTask()
createTask(previewable[0]),
createTask(nonPreviewable),
createTask(previewable[1]),
createTask()
]
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
() => tasks
)
await onViewItem(createJobItem('job-1', previewable[0], tasks[0]))
await onViewItem(createJobViewItem('job-1', tasks[0]))
expect(galleryItems.value).toEqual([previewable[0]])
expect(galleryActiveIndex.value).toBe(0)
@@ -76,7 +83,7 @@ describe('useResultGallery', () => {
() => []
)
await onViewItem(createJobItem('job-missing'))
await onViewItem(createJobViewItem('job-missing'))
expect(galleryItems.value).toEqual([])
expect(galleryActiveIndex.value).toBe(-1)
@@ -84,81 +91,77 @@ describe('useResultGallery', () => {
it('activates the index that matches the viewed preview URL', async () => {
const previewable = [
createPreview('p-1'),
createPreview('p-2'),
createPreview('p-3')
createResultItem('p-1'),
createResultItem('p-2'),
createResultItem('p-3')
]
const tasks = previewable.map((preview) => createMockTask(preview))
const tasks = previewable.map((preview) => createTask(preview))
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
() => tasks
)
const targetPreview = createPreview('p-2')
await onViewItem(createJobItem('job-2', targetPreview, tasks[1]))
await onViewItem(createJobViewItem('job-2', tasks[1]))
expect(galleryItems.value).toEqual([previewable[1]])
expect(galleryActiveIndex.value).toBe(0)
})
it('defaults to the first entry when the clicked job lacks a preview', async () => {
const previewable = [createPreview('p-1'), createPreview('p-2')]
const tasks = previewable.map((preview) => createMockTask(preview))
const previewable = [createResultItem('p-1'), createResultItem('p-2')]
const tasks = previewable.map((preview) => createTask(preview))
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
() => tasks
)
await onViewItem(createJobItem('job-no-preview'))
await onViewItem(createJobViewItem('job-no-preview'))
expect(galleryItems.value).toEqual(previewable)
expect(galleryActiveIndex.value).toBe(0)
})
it('defaults to the first entry when no gallery item matches the preview URL', async () => {
const previewable = [createPreview('p-1'), createPreview('p-2')]
const tasks = previewable.map((preview) => createMockTask(preview))
const previewable = [createResultItem('p-1'), createResultItem('p-2')]
const tasks = previewable.map((preview) => createTask(preview))
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
() => tasks
)
await onViewItem(createJobItem('job-mismatch', createPreview('missing')))
const taskWithMismatchedPreview = createTask(createResultItem('missing'))
await onViewItem(
createJobViewItem('job-mismatch', taskWithMismatchedPreview)
)
expect(galleryItems.value).toEqual(previewable)
expect(galleryItems.value).toEqual([createResultItem('missing')])
expect(galleryActiveIndex.value).toBe(0)
})
it('loads full outputs when task has only preview outputs', async () => {
const previewOutput = createPreview('preview-1')
const previewOutput = createResultItem('preview-1')
const fullOutputs = [
createPreview('full-1'),
createPreview('full-2'),
createPreview('full-3')
] as ResultItemImpl[]
createResultItem('full-1'),
createResultItem('full-2'),
createResultItem('full-3')
]
const mockTask: MockTask = {
promptId: 'task-1',
previewOutput: previewOutput as ResultItemImpl,
flatOutputs: [previewOutput] as ResultItemImpl[],
outputsCount: 3, // More than 1 triggers lazy loading
loadFullOutputs: async () => ({
promptId: 'task-1',
previewOutput: previewOutput as ResultItemImpl,
flatOutputs: fullOutputs,
outputsCount: 3,
loadFullOutputs: async () => mockTask
})
}
// Create a task with outputsCount > 1 to trigger lazy loading
const job = createMockJob('task-1', 3)
const task = new TaskItemImpl(job, {}, [previewOutput])
// Mock loadFullOutputs to return full outputs
const loadedTask = new TaskItemImpl(job, {}, fullOutputs)
task.loadFullOutputs = async () => loadedTask
const mockFetchApi = async () => new Response()
const { galleryItems, galleryActiveIndex, onViewItem } = useResultGallery(
() => [mockTask],
() => [task],
mockFetchApi
)
await onViewItem(createJobItem('job-1', previewOutput, mockTask))
await onViewItem(createJobViewItem('job-1', task))
expect(galleryItems.value).toEqual(fullOutputs)
expect(galleryActiveIndex.value).toBe(0)