blob: 4bd690ec89e4bed1d7fece72b48faa11df652f09 [file] [log] [blame]
import SelfStatus from '@/components/selfStatus/selfStatus';
import { render, screen } from '@testing-library/react';
import { useSelector } from 'react-redux';
import React from 'react';
import '@testing-library/jest-dom';
import { useAppSelector } from '@/hooks/store';
jest.mock('@/hooks/request', () => ({
useApi: jest.fn(),
}));
// 模拟所有外部依赖
jest.mock('@/hooks/store', () => ({
useAppDispatch: jest.fn(),
useAppSelector: jest.fn(),
}));
jest.mock('react-router', () => ({
useNavigate: jest.fn(),
}));
jest.mock('react-redux', () => ({
useSelector: jest.fn(),
}));
describe('SelfStatus Component', () => {
it('renders correctly', () => {
(useAppSelector as jest.Mock).mockImplementation((selector) => selector({
user: {
userId: '001',
userName: 'san3yuan',
role: 'manager',
uploadTraffic: 0,
downloadTraffic: 0,
downloadPoints: 0,
},
setting: {
theme: 'light',
},
}));
render(<SelfStatus />);
expect(screen.getByText('san3yuan')).toBeInTheDocument();
expect(screen.getByText('用户组: manager')).toBeInTheDocument();
expect(screen.getByText('上传量: 0')).toBeInTheDocument();
expect(screen.getByText('下载量: 0')).toBeInTheDocument();
expect(screen.getByText('下载积分: 0')).toBeInTheDocument();
})
it('calculates and displays share ratio correctly', () => {
(useAppSelector as jest.Mock).mockImplementation((selector) => selector({
user: {
uploadTraffic: 100,
downloadTraffic: 50,
},
}));
render(<SelfStatus />);
expect(screen.getByText('分享率: 2.00')).toBeInTheDocument();
});
it('handles empty data gracefully', () => {
(useAppSelector as jest.Mock).mockImplementation((selector) => selector({
user: {
userName: '',
role: '',
uploadTraffic: null,
downloadTraffic: null,
downloadPoints: null,
},
}));
render(<SelfStatus />);
expect(screen.getByText('用户组: N/A')).toBeInTheDocument();
expect(screen.getByText('上传量: 0')).toBeInTheDocument();
expect(screen.getByText('下载量: 0')).toBeInTheDocument();
expect(screen.getByText('分享率: N/A')).toBeInTheDocument();
expect(screen.getByText('下载积分: 0')).toBeInTheDocument();
});
});