/**
* Button 组件测试
* 测试覆盖: variants, sizes, icons, loading, disabled, fullWidth
*/
import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi } from 'vitest';
import { Search, ArrowRight } from 'lucide-react';
import { Button } from './Button';
describe('Button', () => {
// ==================== 基础渲染测试 ====================
describe('基础渲染', () => {
it('渲染按钮文本', () => {
render();
expect(screen.getByRole('button', { name: '点击我' })).toBeInTheDocument();
});
it('默认使用 primary variant 和 md size', () => {
render();
const button = screen.getByRole('button');
expect(button).toHaveClass('bg-accent-indigo');
expect(button).toHaveClass('px-4', 'py-2.5');
});
});
// ==================== Variant 测试 ====================
describe('Variant 样式', () => {
it('primary variant 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('bg-accent-indigo', 'text-white');
});
it('secondary variant 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('bg-bg-elevated', 'text-text-secondary');
});
it('danger variant 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('bg-accent-coral', 'text-white');
});
it('success variant 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('bg-accent-green', 'text-white');
});
it('ghost variant 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('bg-transparent', 'text-text-secondary');
});
});
// ==================== Size 测试 ====================
describe('Size 样式', () => {
it('sm size 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('px-3', 'py-1.5', 'text-small');
});
it('md size 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('px-4', 'py-2.5', 'text-body');
});
it('lg size 应用正确样式', () => {
render();
expect(screen.getByRole('button')).toHaveClass('px-6', 'py-3', 'text-section-title');
});
});
// ==================== Icon 测试 ====================
describe('Icon 渲染', () => {
// 使用 innerHTML 正则匹配验证图标和文本的相对位置
// 这种方式对 DOM 结构变化(如添加 wrapper)更健壮
it('左侧图标正确渲染(图标在文本之前)', () => {
render();
const button = screen.getByRole('button');
expect(button.querySelector('svg')).toBeInTheDocument();
// 验证 SVG 在 "搜索" 文本之前
const html = button.innerHTML;
const svgPos = html.indexOf('