import { describe, expect, test, vi, beforeEach } from 'vitest'; import { mount } from '@vue/test-utils'; import { createVuetify } from 'vuetify'; import CommandPalette from '../../resources/js/components/layout/CommandPalette.vue'; import { useCommandPalette } from '../../resources/js/composables/useCommandPalette'; const pushMock = vi.fn(); vi.mock('vue-router', () => ({ useRouter: () => ({ push: pushMock }), })); const vuetify = createVuetify(); function mountPalette() { return mount(CommandPalette, { global: { plugins: [vuetify], stubs: { VDialog: { template: '
' } }, }, }); } describe('CommandPalette (B3)', () => { beforeEach(() => { pushMock.mockClear(); useCommandPalette().closePalette(); // сброс singleton между тестами }); test('по умолчанию показывает все 8 разделов', () => { const wrapper = mountPalette(); expect(wrapper.vm.filteredItems).toHaveLength(8); }); test('фильтрует по подстроке (case-insensitive)', () => { const wrapper = mountPalette(); wrapper.vm.query = 'КАНБ'; expect(wrapper.vm.filteredItems).toHaveLength(1); expect(wrapper.vm.filteredItems[0].to).toBe('/kanban'); }); test('пустой результат при отсутствии совпадений', () => { const wrapper = mountPalette(); wrapper.vm.query = 'zzzнеттакого'; expect(wrapper.vm.filteredItems).toHaveLength(0); }); test('selectItem навигирует и закрывает палитру', () => { const { open } = useCommandPalette(); open.value = true; const wrapper = mountPalette(); wrapper.vm.selectItem({ title: 'Сделки', icon: 'x', to: '/deals' }); expect(pushMock).toHaveBeenCalledWith('/deals'); expect(open.value).toBe(false); }); test('onSubmit навигирует на первый отфильтрованный результат', () => { const wrapper = mountPalette(); wrapper.vm.query = 'отч'; wrapper.vm.onSubmit(); expect(pushMock).toHaveBeenCalledWith('/reports'); }); test('рендерит 8 пунктов списка по умолчанию', () => { const wrapper = mountPalette(); expect(wrapper.findAll('[data-testid="command-palette-item"]')).toHaveLength(8); }); test('показывает пустое состояние при отсутствии совпадений', async () => { const wrapper = mountPalette(); wrapper.vm.query = 'zzzнеттакого'; await wrapper.vm.$nextTick(); expect(wrapper.find('[data-testid="command-palette-empty"]').exists()).toBe(true); }); });