// @vitest-environment jsdom import { beforeEach, describe, expect, it, vi } from 'vitest' import { mount } from '@vue/test-utils' const openSessionSearchMock = vi.hoisted(() => vi.fn()) vi.mock('@/composables/useSessionSearch', () => ({ useSessionSearch: () => ({ openSessionSearch: openSessionSearchMock, }), })) vi.mock('@/stores/hermes/app', () => ({ useAppStore: () => ({ sidebarOpen: true, connected: true, serverVersion: 'test', updateAvailable: false, updating: false, toggleSidebar: vi.fn(), closeSidebar: vi.fn(), doUpdate: vi.fn(), }), })) vi.mock('vue-router', async (importOriginal) => { const actual = await importOriginal() return { ...actual, useRoute: () => ({ name: 'hermes.chat' }), useRouter: () => ({ push: vi.fn() }), } }) vi.mock('vue-i18n', () => ({ useI18n: () => ({ t: (key: string) => key, }), })) vi.mock('@/composables/useTheme', () => ({ useTheme: () => ({ isDark: false }), })) vi.mock('/logo.png', () => ({ default: 'logo.png', })) vi.mock('naive-ui', async () => { const actual = await vi.importActual('naive-ui') return { ...actual, useMessage: () => ({ success: vi.fn(), error: vi.fn(), }), NButton: { template: '', }, NSelect: { template: '
', }, } }) import AppSidebar from '@/components/layout/AppSidebar.vue' describe('AppSidebar search entry', () => { beforeEach(() => { openSessionSearchMock.mockClear() }) it('opens the session search modal from the sidebar button', async () => { const wrapper = mount(AppSidebar, { global: { stubs: { ProfileSelector: true, ModelSelector: true, LanguageSwitch: true, ThemeSwitch: true, NButton: true, }, }, }) const buttons = wrapper.findAll('button') const searchButton = buttons.find(node => node.text().includes('sidebar.search')) expect(searchButton).toBeTruthy() await searchButton!.trigger('click') expect(openSessionSearchMock).toHaveBeenCalledTimes(1) }) })