Resolve router conflict: keep /bekrafta-epost confirm route alongside master's /om-oss about page and /om redirect. Co-authored-by: Cursor <cursoragent@cursor.com>
203 lines
7.1 KiB
TypeScript
203 lines
7.1 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 /andra-epost to ChangeEmailPage when authenticated', async () => {
|
|
localStorage.setItem('auth_token', makeJwt({ role: 'user' }))
|
|
await router.push('/andra-epost')
|
|
await router.isReady()
|
|
expect(router.currentRoute.value.name).toBe('change-email')
|
|
})
|
|
|
|
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 /andra-epost to /logga-in', async () => {
|
|
await router.push('/andra-epost')
|
|
await router.isReady()
|
|
expect(router.currentRoute.value.name).toBe('login')
|
|
expect(router.currentRoute.value.query.redirect).toBe('/andra-epost')
|
|
})
|
|
|
|
it('resolves /bekrafta-epost to ConfirmEmailChangePage', async () => {
|
|
await router.push('/bekrafta-epost?token=abc')
|
|
await router.isReady()
|
|
expect(router.currentRoute.value.name).toBe('confirm-email-change')
|
|
})
|
|
|
|
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}`
|
|
}
|