import OptionList from '@admin/components/OptionList'; import { render, screen } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; import userEvent from '@testing-library/user-event'; describe('OptionList Component', () => { it('renders the component with options', () => { render( {}} /> ); expect(screen.getByTestId('option-list')).toBeInTheDocument(); }); it('renders all provided option values', () => { render( {}} /> ); expect(screen.getByText('Apple')).toBeInTheDocument(); expect(screen.getByText('Banana')).toBeInTheDocument(); expect(screen.getByText('Cherry')).toBeInTheDocument(); }); it('renders nothing when options are empty', () => { const { container } = render( {}} /> ); expect(container.firstChild).toBeNull(); }); it('de-duplicates options', () => { render( {}} /> ); const apples = screen.getAllByText('Apple'); expect(apples).toHaveLength(1); expect(screen.getByText('Banana')).toBeInTheDocument(); }); it('renders table headers (Value and Actions)', () => { render( {}} /> ); expect(screen.getByText('Value')).toBeInTheDocument(); expect(screen.getByText('Actions')).toBeInTheDocument(); }); it('renders a remove button for each option', () => { render( {}} /> ); const removeButtons = screen.getAllByLabelText('Remove option'); expect(removeButtons).toHaveLength(3); }); it('calls onOptionsChange without the removed option when remove is clicked', async () => { const user = userEvent.setup(); const mockOnChange = vi.fn(); render( ); const removeButtons = screen.getAllByLabelText('Remove option'); await user.click(removeButtons[1]); // remove "Beta" expect(mockOnChange).toHaveBeenCalledWith(['Alpha', 'Gamma']); }); it('calls onOptionsChange with empty array when last option is removed', async () => { const user = userEvent.setup(); const mockOnChange = vi.fn(); render( ); const removeButton = screen.getByLabelText('Remove option'); await user.click(removeButton); expect(mockOnChange).toHaveBeenCalledWith([]); }); });