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