veza/apps/web/src/components/ui/dropdown-menu.test.tsx
2026-02-07 14:23:04 +01:00

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();
});
});