91 lines
2.8 KiB
TypeScript
91 lines
2.8 KiB
TypeScript
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
import { createRouter, createMemoryHistory } from 'vue-router'
|
|
|
|
// We test the guard logic by importing the router and simulating navigation
|
|
// The router in src/router/index.ts uses createWebHistory which requires DOM,
|
|
// so we'll test the guard logic by recreating the key patterns.
|
|
|
|
describe('route guards', () => {
|
|
beforeEach(() => {
|
|
localStorage.clear()
|
|
vi.restoreAllMocks()
|
|
})
|
|
|
|
function buildRouter() {
|
|
return createRouter({
|
|
history: createMemoryHistory(),
|
|
routes: [
|
|
{ path: '/login', component: { template: '<div/>' }, meta: { requiresAuth: false } },
|
|
{ path: '/welcome', component: { template: '<div/>' }, meta: { requiresAuth: true } },
|
|
{ path: '/study', component: { template: '<div/>' }, meta: { requiresAuth: true } },
|
|
{ path: '/', redirect: '/login' },
|
|
],
|
|
})
|
|
}
|
|
|
|
it('redirects unauthenticated user from protected route to /login', async () => {
|
|
const router = buildRouter()
|
|
router.beforeEach((to, _from, next) => {
|
|
const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'
|
|
if (to.meta.requiresAuth && !isLoggedIn) {
|
|
next({ path: '/login' })
|
|
} else {
|
|
next()
|
|
}
|
|
})
|
|
|
|
await router.push('/welcome')
|
|
await router.isReady()
|
|
expect(router.currentRoute.value.path).toBe('/login')
|
|
})
|
|
|
|
it('allows authenticated user to access protected route', async () => {
|
|
localStorage.setItem('isLoggedIn', 'true')
|
|
const router = buildRouter()
|
|
router.beforeEach((to, _from, next) => {
|
|
const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'
|
|
if (to.meta.requiresAuth && !isLoggedIn) {
|
|
next({ path: '/login' })
|
|
} else {
|
|
next()
|
|
}
|
|
})
|
|
|
|
await router.push('/welcome')
|
|
await router.isReady()
|
|
expect(router.currentRoute.value.path).toBe('/welcome')
|
|
})
|
|
|
|
it('allows unauthenticated access to /login', async () => {
|
|
const router = buildRouter()
|
|
router.beforeEach((to, _from, next) => {
|
|
const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'
|
|
if (to.meta.requiresAuth && !isLoggedIn) {
|
|
next({ path: '/login' })
|
|
} else {
|
|
next()
|
|
}
|
|
})
|
|
|
|
await router.push('/login')
|
|
await router.isReady()
|
|
expect(router.currentRoute.value.path).toBe('/login')
|
|
})
|
|
|
|
it('root path redirects to /login', async () => {
|
|
const router = buildRouter()
|
|
router.beforeEach((to, _from, next) => {
|
|
const isLoggedIn = localStorage.getItem('isLoggedIn') === 'true'
|
|
if (to.meta.requiresAuth && !isLoggedIn) {
|
|
next({ path: '/login' })
|
|
} else {
|
|
next()
|
|
}
|
|
})
|
|
|
|
await router.push('/')
|
|
await router.isReady()
|
|
expect(router.currentRoute.value.path).toBe('/login')
|
|
})
|
|
})
|