import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { describe, expect, it, vi } from 'vitest'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select'; function Fixture(props: { clearable?: boolean; defaultValue?: string; onValueChange?: (value: string) => void; }) { return ( ); } describe('Select', () => { describe('clearable', () => { it('offers no reset control by default', () => { render(); expect(screen.queryByRole('button', { name: 'Clear selection' })).toBeNull(); }); /* Two mounts rather than a rerender: `defaultValue` seeds the mirror once, the way it does for any uncontrolled React input, so changing the prop on a live instance is a no-op by design. */ it('offers one only once there is a value', () => { const { unmount } = render(); expect(screen.queryByRole('button', { name: 'Clear selection' })).toBeNull(); unmount(); render(); expect(screen.getByRole('button', { name: 'Clear selection' })).toBeInTheDocument(); }); it('resets the value and reports it', async () => { const onValueChange = vi.fn(); const user = userEvent.setup(); render(); await user.click(screen.getByRole('button', { name: 'Clear selection' })); expect(onValueChange).toHaveBeenCalledWith(''); expect(screen.queryByRole('button', { name: 'Clear selection' })).toBeNull(); }); /* * `SelectPrimitive.Trigger` is a real