import React from 'react';
import { render, screen, fireEvent } from '@testing-library/react';
import { Tabs, TabsList, TabsTrigger, TabsContent } from '../Tabs';
describe('Tabs', () => {
const TestTabs = () => (
Tab 1
Tab 2
Tab 3
Content 1
Content 2
Content 3
);
it('renders with default tab selected', () => {
render();
expect(screen.getByText('Tab 1')).toBeInTheDocument();
expect(screen.getByText('Tab 2')).toBeInTheDocument();
expect(screen.getByText('Tab 3')).toBeInTheDocument();
expect(screen.getByText('Content 1')).toBeInTheDocument();
expect(screen.queryByText('Content 2')).not.toBeInTheDocument();
expect(screen.queryByText('Content 3')).not.toBeInTheDocument();
});
it('switches tab content when clicking triggers', () => {
render();
// Click Tab 2
fireEvent.click(screen.getByText('Tab 2'));
expect(screen.queryByText('Content 1')).not.toBeInTheDocument();
expect(screen.getByText('Content 2')).toBeInTheDocument();
expect(screen.queryByText('Content 3')).not.toBeInTheDocument();
// Click Tab 3
fireEvent.click(screen.getByText('Tab 3'));
expect(screen.queryByText('Content 1')).not.toBeInTheDocument();
expect(screen.queryByText('Content 2')).not.toBeInTheDocument();
expect(screen.getByText('Content 3')).toBeInTheDocument();
// Click back to Tab 1
fireEvent.click(screen.getByText('Tab 1'));
expect(screen.getByText('Content 1')).toBeInTheDocument();
expect(screen.queryByText('Content 2')).not.toBeInTheDocument();
expect(screen.queryByText('Content 3')).not.toBeInTheDocument();
});
it('applies correct aria attributes', () => {
render();
const tab1 = screen.getByText('Tab 1');
const tab2 = screen.getByText('Tab 2');
expect(tab1).toHaveAttribute('role', 'tab');
expect(tab1).toHaveAttribute('aria-selected', 'true');
expect(tab2).toHaveAttribute('role', 'tab');
expect(tab2).toHaveAttribute('aria-selected', 'false');
fireEvent.click(tab2);
expect(tab1).toHaveAttribute('aria-selected', 'false');
expect(tab2).toHaveAttribute('aria-selected', 'true');
});
it('renders content with tabpanel role', () => {
render();
const content = screen.getByRole('tabpanel');
expect(content).toHaveTextContent('Content 1');
});
it('applies custom className to components', () => {
render(
Test
Test Content
);
expect(document.querySelector('.custom-tabs')).toBeInTheDocument();
expect(document.querySelector('.custom-list')).toBeInTheDocument();
expect(document.querySelector('.custom-trigger')).toBeInTheDocument();
expect(document.querySelector('.custom-content')).toBeInTheDocument();
});
});