import { fireEvent, render, screen } from '@testing-library/react' import ThemeSwitcher from './theme-switcher' let mockTheme = 'system' const mockSetTheme = vi.fn() vi.mock('next-themes', () => ({ useTheme: () => ({ theme: mockTheme, setTheme: mockSetTheme, }), })) describe('ThemeSwitcher', () => { beforeEach(() => { vi.clearAllMocks() mockTheme = 'system' }) describe('Rendering', () => { it('should render without crashing', () => { const { container } = render() expect(container.firstChild).toBeInTheDocument() }) it('should render three theme option buttons', () => { render() expect(screen.getByTestId('system-theme-container')).toBeInTheDocument() expect(screen.getByTestId('light-theme-container')).toBeInTheDocument() expect(screen.getByTestId('dark-theme-container')).toBeInTheDocument() }) it('should render two dividers between options', () => { render() const dividers = screen.getAllByTestId('divider') expect(dividers).toHaveLength(2) }) }) describe('User Interactions', () => { it('should call setTheme with system when system option is clicked', () => { render() fireEvent.click(screen.getByTestId('system-theme-container')) // system is first expect(mockSetTheme).toHaveBeenCalledWith('system') }) it('should call setTheme with light when light option is clicked', () => { render() fireEvent.click(screen.getByTestId('light-theme-container')) // light is second expect(mockSetTheme).toHaveBeenCalledWith('light') }) it('should call setTheme with dark when dark option is clicked', () => { render() fireEvent.click(screen.getByTestId('dark-theme-container')) // dark is third expect(mockSetTheme).toHaveBeenCalledWith('dark') }) }) describe('Theme-specific rendering', () => { it('should highlight system option when theme is system', () => { mockTheme = 'system' render() expect(screen.getByTestId('system-theme-container')).toHaveClass('bg-components-segmented-control-item-active-bg') expect(screen.getByTestId('light-theme-container')).not.toHaveClass('bg-components-segmented-control-item-active-bg') expect(screen.getByTestId('dark-theme-container')).not.toHaveClass('bg-components-segmented-control-item-active-bg') }) it('should highlight light option when theme is light', () => { mockTheme = 'light' render() expect(screen.getByTestId('light-theme-container')).toHaveClass('bg-components-segmented-control-item-active-bg') expect(screen.getByTestId('system-theme-container')).not.toHaveClass('bg-components-segmented-control-item-active-bg') expect(screen.getByTestId('dark-theme-container')).not.toHaveClass('bg-components-segmented-control-item-active-bg') }) it('should highlight dark option when theme is dark', () => { mockTheme = 'dark' render() expect(screen.getByTestId('dark-theme-container')).toHaveClass('bg-components-segmented-control-item-active-bg') expect(screen.getByTestId('system-theme-container')).not.toHaveClass('bg-components-segmented-control-item-active-bg') expect(screen.getByTestId('light-theme-container')).not.toHaveClass('bg-components-segmented-control-item-active-bg') }) it('should show divider between system and light when dark is active', () => { mockTheme = 'dark' render() const dividers = screen.getAllByTestId('divider') expect(dividers[0]).toHaveClass('bg-divider-regular') }) it('should show divider between light and dark when system is active', () => { mockTheme = 'system' render() const dividers = screen.getAllByTestId('divider') expect(dividers[1]).toHaveClass('bg-divider-regular') }) it('should have transparent dividers when neither adjacent theme is active', () => { mockTheme = 'light' render() const dividers = screen.getAllByTestId('divider') expect(dividers[0]).not.toHaveClass('bg-divider-regular') expect(dividers[1]).not.toHaveClass('bg-divider-regular') }) }) })