bilhej/frontend/src/__tests__/Router.spec.ts
Joakim Mörling a12e07ec1c
All checks were successful
CI / Lint, type check, unit tests, coverage (pull_request) Successful in 2m4s
CI / E2E browser tests (pull_request) Successful in 57s
Register routes for integritetspolicy and villkor legal pages.
- Add /integritetspolicy and /villkor to Vue Router
- Add Router tests confirming both public legal routes resolve

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 13:51:20 +02:00

183 lines
6.3 KiB
TypeScript

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, unknown>): string {
const header = btoa(JSON.stringify({ alg: 'HS256', typ: 'JWT' }))
const body = btoa(JSON.stringify(payload))
const signature = 'test-sig'
return `${header}.${body}.${signature}`
}