blob: de89c3436933dc789a6253d6b0b43e9c46577201 [file] [log] [blame]
ybt02e716d2025-04-15 17:19:32 +08001import { describe, it, expect, vi, beforeEach } from 'vitest';
2import { render, screen } from '@testing-library/react';
3import userEvent from '@testing-library/user-event';
4import { BrowserRouter } from 'react-router-dom';
5import App from './App';
6
7// 模拟 react-router-dom 的 useNavigate
8vi.mock('react-router-dom', async () => {
9 const actual = await vi.importActual('react-router-dom');
10 return {
11 ...actual,
12 useNavigate: () => vi.fn(),
13 };
14});
15
16describe('App 组件', () => {
17 beforeEach(() => {
18 // 清除 localStorage
19 window.localStorage.clear();
20 });
21
22 it('应该渲染网站标题', () => {
23 render(
24 <BrowserRouter>
25 <App />
26 </BrowserRouter>
27 );
28
29 expect(screen.getByText('PT网站')).toBeInTheDocument();
30 expect(screen.getByText('欢迎来到PT网站')).toBeInTheDocument();
31 });
32
33 it('当用户未登录时应该显示游客角色', () => {
34 render(
35 <BrowserRouter>
36 <App />
37 </BrowserRouter>
38 );
39
40 expect(screen.getByText('(游客)')).toBeInTheDocument();
41 });
42
43 it('当用户是管理员时应该显示管理面板菜单', () => {
44 // 模拟管理员登录
45 window.localStorage.setItem('user', JSON.stringify({
46 username: 'admin',
47 role: 'admin',
48 avatar: 'avatar-url'
49 }));
50
51 render(
52 <BrowserRouter>
53 <App />
54 </BrowserRouter>
55 );
56
57 expect(screen.getByText('管理面板')).toBeInTheDocument();
58 expect(screen.getByText('管理员专区')).toBeInTheDocument();
59 });
60
61 it('当用户是版主时应该显示版主专区', () => {
62 // 模拟版主登录
63 window.localStorage.setItem('user', JSON.stringify({
64 username: 'moderator',
65 role: 'moderator',
66 avatar: 'avatar-url'
67 }));
68
69 render(
70 <BrowserRouter>
71 <App />
72 </BrowserRouter>
73 );
74
75 expect(screen.getByText('版主专区')).toBeInTheDocument();
76 });
77});