import { screen } from '@testing-library/react'; import { renderWithProviders } from '@/tests/unit/test-utils'; import { StatCard } from '@/components/usage/StatCard'; import { Activity, TrendingUp, Users, Zap } from 'lucide-react'; import { vi, beforeAll, afterAll } from 'vitest'; describe('StatCard', () => { beforeAll(() => { vi.spyOn(Number.prototype, 'toLocaleString').mockImplementation(function (this: number) { return this.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); }); }); afterAll(() => { vi.restoreAllMocks(); }); it('renders label and value', () => { renderWithProviders( , ); expect(screen.getByText('Total Tokens')).toBeInTheDocument(); expect(screen.getByText('12,345')).toBeInTheDocument(); }); it('renders string values correctly', () => { renderWithProviders( , ); expect(screen.getByText('Active')).toBeInTheDocument(); }); it('formats number values with locale string', () => { renderWithProviders( , ); expect(screen.getByText('1,000,000')).toBeInTheDocument(); }); it('shows skeleton when isLoading is true', () => { renderWithProviders( , ); expect(screen.queryByText('0')).not.toBeInTheDocument(); expect(document.querySelector('.animate-pulse')).toBeInTheDocument(); }); it('does not show skeleton when isLoading is false', () => { renderWithProviders( , ); expect(screen.getByText('42')).toBeInTheDocument(); expect(document.querySelector('.animate-pulse')).not.toBeInTheDocument(); }); it('renders icon element', () => { renderWithProviders( , ); expect(document.querySelector('svg')).toBeInTheDocument(); }); it('applies custom className', () => { renderWithProviders( , ); // The wrapper div uses rounded-xl, find it by that selector const wrapper = screen.getByText('Styled').closest('.rounded-xl'); expect(wrapper).toHaveClass('my-stat'); }); it('applies default slate accent when accent prop is not provided', () => { const { container } = renderWithProviders( , ); const iconContainer = container.querySelector('.rounded-lg'); expect(iconContainer).toHaveClass('bg-white/[0.04]'); }); it('applies blue accent', () => { const { container } = renderWithProviders( , ); const iconContainer = container.querySelector('.rounded-lg'); expect(iconContainer).toHaveClass('bg-blue-500/8'); }); it('applies green accent', () => { const { container } = renderWithProviders( , ); const iconContainer = container.querySelector('.rounded-lg'); expect(iconContainer).toHaveClass('bg-emerald-500/8'); }); it('applies amber accent', () => { const { container } = renderWithProviders( , ); const iconContainer = container.querySelector('.rounded-lg'); expect(iconContainer).toHaveClass('bg-amber-500/8'); }); it('applies purple accent', () => { const { container } = renderWithProviders( , ); const iconContainer = container.querySelector('.rounded-lg'); expect(iconContainer).toHaveClass('bg-violet-500/8'); }); it('has uppercase label styling', () => { renderWithProviders( , ); const label = screen.getByText('Uppercase Test'); expect(label).toHaveClass('uppercase'); }); it('has mono font for value', () => { renderWithProviders( , ); const value = screen.getByText('999'); expect(value).toHaveClass('font-mono'); }); });