import { describe, it, expect, beforeEach, vi } from 'vitest'; import { mount, flushPromises } from '@vue/test-utils'; import { createPinia, setActivePinia } from 'pinia'; import { createRouter, createMemoryHistory } from 'vue-router'; import PageView from '../views/PageView.vue'; async function createTestRouter(path = '/pages/test-page') { const router = createRouter({ history: createMemoryHistory(), routes: [ { path: '/', name: 'home', component: { template: '
' } }, { path: '/pages/:slug', name: 'page', component: { template: '
' } }, ], }); router.push(path); await router.isReady(); return router; } describe('PageView', () => { let pinia: ReturnType; let router: Awaited>; beforeEach(async () => { pinia = createPinia(); setActivePinia(pinia); router = await createTestRouter(); }); function mountPage() { return mount(PageView, { global: { plugins: [pinia, router] }, }); } it('shows loading skeleton initially', () => { const wrapper = mountPage(); expect(wrapper.find('.animate-pulse').exists()).toBe(true); }); it('renders breadcrumb navigation', () => { const wrapper = mountPage(); expect(wrapper.text()).toContain('Home'); }); it('shows page not found when fetch fails', async () => { globalThis.fetch = vi.fn().mockResolvedValue({ ok: false }); const wrapper = mountPage(); await flushPromises(); expect(wrapper.text()).toContain('Page Not Found'); expect(wrapper.text()).toContain('test-page'); }); it('shows go home link on not found', async () => { globalThis.fetch = vi.fn().mockResolvedValue({ ok: false }); const wrapper = mountPage(); await flushPromises(); const homeLink = wrapper.findAll('a').find(a => a.text() === 'Go Home'); expect(homeLink).toBeDefined(); }); it('renders page content when loaded', async () => { globalThis.fetch = vi.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve({ title: 'About Us', html: '

Hello world

' }), }); const wrapper = mountPage(); await flushPromises(); expect(wrapper.text()).toContain('About Us'); expect(wrapper.text()).toContain('Hello world'); }); it('renders page title in breadcrumb', async () => { globalThis.fetch = vi.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve({ title: 'About Us', html: '

Content

' }), }); const wrapper = mountPage(); await flushPromises(); const breadcrumb = wrapper.find('nav[aria-label="Breadcrumb"]'); expect(breadcrumb.text()).toContain('About Us'); }); });