mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-02-26 01:34:07 +00:00
refactor: eliminate unsafe type assertions from Group 2 test files (#8258)
## Summary Improved type safety in test files by eliminating unsafe type assertions and adopting official testing patterns. Reduced unsafe `as unknown as` type assertions and eliminated all `null!` assertions. ## Changes - **Adopted @pinia/testing patterns** - Replaced manual Pinia store mocking with `createTestingPinia()` in `useSelectionState.test.ts` - Eliminated ~120 lines of mock boilerplate - Created `createMockSettingStore()` helper to replace duplicated store mocks in `useCoreCommands.test.ts` - **Eliminated unsafe null assertions** - Created explicit `MockMaskEditorStore` interface with proper nullable types in `useCanvasTools.test.ts` - Replaced `null!` initializations with `null` and used `!` at point of use or `?.` for optional chaining - **Made partial mock intent explicit** - Updated test utilities in `litegraphTestUtils.ts` to use explicit `Partial<T>` typing - Changed cast pattern from `as T` to `as Partial<T> as T` to show incomplete mock intent - Applied to `createMockLGraphNode()`, `createMockPositionable()`, and `createMockLGraphGroup()` - **Created centralized mock utilities** in `src/utils/__tests__/litegraphTestUtils.ts` - `createMockLGraphNode()`, `createMockPositionable()`, `createMockLGraphGroup()`, `createMockSubgraphNode()` - Updated 8+ test files to use centralized utilities - Used union types `Partial<T> | Record<string, unknown>` for flexible mock creation ## Results - ✅ 0 typecheck errors - ✅ 0 lint errors - ✅ All tests passing in modified files - ✅ Eliminated all `null!` assertions - ✅ Reduced unsafe double-cast patterns significantly ## Files Modified (18) - `src/components/graph/SelectionToolbox.test.ts` - `src/components/graph/selectionToolbox/{BypassButton,ColorPickerButton,ExecuteButton}.test.ts` - `src/components/sidebar/tabs/queue/ResultGallery.test.ts` - `src/composables/canvas/useSelectedLiteGraphItems.test.ts` - `src/composables/graph/{useGraphHierarchy,useSelectionState}.test.ts` - `src/composables/maskeditor/{useCanvasHistory,useCanvasManager,useCanvasTools,useCanvasTransform}.test.ts` - `src/composables/node/{useNodePricing,useWatchWidget}.test.ts` - `src/composables/{useBrowserTabTitle,useCoreCommands}.test.ts` - `src/utils/__tests__/litegraphTestUtils.ts` ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8258-refactor-eliminate-unsafe-type-assertions-from-Group-2-test-files-2f16d73d365081549c65fd546cc7c765) by [Unito](https://www.unito.io) --------- Co-authored-by: GitHub Action <action@github.com> Co-authored-by: Alexander Brown <drjkl@comfy.org> Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: AustinMroz <austin@comfy.org> Co-authored-by: Christian Byrne <cbyrne@comfy.org> Co-authored-by: Benjamin Lu <benjaminlu1107@gmail.com>
This commit is contained in:
committed by
GitHub
parent
6b6b467e68
commit
b1d8bf0b13
86
src/utils/__tests__/litegraphTestUtils.ts
Normal file
86
src/utils/__tests__/litegraphTestUtils.ts
Normal file
@@ -0,0 +1,86 @@
|
||||
import type { Positionable } from '@/lib/litegraph/src/interfaces'
|
||||
import { Rectangle } from '@/lib/litegraph/src/infrastructure/Rectangle'
|
||||
import type {
|
||||
LGraphCanvas,
|
||||
LGraphGroup,
|
||||
LGraphNode
|
||||
} from '@/lib/litegraph/src/litegraph'
|
||||
import { LGraphEventMode } from '@/lib/litegraph/src/litegraph'
|
||||
import { vi } from 'vitest'
|
||||
|
||||
/**
|
||||
* Creates a mock LGraphNode with minimal required properties
|
||||
*/
|
||||
export function createMockLGraphNode(
|
||||
overrides: Partial<LGraphNode> | Record<string, unknown> = {}
|
||||
): LGraphNode {
|
||||
const partial: Partial<LGraphNode> = {
|
||||
id: 1,
|
||||
pos: [0, 0],
|
||||
size: [100, 100],
|
||||
title: 'Test Node',
|
||||
mode: LGraphEventMode.ALWAYS,
|
||||
...(overrides as Partial<LGraphNode>)
|
||||
}
|
||||
return partial as Partial<LGraphNode> as LGraphNode
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mock Positionable object
|
||||
*/
|
||||
export function createMockPositionable(
|
||||
overrides: Partial<Positionable> = {}
|
||||
): Positionable {
|
||||
const partial: Partial<Positionable> = {
|
||||
id: 1,
|
||||
pos: [0, 0],
|
||||
...overrides
|
||||
}
|
||||
return partial as Partial<Positionable> as Positionable
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mock LGraphGroup with minimal required properties
|
||||
*/
|
||||
export function createMockLGraphGroup(
|
||||
overrides: Partial<LGraphGroup> = {}
|
||||
): LGraphGroup {
|
||||
const partial: Partial<LGraphGroup> = {
|
||||
id: 1,
|
||||
pos: [0, 0],
|
||||
boundingRect: new Rectangle(0, 0, 100, 100),
|
||||
...overrides
|
||||
}
|
||||
return partial as Partial<LGraphGroup> as LGraphGroup
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mock SubgraphNode with sub-nodes
|
||||
*/
|
||||
export function createMockSubgraphNode(
|
||||
subNodes: LGraphNode[],
|
||||
overrides: Partial<LGraphNode> | Record<string, unknown> = {}
|
||||
): LGraphNode {
|
||||
const baseNode = createMockLGraphNode(overrides)
|
||||
return Object.assign(baseNode, {
|
||||
isSubgraphNode: () => true,
|
||||
subgraph: {
|
||||
nodes: subNodes
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a mock LGraphCanvas with minimal required properties for testing
|
||||
*/
|
||||
export function createMockCanvas(
|
||||
overrides: Partial<LGraphCanvas> = {}
|
||||
): LGraphCanvas {
|
||||
return {
|
||||
setDirty: vi.fn(),
|
||||
state: {
|
||||
selectionChanged: false
|
||||
},
|
||||
...overrides
|
||||
} as LGraphCanvas
|
||||
}
|
||||
Reference in New Issue
Block a user