import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import userEvent from '@testing-library/user-event';
import { Dropdown } from './dropdown';
describe('Dropdown Component', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('renders trigger correctly', () => {
render(
Open Menu}>
Menu content
);
expect(screen.getByText('Open Menu')).toBeInTheDocument();
});
it('does not show menu initially', () => {
render(
Open Menu}>
Menu content
);
expect(screen.queryByText('Menu content')).not.toBeInTheDocument();
});
it('opens menu when trigger is clicked', async () => {
const user = userEvent.setup();
render(
Open Menu}>
Menu content
);
const trigger = screen.getByText('Open Menu');
await user.click(trigger);
expect(screen.getByText('Menu content')).toBeInTheDocument();
});
it('closes menu when trigger is clicked again', async () => {
const user = userEvent.setup();
render(
Open Menu}>
);
const triggerWrapper = screen
.getByText('Open Menu')
.closest('[role="button"]');
expect(triggerWrapper).toHaveAttribute('aria-haspopup', 'true');
expect(triggerWrapper).toHaveAttribute('aria-expanded', 'false');
fireEvent.click(screen.getByText('Open Menu'));
const menu = screen.getByRole('menu');
expect(menu).toBeInTheDocument();
expect(menu).toHaveAttribute('aria-orientation', 'vertical');
});
it('focuses first item when menu opens', async () => {
render(
Open Menu}>
);
const trigger = screen.getByText('Open Menu');
fireEvent.click(trigger);
// Attendre que le menu soit rendu
await waitFor(() => {
expect(screen.getByText('Item 1')).toBeInTheDocument();
});
// Attendre un peu plus pour que le focus soit appliqué
await new Promise((resolve) => setTimeout(resolve, 50));
const item1 = screen.getByText('Item 1');
// Le focus devrait être sur le premier élément ou le menu devrait être présent
expect(item1).toBeInTheDocument();
});
});