Compare commits

...

2 Commits

Author SHA1 Message Date
GitHub Action
7b400ed7f8 [automated] Apply ESLint and Oxfmt fixes 2026-03-09 12:15:38 +00:00
CodeRabbit Fixer
210a552c23 fix: Eliminate WorkspaceStore type casts in browser tests (#8585)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 13:12:19 +01:00
10 changed files with 34 additions and 56 deletions

View File

@@ -35,7 +35,6 @@ import { SubgraphHelper } from './helpers/SubgraphHelper'
import { ToastHelper } from './helpers/ToastHelper'
import { WorkflowHelper } from './helpers/WorkflowHelper'
import type { NodeReference } from './utils/litegraphUtils'
import type { WorkspaceStore } from '../types/globals'
dotenv.config()
@@ -141,9 +140,7 @@ class ConfirmDialog {
// Wait for workflow service to finish if it's busy
await this.page.waitForFunction(
() =>
(window.app?.extensionManager as WorkspaceStore | undefined)?.workflow
?.isBusy === false,
() => window.app?.extensionManager?.workflow?.isBusy === false,
undefined,
{ timeout: 3000 }
)
@@ -391,7 +388,7 @@ export class ComfyPage {
async setFocusMode(focusMode: boolean) {
await this.page.evaluate((focusMode) => {
;(window.app!.extensionManager as WorkspaceStore).focusMode = focusMode
window.app!.extensionManager.focusMode = focusMode
}, focusMode)
await this.nextFrame()
}

View File

@@ -1,6 +1,5 @@
import type { Locator, Page } from '@playwright/test'
import type { WorkspaceStore } from '../../types/globals'
import { TestIds } from '../selectors'
class SidebarTab {
@@ -153,9 +152,7 @@ export class WorkflowsSidebarTab extends SidebarTab {
// Wait for workflow service to finish renaming
await this.page.waitForFunction(
() =>
!(window.app?.extensionManager as WorkspaceStore | undefined)?.workflow
?.isBusy,
() => !window.app?.extensionManager?.workflow?.isBusy,
undefined,
{ timeout: 3000 }
)

View File

@@ -1,7 +1,5 @@
import type { Locator, Page } from '@playwright/test'
import type { WorkspaceStore } from '../../types/globals'
export class Topbar {
private readonly menuLocator: Locator
private readonly menuTrigger: Locator
@@ -87,7 +85,7 @@ export class Topbar {
// Wait for workflow service to finish saving
await this.page.waitForFunction(
() => !(window.app!.extensionManager as WorkspaceStore).workflow.isBusy,
() => !window.app!.extensionManager.workflow.isBusy,
undefined,
{ timeout: 3000 }
)

View File

@@ -4,7 +4,6 @@ import type {
ComfyApiWorkflow,
ComfyWorkflowJSON
} from '../../../src/platform/workflow/validation/schemas/workflowSchema'
import type { WorkspaceStore } from '../../types/globals'
import type { ComfyPage } from '../ComfyPage'
type FolderStructure = {
@@ -47,9 +46,7 @@ export class WorkflowHelper {
}
await this.comfyPage.page.evaluate(async () => {
await (
window.app!.extensionManager as WorkspaceStore
).workflow.syncWorkflows()
await window.app!.extensionManager.workflow.syncWorkflows()
})
// Wait for Vue to re-render the workflow list
@@ -90,24 +87,21 @@ export class WorkflowHelper {
async getUndoQueueSize(): Promise<number | undefined> {
return this.comfyPage.page.evaluate(() => {
const workflow = (window.app!.extensionManager as WorkspaceStore).workflow
.activeWorkflow
const workflow = window.app!.extensionManager.workflow.activeWorkflow
return workflow?.changeTracker.undoQueue.length
})
}
async getRedoQueueSize(): Promise<number | undefined> {
return this.comfyPage.page.evaluate(() => {
const workflow = (window.app!.extensionManager as WorkspaceStore).workflow
.activeWorkflow
const workflow = window.app!.extensionManager.workflow.activeWorkflow
return workflow?.changeTracker.redoQueue.length
})
}
async isCurrentWorkflowModified(): Promise<boolean | undefined> {
return this.comfyPage.page.evaluate(() => {
return (window.app!.extensionManager as WorkspaceStore).workflow
.activeWorkflow?.isModified
return window.app!.extensionManager.workflow.activeWorkflow?.isModified
})
}

View File

@@ -2,7 +2,6 @@ import type { Locator, Page } from '@playwright/test'
import type { AutoQueueMode } from '../../src/stores/queueStore'
import { TestIds } from '../fixtures/selectors'
import type { WorkspaceStore } from '../types/globals'
export class ComfyActionbar {
public readonly root: Locator
@@ -46,14 +45,13 @@ class ComfyQueueButtonOptions {
public async setMode(mode: AutoQueueMode) {
await this.page.evaluate((mode) => {
;(window.app!.extensionManager as WorkspaceStore).queueSettings.mode =
mode
window.app!.extensionManager.queueSettings.mode = mode
}, mode)
}
public async getMode() {
return await this.page.evaluate(() => {
return (window.app!.extensionManager as WorkspaceStore).queueSettings.mode
return window.app!.extensionManager.queueSettings.mode
})
}
}

View File

@@ -4,7 +4,6 @@ import { expect, mergeTests } from '@playwright/test'
import type { StatusWsMessage } from '../../src/schemas/apiSchema'
import { comfyPageFixture } from '../fixtures/ComfyPage'
import { webSocketFixture } from '../fixtures/ws'
import type { WorkspaceStore } from '../types/globals'
const test = mergeTests(comfyPageFixture, webSocketFixture)
@@ -55,9 +54,7 @@ test.describe('Actionbar', { tag: '@ui' }, () => {
)
node!.widgets![0].value = value
;(
window.app!.extensionManager as WorkspaceStore
).workflow.activeWorkflow?.changeTracker.checkState()
window.app!.extensionManager.workflow.activeWorkflow?.changeTracker.checkState()
}, value)
}

View File

@@ -1,7 +1,6 @@
import { expect } from '@playwright/test'
import { comfyPageFixture as test } from '../fixtures/ComfyPage'
import type { WorkspaceStore } from '../types/globals'
test.describe('Browser tab title', { tag: '@smoke' }, () => {
test.describe('Beta Menu', () => {
@@ -11,8 +10,7 @@ test.describe('Browser tab title', { tag: '@smoke' }, () => {
test('Can display workflow name', async ({ comfyPage }) => {
const workflowName = await comfyPage.page.evaluate(async () => {
return (window.app!.extensionManager as WorkspaceStore).workflow
.activeWorkflow?.filename
return window.app!.extensionManager.workflow.activeWorkflow?.filename
})
await expect
.poll(() => comfyPage.page.title())
@@ -25,8 +23,7 @@ test.describe('Browser tab title', { tag: '@smoke' }, () => {
comfyPage
}) => {
const workflowName = await comfyPage.page.evaluate(async () => {
return (window.app!.extensionManager as WorkspaceStore).workflow
.activeWorkflow?.filename
return window.app!.extensionManager.workflow.activeWorkflow?.filename
})
expect(await comfyPage.page.title()).toBe(`${workflowName} - ComfyUI`)
@@ -40,9 +37,7 @@ test.describe('Browser tab title', { tag: '@smoke' }, () => {
// Delete the saved workflow for cleanup.
await comfyPage.page.evaluate(async () => {
return (
window.app!.extensionManager as WorkspaceStore
).workflow.activeWorkflow?.delete()
return window.app!.extensionManager.workflow.activeWorkflow?.delete()
})
})
})

View File

@@ -1,7 +1,6 @@
import { expect } from '@playwright/test'
import { comfyPageFixture as test } from '../fixtures/ComfyPage'
import type { WorkspaceStore } from '../types/globals'
test.beforeEach(async ({ comfyPage }) => {
await comfyPage.settings.setSetting('Comfy.UseNewMenu', 'Disabled')
@@ -179,9 +178,7 @@ test.describe('Color Palette', { tag: ['@screenshot', '@settings'] }, () => {
test('Can add custom color palette', async ({ comfyPage }) => {
await comfyPage.page.evaluate(async (p) => {
await (
window.app!.extensionManager as WorkspaceStore
).colorPalette.addCustomColorPalette(p)
await window.app!.extensionManager.colorPalette.addCustomColorPalette(p)
}, customColorPalettes.obsidian_dark)
expect(await comfyPage.toast.getToastErrorCount()).toBe(0)

View File

@@ -0,0 +1,19 @@
/**
* Module augmentation that extends the public ExtensionManager interface
* with internal properties exposed by the WorkspaceStore.
*
* This augmentation is scoped to browser_tests (via browser_tests/tsconfig.json)
* and allows tests to access store internals without type casts.
*/
import type { useColorPaletteService } from '@/services/colorPaletteService'
import type { useQueueSettingsStore } from '@/stores/queueStore'
import type { useWorkflowStore } from '@/platform/workflow/management/stores/workflowStore'
declare module '@/types/extensionTypes' {
interface ExtensionManager {
workflow: ReturnType<typeof useWorkflowStore>
queueSettings: ReturnType<typeof useQueueSettingsStore>
colorPalette: ReturnType<typeof useColorPaletteService>
focusMode: boolean
}
}

View File

@@ -4,7 +4,6 @@ import type { LGraphBadge } from '@/lib/litegraph/src/LGraphBadge'
import type { LGraphNode } from '@/lib/litegraph/src/LGraphNode'
import type { LiteGraphGlobal } from '@/lib/litegraph/src/LiteGraphGlobal'
import type { ComfyApp } from '@/scripts/app'
import type { useWorkspaceStore } from '@/stores/workspaceStore'
/**
* Helper type for accessing nodes by ID in browser tests.
@@ -54,16 +53,3 @@ declare global {
const LiteGraph: LiteGraphGlobal | undefined
const LGraphBadge: typeof LGraphBadge | undefined
}
/**
* Internal store type for browser test access.
* Used to access properties not exposed via the public ExtensionManager interface.
*
* @example
* ```ts
* await page.evaluate(() => {
* ;(window.app!.extensionManager as WorkspaceStore).workflow.syncWorkflows()
* })
* ```
*/
export type WorkspaceStore = ReturnType<typeof useWorkspaceStore>