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: '
' }, meta: { requiresAuth: false } }, { path: '/welcome', component: { template: '' }, meta: { requiresAuth: true } }, { path: '/study', component: { template: '' }, 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') }) })