mirror of
https://github.com/Comfy-Org/ComfyUI_frontend.git
synced 2026-03-08 06:30:04 +00:00
## Summary Redesigned node search with categories ## Changes - **What**: Adds a v2 search component, leaving the existing implementation untouched - It also brings onboard the incomplete node library & preview changes, disabled and behind a hidden setting - **Breaking**: Changes the 'default' value of the node search setting to v2, adding v1 (legacy) as an option ## Screenshots (if applicable) https://github.com/user-attachments/assets/2ab797df-58f0-48e8-8b20-2a1809e3735f ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-8987-V2-Node-Search-hidden-Node-Library-changes-30c6d73d36508160902bcb92553f147c) by [Unito](https://www.unito.io) --------- Co-authored-by: Yourz <crazilou@vip.qq.com> Co-authored-by: Amp <amp@ampcode.com> Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: GitHub Action <action@github.com> Co-authored-by: Christian Byrne <cbyrne@comfy.org>
91 lines
2.5 KiB
TypeScript
91 lines
2.5 KiB
TypeScript
import { mount } from '@vue/test-utils'
|
|
import { describe, expect, it, vi } from 'vitest'
|
|
import { createI18n } from 'vue-i18n'
|
|
|
|
import SearchBoxV2 from './SearchBoxV2.vue'
|
|
|
|
vi.mock('@vueuse/core', () => ({
|
|
watchDebounced: vi.fn(() => vi.fn())
|
|
}))
|
|
|
|
describe('SearchBoxV2', () => {
|
|
const i18n = createI18n({
|
|
legacy: false,
|
|
locale: 'en',
|
|
messages: {
|
|
en: {
|
|
g: {
|
|
clear: 'Clear',
|
|
searchPlaceholder: 'Search...'
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
function mountComponent(props = {}) {
|
|
return mount(SearchBoxV2, {
|
|
global: {
|
|
plugins: [i18n],
|
|
stubs: {
|
|
ComboboxRoot: {
|
|
template: '<div><slot /></div>'
|
|
},
|
|
ComboboxAnchor: {
|
|
template: '<div><slot /></div>'
|
|
},
|
|
ComboboxInput: {
|
|
template:
|
|
'<input :placeholder="placeholder" :value="modelValue" @input="$emit(\'update:modelValue\', $event.target.value)" />',
|
|
props: ['placeholder', 'modelValue', 'autoFocus']
|
|
}
|
|
}
|
|
},
|
|
props: {
|
|
modelValue: '',
|
|
...props
|
|
}
|
|
})
|
|
}
|
|
|
|
it('uses i18n placeholder when no placeholder prop provided', () => {
|
|
const wrapper = mountComponent()
|
|
const input = wrapper.find('input')
|
|
expect(input.attributes('placeholder')).toBe('Search...')
|
|
})
|
|
|
|
it('uses custom placeholder when provided', () => {
|
|
const wrapper = mountComponent({
|
|
placeholder: 'Custom placeholder'
|
|
})
|
|
const input = wrapper.find('input')
|
|
expect(input.attributes('placeholder')).toBe('Custom placeholder')
|
|
})
|
|
|
|
it('shows search icon when search term is empty', () => {
|
|
const wrapper = mountComponent({ modelValue: '' })
|
|
expect(wrapper.find('i.icon-\\[lucide--search\\]').exists()).toBe(true)
|
|
})
|
|
|
|
it('shows clear button when search term is not empty', () => {
|
|
const wrapper = mountComponent({ modelValue: 'test' })
|
|
expect(wrapper.find('button').exists()).toBe(true)
|
|
})
|
|
|
|
it('clears search term when clear button is clicked', async () => {
|
|
const wrapper = mountComponent({ modelValue: 'test' })
|
|
const clearButton = wrapper.find('button')
|
|
await clearButton.trigger('click')
|
|
expect(wrapper.emitted('update:modelValue')?.[0]).toEqual([''])
|
|
})
|
|
|
|
it('applies large size classes when size is lg', () => {
|
|
const wrapper = mountComponent({ size: 'lg' })
|
|
expect(wrapper.html()).toContain('size-5')
|
|
})
|
|
|
|
it('applies medium size classes when size is md', () => {
|
|
const wrapper = mountComponent({ size: 'md' })
|
|
expect(wrapper.html()).toContain('size-4')
|
|
})
|
|
})
|