155 lines
4.2 KiB
TypeScript
155 lines
4.2 KiB
TypeScript
import { render, screen, fireEvent } from '@testing-library/react';
|
|
import { describe, it, expect, vi } from 'vitest';
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuTrigger,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuCheckboxItem,
|
|
DropdownMenuRadioItem,
|
|
DropdownMenuLabel,
|
|
DropdownMenuSeparator,
|
|
DropdownMenuShortcut,
|
|
} from './dropdown-menu';
|
|
|
|
describe('DropdownMenu Component', () => {
|
|
it('renders trigger and content', () => {
|
|
render(
|
|
<DropdownMenu>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open Menu</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuItem>Item 1</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
expect(screen.getByText('Open Menu')).toBeInTheDocument();
|
|
});
|
|
|
|
it('renders menu items', () => {
|
|
render(
|
|
<DropdownMenu open={true}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuItem>Item 1</DropdownMenuItem>
|
|
<DropdownMenuItem>Item 2</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
expect(screen.getByText('Item 1')).toBeInTheDocument();
|
|
expect(screen.getByText('Item 2')).toBeInTheDocument();
|
|
});
|
|
|
|
it('calls onOpenChange when trigger is clicked', () => {
|
|
const mockOnOpenChange = vi.fn();
|
|
|
|
render(
|
|
<DropdownMenu open={false} onOpenChange={mockOnOpenChange}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuItem>Item</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
const trigger = screen.getByText('Open');
|
|
fireEvent.click(trigger);
|
|
|
|
expect(mockOnOpenChange).toHaveBeenCalled();
|
|
});
|
|
|
|
it('renders checkbox item', () => {
|
|
const mockOnCheckedChange = vi.fn();
|
|
|
|
render(
|
|
<DropdownMenu open={true}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuCheckboxItem
|
|
checked={true}
|
|
onCheckedChange={mockOnCheckedChange}
|
|
>
|
|
Checked Item
|
|
</DropdownMenuCheckboxItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
expect(screen.getByText('Checked Item')).toBeInTheDocument();
|
|
});
|
|
|
|
it('renders radio item', () => {
|
|
render(
|
|
<DropdownMenu open={true}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuRadioItem checked={true} value="option1">
|
|
Radio Item
|
|
</DropdownMenuRadioItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
expect(screen.getByText('Radio Item')).toBeInTheDocument();
|
|
});
|
|
|
|
it('renders label', () => {
|
|
render(
|
|
<DropdownMenu open={true}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuLabel>Label</DropdownMenuLabel>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
expect(screen.getByText('Label')).toBeInTheDocument();
|
|
});
|
|
|
|
it('renders separator', () => {
|
|
const { container } = render(
|
|
<DropdownMenu open={true}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuSeparator />
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
const separator = container.querySelector('.bg-border');
|
|
expect(separator).toBeInTheDocument();
|
|
});
|
|
|
|
it('renders shortcut', () => {
|
|
render(
|
|
<DropdownMenu open={true}>
|
|
<DropdownMenuTrigger asChild>
|
|
<button type="button">Open</button>
|
|
</DropdownMenuTrigger>
|
|
<DropdownMenuContent>
|
|
<DropdownMenuItem>
|
|
Item
|
|
<DropdownMenuShortcut>⌘K</DropdownMenuShortcut>
|
|
</DropdownMenuItem>
|
|
</DropdownMenuContent>
|
|
</DropdownMenu>,
|
|
);
|
|
|
|
expect(screen.getByText('⌘K')).toBeInTheDocument();
|
|
});
|
|
});
|