import { render, screen, fireEvent } from '@testing-library/react'; import { describe, expect, it, vi, beforeEach } from 'vitest'; import { DensityToggle } from '../density-toggle'; // Mock the zustand store to avoid localStorage/persist issues in jsdom const mockToggleDensity = vi.fn(); let mockDensity = 'regular'; vi.mock('@/lib/preferences-store', () => ({ usePreferencesStore: () => ({ get density() { return mockDensity; }, toggleDensity: mockToggleDensity, }), })); describe('DensityToggle', () => { beforeEach(() => { mockDensity = 'regular'; mockToggleDensity.mockClear(); }); it('renders a button with role="switch"', () => { render(); expect(screen.getByRole('switch')).toBeInTheDocument(); }); it('has aria-checked="false" when density is regular', () => { render(); expect(screen.getByRole('switch')).toHaveAttribute('aria-checked', 'false'); }); it('has aria-checked="true" when density is compact', () => { mockDensity = 'compact'; render(); expect(screen.getByRole('switch')).toHaveAttribute('aria-checked', 'true'); }); it('calls toggleDensity on click', () => { render(); fireEvent.click(screen.getByRole('switch')); expect(mockToggleDensity).toHaveBeenCalledOnce(); }); it('applies custom aria-label via label prop', () => { render(); expect(screen.getByRole('switch')).toHaveAttribute('aria-label', 'Toggle view'); }); it('has a default aria-label', () => { render(); expect(screen.getByRole('switch')).toHaveAttribute('aria-label'); }); it('merges custom className', () => { render(); expect(screen.getByRole('switch')).toHaveClass('extra'); }); });