mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-04-20 14:30:41 +00:00
## Summary Phase 2 of the VTL migration: migrate 11 interactive component tests from @vue/test-utils to @testing-library/vue (69 tests). Stacked on #10471. ## Changes - **What**: Migrate BatchCountEdit, BypassButton, BuilderFooterToolbar, ComfyActionbar, SidebarIcon, EditableText, UrlInput, SearchInput, TagsInput, TreeExplorerTreeNode, ColorCustomizationSelector from VTU to VTL - **Pattern transforms**: `trigger('click')` → `userEvent.click()`, `setValue()` → `userEvent.type()`, `findComponent().props()` → `getByRole/getByText/getByTestId`, `emitted()` → callback props - **Removed**: 4 `@ts-expect-error` annotations, 1 change-detector test (SearchInput `vm.focus`) - **PrimeVue**: `data-pc-name` selectors + `aria-pressed` for SelectButton, container queries for ColorPicker/InputIcon ## Review Focus - PrimeVue escape hatches in ColorCustomizationSelector (SelectButton/ColorPicker lack standard ARIA roles) - Teleport test in ComfyActionbar uses `container.querySelector` intentionally (scoped to teleport target) - SearchInput debounce tests use `fireEvent.update` instead of `userEvent.type` due to fake timer interaction - EditableText escape-then-blur test simplified: `userEvent.keyboard('{Escape}')` already triggers blur internally ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-10490-test-migrate-11-interactive-component-tests-from-VTU-to-VTL-Phase-2-32e6d73d3650817ca40fd61395499e3f) by [Unito](https://www.unito.io) --------- Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
101 lines
2.9 KiB
TypeScript
101 lines
2.9 KiB
TypeScript
import { createTestingPinia } from '@pinia/testing'
|
|
import { render } from '@testing-library/vue'
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
|
import { nextTick } from 'vue'
|
|
|
|
import ComfyActionbar from '@/components/actionbar/ComfyActionbar.vue'
|
|
import { i18n } from '@/i18n'
|
|
import { useSettingStore } from '@/platform/settings/settingStore'
|
|
|
|
const configureSettings = (
|
|
pinia: ReturnType<typeof createTestingPinia>,
|
|
showRunProgressBar: boolean
|
|
) => {
|
|
const settingStore = useSettingStore(pinia)
|
|
vi.mocked(settingStore.get).mockImplementation((key) => {
|
|
if (key === 'Comfy.UseNewMenu') return 'Top'
|
|
if (key === 'Comfy.Queue.QPOV2') return true
|
|
if (key === 'Comfy.Queue.ShowRunProgressBar') return showRunProgressBar
|
|
return undefined
|
|
})
|
|
}
|
|
|
|
const renderActionbar = (showRunProgressBar: boolean) => {
|
|
const topMenuContainer = document.createElement('div')
|
|
document.body.appendChild(topMenuContainer)
|
|
|
|
const pinia = createTestingPinia({ createSpy: vi.fn })
|
|
configureSettings(pinia, showRunProgressBar)
|
|
|
|
render(ComfyActionbar, {
|
|
container: document.body.appendChild(document.createElement('div')),
|
|
props: {
|
|
topMenuContainer,
|
|
queueOverlayExpanded: false
|
|
},
|
|
global: {
|
|
plugins: [pinia, i18n],
|
|
stubs: {
|
|
ContextMenu: {
|
|
name: 'ContextMenu',
|
|
template: '<div />'
|
|
},
|
|
Panel: {
|
|
name: 'Panel',
|
|
template: '<div><slot /></div>'
|
|
},
|
|
StatusBadge: true,
|
|
ComfyRunButton: {
|
|
name: 'ComfyRunButton',
|
|
template: '<button type="button">Run</button>'
|
|
},
|
|
QueueInlineProgress: true
|
|
},
|
|
directives: {
|
|
tooltip: () => {}
|
|
}
|
|
}
|
|
})
|
|
|
|
return { topMenuContainer }
|
|
}
|
|
|
|
describe('ComfyActionbar', () => {
|
|
beforeEach(() => {
|
|
i18n.global.locale.value = 'en'
|
|
localStorage.clear()
|
|
})
|
|
|
|
it('teleports inline progress when run progress bar is enabled', async () => {
|
|
const { topMenuContainer } = renderActionbar(true)
|
|
|
|
try {
|
|
await nextTick()
|
|
|
|
/* eslint-disable testing-library/no-node-access -- Teleport target verification requires scoping to the container element */
|
|
expect(
|
|
topMenuContainer.querySelector('[data-testid="queue-inline-progress"]')
|
|
).not.toBeNull()
|
|
/* eslint-enable testing-library/no-node-access */
|
|
} finally {
|
|
topMenuContainer.remove()
|
|
}
|
|
})
|
|
|
|
it('does not teleport inline progress when run progress bar is disabled', async () => {
|
|
const { topMenuContainer } = renderActionbar(false)
|
|
|
|
try {
|
|
await nextTick()
|
|
|
|
/* eslint-disable testing-library/no-node-access -- Teleport target verification requires scoping to the container element */
|
|
expect(
|
|
topMenuContainer.querySelector('[data-testid="queue-inline-progress"]')
|
|
).toBeNull()
|
|
/* eslint-enable testing-library/no-node-access */
|
|
} finally {
|
|
topMenuContainer.remove()
|
|
}
|
|
})
|
|
})
|