73 lines
2.3 KiB
TypeScript
73 lines
2.3 KiB
TypeScript
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')
|
|
})
|
|
})
|