import { describe, it, expect, vi, beforeEach } from 'vitest' import { mount } from '@vue/test-utils' import ElementPlus from 'element-plus' import { ElMessage } from 'element-plus' import MyHead from '@/components/MyHead.vue' import router from '@/router' import { logout } from '@/api/login' vi.mock('@/api/login', () => ({ login: vi.fn(), logout: vi.fn(), })) async function mountAt(path: string) { await router.push(path) await router.isReady() return mount(MyHead, { shallow: true, global: { plugins: [ElementPlus, router], }, }) } describe('MyHead.vue', () => { beforeEach(async () => { vi.clearAllMocks() localStorage.clear() await router.push('/login') await router.isReady() }) it('derives route-based computed properties from real route', async () => { const loginWrapper = await mountAt('/login') expect(loginWrapper.vm.isLoginRoute).toBe(true) expect(loginWrapper.vm.showBackButton).toBe(false) localStorage.setItem('isLoggedIn', 'true') const studyWrapper = await mountAt('/study') expect(studyWrapper.vm.isLoginRoute).toBe(false) expect(studyWrapper.vm.showBackButton).toBe(true) expect(studyWrapper.vm.pageTitle).toBe('学习任务') const welcomeWrapper = await mountAt('/welcome') expect(welcomeWrapper.vm.showBackButton).toBe(false) expect(welcomeWrapper.vm.pageTitle).toBeUndefined() }) it('clears login state and navigates to login on logout', async () => { vi.mocked(logout).mockResolvedValue({ code: 200 } as any) localStorage.setItem('isLoggedIn', 'true') const wrapper = await mountAt('/study') await wrapper.vm.handleLogout() expect(localStorage.getItem('isLoggedIn')).toBeNull() expect(ElMessage.success).toHaveBeenCalledWith('已退出登录') expect(router.currentRoute.value.path).toBe('/login') }) it('clears login state even when logout API fails', async () => { vi.mocked(logout).mockRejectedValue(new Error('Network error')) localStorage.setItem('isLoggedIn', 'true') const wrapper = await mountAt('/study') await wrapper.vm.handleLogout() expect(localStorage.getItem('isLoggedIn')).toBeNull() expect(ElMessage.success).toHaveBeenCalledWith('已退出登录') expect(router.currentRoute.value.path).toBe('/login') }) })