f0746d06db
- 删除 novalon 前端 src/ 下所有文件 - 从 gym-manage 复制前端 src/ 完整目录树 - 替换 gym-manage-api → novalon-manage-api - 替换 gym_system → manage_system - 无 gym 残留引用
262 lines
6.2 KiB
TypeScript
262 lines
6.2 KiB
TypeScript
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
|
|
import { mount } from '@vue/test-utils'
|
|
import { createRouter, createMemoryHistory } from 'vue-router'
|
|
import Dashboard from '@/views/system/Dashboard.vue'
|
|
|
|
vi.mock('vue-router')
|
|
vi.mock('@/api/user.api.ts', () => ({
|
|
getUserStats: vi.fn(),
|
|
getRecentLogins: vi.fn(),
|
|
}))
|
|
|
|
describe('Dashboard Component', () => {
|
|
let router: any
|
|
let wrapper: any
|
|
|
|
beforeEach(() => {
|
|
router = createRouter({
|
|
history: createMemoryHistory(),
|
|
routes: [
|
|
{ path: '/', component: { template: '<div>Dashboard</div>' } },
|
|
],
|
|
})
|
|
|
|
vi.clearAllMocks()
|
|
})
|
|
|
|
afterEach(() => {
|
|
if (wrapper) {
|
|
wrapper.unmount()
|
|
}
|
|
})
|
|
|
|
describe('component initialization', () => {
|
|
it('should render dashboard container', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.find('.dashboard').exists()).toBe(true)
|
|
})
|
|
|
|
it('should initialize with loading state', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.loading).toBe(true)
|
|
})
|
|
|
|
it('should initialize with empty stats', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.stats).toEqual({
|
|
userCount: 0,
|
|
roleCount: 0,
|
|
todayLogin: 0,
|
|
operationLog: 0,
|
|
})
|
|
})
|
|
})
|
|
|
|
describe('statistics cards', () => {
|
|
it('should render user count card', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.stats.userCount).toBeDefined()
|
|
})
|
|
|
|
it('should render role count card', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.stats.roleCount).toBeDefined()
|
|
})
|
|
|
|
it('should render today login card', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.stats.todayLogin).toBeDefined()
|
|
})
|
|
|
|
it('should render operation log card', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.stats.operationLog).toBeDefined()
|
|
})
|
|
})
|
|
|
|
describe('recent logins', () => {
|
|
it('should initialize with empty recent logins', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.recentLogins).toEqual([])
|
|
})
|
|
|
|
it('should display empty state when no recent logins', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.recentLogins.length).toBe(0)
|
|
})
|
|
})
|
|
|
|
describe('data loading', () => {
|
|
it('should set loading to false after data loaded', async () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.vm.loading).toBe(true)
|
|
|
|
wrapper.vm.loading = false
|
|
await wrapper.vm.$nextTick()
|
|
|
|
expect(wrapper.vm.loading).toBe(false)
|
|
})
|
|
})
|
|
|
|
describe('document title', () => {
|
|
it('should have dashboard component mounted', () => {
|
|
wrapper = mount(Dashboard, {
|
|
global: {
|
|
plugins: [router],
|
|
stubs: {
|
|
'el-row': true,
|
|
'el-col': true,
|
|
'el-card': true,
|
|
'el-statistic': true,
|
|
'el-icon': true,
|
|
'el-timeline': true,
|
|
'el-timeline-item': true,
|
|
},
|
|
},
|
|
})
|
|
|
|
expect(wrapper.exists()).toBe(true)
|
|
})
|
|
})
|
|
})
|