import { describe, it, expect, beforeEach } from 'vitest' import { setActivePinia, createPinia } from 'pinia' import router from '@/router' describe('Router', () => { beforeEach(() => { setActivePinia(createPinia()) localStorage.clear() }) it('resolves / to HomePage', async () => { await router.push('/') await router.isReady() expect(router.currentRoute.value.name).toBe('home') }) it('resolves /registrera to RegisterPage', async () => { await router.push('/registrera') await router.isReady() expect(router.currentRoute.value.name).toBe('register') }) it('resolves /logga-in to LoginPage', async () => { await router.push('/logga-in') await router.isReady() expect(router.currentRoute.value.name).toBe('login') }) it('resolves /glomt-losenord to ForgotPasswordPage', async () => { await router.push('/glomt-losenord') await router.isReady() expect(router.currentRoute.value.name).toBe('forgot-password') }) it('resolves /integritetspolicy to PrivacyPolicyPage', async () => { await router.push('/integritetspolicy') await router.isReady() expect(router.currentRoute.value.name).toBe('privacy') }) it('resolves /villkor to TermsOfServicePage', async () => { await router.push('/villkor') await router.isReady() expect(router.currentRoute.value.name).toBe('terms') }) it('resolves /aterstall-losenord to ResetPasswordPage', async () => { await router.push('/aterstall-losenord?token=abc') await router.isReady() expect(router.currentRoute.value.name).toBe('reset-password') }) it('resolves /orders to OrdersPage', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/orders') await router.isReady() expect(router.currentRoute.value.name).toBe('orders') }) it('resolves /andra-losenord to ChangePasswordPage when authenticated', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/andra-losenord') await router.isReady() expect(router.currentRoute.value.name).toBe('change-password') }) it('resolves /admin to AdminPage for admin user', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'admin' })) await router.push('/admin') await router.isReady() expect(router.currentRoute.value.name).toBe('admin') }) it('does not crash on unknown route', async () => { await router.push('/nonexistent') await router.isReady() expect(router.currentRoute.value.matched.length).toBe(0) }) }) describe('Router guards', () => { beforeEach(() => { setActivePinia(createPinia()) localStorage.clear() }) it('redirects unauthenticated user from /compose to /logga-in', async () => { await router.push('/compose') await router.isReady() expect(router.currentRoute.value.name).toBe('login') expect(router.currentRoute.value.query.redirect).toBe('/compose') }) it('redirects unauthenticated user from /orders to /logga-in', async () => { await router.push('/orders') await router.isReady() expect(router.currentRoute.value.name).toBe('login') expect(router.currentRoute.value.query.redirect).toBe('/orders') }) it('redirects unauthenticated user from /andra-losenord to /logga-in', async () => { await router.push('/andra-losenord') await router.isReady() expect(router.currentRoute.value.name).toBe('login') expect(router.currentRoute.value.query.redirect).toBe('/andra-losenord') }) it('redirects unauthenticated user from /admin to /logga-in', async () => { await router.push('/admin') await router.isReady() expect(router.currentRoute.value.name).toBe('login') expect(router.currentRoute.value.query.redirect).toBe('/admin') }) it('allows authenticated user to access /compose', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/compose') await router.isReady() expect(router.currentRoute.value.name).toBe('compose') }) it('allows authenticated user to access /orders', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/orders') await router.isReady() expect(router.currentRoute.value.name).toBe('orders') }) it('redirects authenticated user from /logga-in to home', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/logga-in') await router.isReady() expect(router.currentRoute.value.name).toBe('home') }) it('redirects authenticated user from /registrera to home', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/registrera') await router.isReady() expect(router.currentRoute.value.name).toBe('home') }) it('redirects authenticated user from /glomt-losenord to home', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/glomt-losenord') await router.isReady() expect(router.currentRoute.value.name).toBe('home') }) it('redirects authenticated user from /aterstall-losenord to home', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/aterstall-losenord?token=abc') await router.isReady() expect(router.currentRoute.value.name).toBe('home') }) it('allows unauthenticated user to access reset password with token', async () => { await router.push('/aterstall-losenord?token=abc') await router.isReady() expect(router.currentRoute.value.name).toBe('reset-password') }) it('redirects non-admin user from /admin to home', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'user' })) await router.push('/admin') await router.isReady() expect(router.currentRoute.value.name).toBe('home') }) it('allows admin user to access /admin', async () => { localStorage.setItem('auth_token', makeJwt({ role: 'admin' })) await router.push('/admin') await router.isReady() expect(router.currentRoute.value.name).toBe('admin') }) }) function makeJwt(payload: Record): string { const header = btoa(JSON.stringify({ alg: 'HS256', typ: 'JWT' })) const body = btoa(JSON.stringify(payload)) const signature = 'test-sig' return `${header}.${body}.${signature}` }