/** * ProgressBar 组件测试 * 测试覆盖: ProgressBar, CircularProgress */ import { render, screen } from '@testing-library/react'; import { describe, it, expect } from 'vitest'; import { ProgressBar, CircularProgress } from './ProgressBar'; describe('ProgressBar', () => { // ==================== 基础渲染测试 ==================== describe('基础渲染', () => { it('渲染进度条', () => { const { container } = render(); expect(container.querySelector('.bg-bg-elevated')).toBeInTheDocument(); }); it('正确计算进度百分比', () => { const { container } = render(); const progressFill = container.querySelector('.bg-accent-indigo'); expect(progressFill).toHaveStyle({ width: '75%' }); }); }); // ==================== Value 边界测试 ==================== describe('Value 边界值', () => { it('0% 进度', () => { const { container } = render(); const progressFill = container.querySelector('.bg-accent-indigo'); expect(progressFill).toHaveStyle({ width: '0%' }); }); it('100% 进度', () => { const { container } = render(); const progressFill = container.querySelector('.bg-accent-indigo'); expect(progressFill).toHaveStyle({ width: '100%' }); }); it('超过 100% 限制为 100%', () => { const { container } = render(); const progressFill = container.querySelector('.bg-accent-indigo'); expect(progressFill).toHaveStyle({ width: '100%' }); }); it('负值限制为 0%', () => { const { container } = render(); const progressFill = container.querySelector('.bg-accent-indigo'); expect(progressFill).toHaveStyle({ width: '0%' }); }); }); // ==================== Max 测试 ==================== describe('Max 属性', () => { it('自定义 max 值计算正确', () => { const { container } = render(); const progressFill = container.querySelector('.bg-accent-indigo'); expect(progressFill).toHaveStyle({ width: '50%' }); // 25/50 = 50% }); it('默认 max 为 100', () => { const { container } = render(); const progressFill = container.querySelector('.bg-accent-indigo'); expect(progressFill).toHaveStyle({ width: '30%' }); }); }); // ==================== ShowLabel 测试 ==================== describe('ShowLabel 属性', () => { it('showLabel=true 显示标签', () => { render(); expect(screen.getByText('进度')).toBeInTheDocument(); expect(screen.getByText('50%')).toBeInTheDocument(); }); it('showLabel=false 不显示标签(默认)', () => { render(); expect(screen.queryByText('进度')).not.toBeInTheDocument(); }); it('标签显示四舍五入的百分比', () => { render(); expect(screen.getByText('34%')).toBeInTheDocument(); }); }); // ==================== Size 测试 ==================== describe('Size 样式', () => { it('sm size', () => { const { container } = render(); expect(container.querySelector('.h-1')).toBeInTheDocument(); }); it('md size(默认)', () => { const { container } = render(); expect(container.querySelector('.h-2')).toBeInTheDocument(); }); it('lg size', () => { const { container } = render(); expect(container.querySelector('.h-3')).toBeInTheDocument(); }); }); // ==================== Variant 测试 ==================== describe('Variant 样式', () => { it('default variant(默认)', () => { const { container } = render(); expect(container.querySelector('.bg-accent-indigo')).toBeInTheDocument(); }); it('success variant', () => { const { container } = render(); expect(container.querySelector('.bg-accent-green')).toBeInTheDocument(); }); it('warning variant', () => { const { container } = render(); expect(container.querySelector('.bg-accent-amber')).toBeInTheDocument(); }); it('error variant', () => { const { container } = render(); expect(container.querySelector('.bg-accent-coral')).toBeInTheDocument(); }); }); // ==================== ClassName 测试 ==================== describe('ClassName', () => { it('支持自定义 className', () => { const { container } = render(); expect(container.firstChild).toHaveClass('custom-progress'); }); }); }); describe('CircularProgress', () => { // ==================== 基础渲染测试 ==================== describe('基础渲染', () => { it('渲染 SVG 环形进度', () => { const { container } = render(); expect(container.querySelector('svg')).toBeInTheDocument(); }); it('渲染两个圆(背景和进度)', () => { const { container } = render(); const circles = container.querySelectorAll('circle'); expect(circles).toHaveLength(2); }); }); // ==================== Value 测试 ==================== describe('Value 边界值', () => { it('显示正确的百分比', () => { render(); expect(screen.getByText('75%')).toBeInTheDocument(); }); it('四舍五入百分比', () => { render(); expect(screen.getByText('34%')).toBeInTheDocument(); }); it('超过 100% 限制为 100%', () => { render(); expect(screen.getByText('100%')).toBeInTheDocument(); }); it('负值限制为 0%', () => { render(); expect(screen.getByText('0%')).toBeInTheDocument(); }); }); // ==================== Size 测试 ==================== describe('Size 属性', () => { it('默认 size 为 120', () => { const { container } = render(); const svg = container.querySelector('svg'); expect(svg).toHaveAttribute('width', '120'); expect(svg).toHaveAttribute('height', '120'); }); it('支持自定义 size', () => { const { container } = render(); const svg = container.querySelector('svg'); expect(svg).toHaveAttribute('width', '80'); expect(svg).toHaveAttribute('height', '80'); }); }); // ==================== ShowLabel 测试 ==================== describe('ShowLabel 属性', () => { it('showLabel=true 显示百分比(默认)', () => { render(); expect(screen.getByText('50%')).toBeInTheDocument(); }); it('showLabel=false 隐藏百分比', () => { render(); expect(screen.queryByText('50%')).not.toBeInTheDocument(); }); }); // ==================== Label 测试 ==================== describe('Label 属性', () => { it('显示自定义 label', () => { render(); expect(screen.getByText('审核中')).toBeInTheDocument(); }); it('showLabel=false 时不显示 label', () => { render(); expect(screen.queryByText('审核中')).not.toBeInTheDocument(); }); }); // ==================== Variant 测试 ==================== describe('Variant 样式', () => { it('default variant 使用正确颜色', () => { const { container } = render(); const progressCircle = container.querySelectorAll('circle')[1]; expect(progressCircle).toHaveAttribute('stroke', '#6366F1'); }); it('success variant 使用正确颜色', () => { const { container } = render(); const progressCircle = container.querySelectorAll('circle')[1]; expect(progressCircle).toHaveAttribute('stroke', '#32D583'); }); it('warning variant 使用正确颜色', () => { const { container } = render(); const progressCircle = container.querySelectorAll('circle')[1]; expect(progressCircle).toHaveAttribute('stroke', '#F59E0B'); }); it('error variant 使用正确颜色', () => { const { container } = render(); const progressCircle = container.querySelectorAll('circle')[1]; expect(progressCircle).toHaveAttribute('stroke', '#E85A4F'); }); }); // ==================== ClassName 测试 ==================== describe('ClassName', () => { it('支持自定义 className', () => { const { container } = render(); expect(container.firstChild).toHaveClass('custom-circular'); }); }); });