import { describe, it, expect } from 'vitest' import { mountSuspended, registerEndpoint } from '@nuxt/test-utils/runtime' import DefaultLayout from '../../app/layouts/default.vue' import NavDrawer from '../../app/components/NavDrawer.vue' const withAuth = () => { registerEndpoint('/api/me', () => ({ id: '1', identifier: 'user', role: 'member', avatar_url: null }), { method: 'GET' }) } describe('default layout', () => { it('renders KestrelOS header', async () => { withAuth() const wrapper = await mountSuspended(DefaultLayout) expect(wrapper.text()).toContain('KestrelOS') }) it('renders drawer toggle with accessible label on mobile', async () => { withAuth() const wrapper = await mountSuspended(DefaultLayout) const toggle = wrapper.find('button[aria-label="Toggle navigation"]') expect(toggle.exists()).toBe(true) }) it('renders NavDrawer', async () => { withAuth() const wrapper = await mountSuspended(DefaultLayout) expect(wrapper.findComponent(NavDrawer).exists()).toBe(true) }) it('renders user menu and sign out navigates home', async () => { withAuth() registerEndpoint('/api/auth/logout', () => null, { method: 'POST' }) const wrapper = await mountSuspended(DefaultLayout) await new Promise(r => setTimeout(r, 100)) const menuTrigger = wrapper.find('button[aria-label="User menu"]') expect(menuTrigger.exists()).toBe(true) await menuTrigger.trigger('click') await new Promise(r => setTimeout(r, 50)) const signOut = wrapper.find('button[role="menuitem"]') expect(signOut.exists()).toBe(true) expect(signOut.text()).toContain('Sign out') await signOut.trigger('click') await new Promise(r => setTimeout(r, 100)) const router = useRouter() await router.isReady() expect(router.currentRoute.value.path).toBe('/') }) })