mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 06:20:11 +00:00
## 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>
72 lines
2.2 KiB
TypeScript
72 lines
2.2 KiB
TypeScript
import { mount } from '@vue/test-utils'
|
|
import { describe, expect, it, vi } from 'vitest'
|
|
import { nextTick } from 'vue'
|
|
|
|
import BaseThumbnail from '@/components/templates/thumbnails/BaseThumbnail.vue'
|
|
|
|
type ComponentInstance = InstanceType<typeof BaseThumbnail> & {
|
|
error: boolean
|
|
}
|
|
|
|
vi.mock('@vueuse/core', () => ({
|
|
useEventListener: vi.fn()
|
|
}))
|
|
|
|
describe('BaseThumbnail', () => {
|
|
const mountThumbnail = (props = {}, slots = {}) => {
|
|
return mount(BaseThumbnail, {
|
|
props,
|
|
slots: {
|
|
default: '<img src="/test.jpg" alt="test" />',
|
|
...slots
|
|
}
|
|
})
|
|
}
|
|
|
|
it('renders slot content', () => {
|
|
const wrapper = mountThumbnail()
|
|
expect(wrapper.find('img').exists()).toBe(true)
|
|
})
|
|
|
|
it('applies hover zoom with correct style', () => {
|
|
const wrapper = mountThumbnail({ isHovered: true })
|
|
const contentDiv = wrapper.find('.transform-gpu')
|
|
expect(contentDiv.attributes('style')).toContain('transform')
|
|
expect(contentDiv.attributes('style')).toContain('scale')
|
|
})
|
|
|
|
it('applies custom hover zoom value', () => {
|
|
const wrapper = mountThumbnail({ hoverZoom: 10, isHovered: true })
|
|
const contentDiv = wrapper.find('.transform-gpu')
|
|
expect(contentDiv.attributes('style')).toContain('scale(1.1)')
|
|
})
|
|
|
|
it('does not apply scale when not hovered', () => {
|
|
const wrapper = mountThumbnail({ isHovered: false })
|
|
const contentDiv = wrapper.find('.transform-gpu')
|
|
expect(contentDiv.attributes('style')).toBeUndefined()
|
|
})
|
|
|
|
it('shows error state when image fails to load', async () => {
|
|
const wrapper = mountThumbnail()
|
|
const vm = wrapper.vm as ComponentInstance
|
|
|
|
// Manually set error since useEventListener is mocked
|
|
vm.error = true
|
|
await nextTick()
|
|
|
|
expect(
|
|
wrapper.find('img[src="/assets/images/default-template.png"]').exists()
|
|
).toBe(true)
|
|
})
|
|
|
|
it('applies transition classes to content', () => {
|
|
const wrapper = mountThumbnail()
|
|
const contentDiv = wrapper.find('.transform-gpu')
|
|
expect(contentDiv.classes()).toContain('transform-gpu')
|
|
expect(contentDiv.classes()).toContain('transition-transform')
|
|
expect(contentDiv.classes()).toContain('duration-1000')
|
|
expect(contentDiv.classes()).toContain('ease-out')
|
|
})
|
|
})
|