import { render, screen, fireEvent } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { ClubSwitcher } from '../club-switcher';
import { useTenant } from '../../contexts/tenant-context';
vi.mock('../../contexts/tenant-context', () => ({
useTenant: vi.fn(),
}));
vi.mock('../ui/dropdown-menu', () => ({
DropdownMenu: ({ children }: { children: React.ReactNode }) =>
{children}
,
DropdownMenuTrigger: ({ children }: { children: React.ReactNode }) => {children}
,
DropdownMenuContent: ({ children }: { children: React.ReactNode }) => {children}
,
DropdownMenuItem: ({ children, onClick }: { children: React.ReactNode, onClick: () => void }) => {children}
,
DropdownMenuLabel: ({ children }: { children: React.ReactNode }) => {children}
,
DropdownMenuSeparator: () => ---
,
}));
describe('ClubSwitcher', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('renders loading state when clubs is empty', () => {
(useTenant as ReturnType).mockReturnValue({
activeClubId: null,
clubs: [],
setActiveClub: vi.fn(),
userRole: null
});
render();
expect(screen.getByRole('button')).toHaveTextContent('Select Club');
});
it('renders current club name and sport type badge', () => {
(useTenant as ReturnType).mockReturnValue({
activeClubId: 'club-1',
clubs: [
{ id: 'club-1', name: 'Tennis Club', sportType: 'Tennis' },
{ id: 'club-2', name: 'Swim Club', sportType: 'Swimming' },
],
setActiveClub: vi.fn(),
userRole: 'admin'
});
render();
expect(screen.getAllByText('Tennis Club')[0]).toBeInTheDocument();
});
it('calls setActiveClub when club is selected', () => {
const mockSetActiveClub = vi.fn();
(useTenant as ReturnType).mockReturnValue({
activeClubId: 'club-1',
clubs: [
{ id: 'club-1', name: 'Tennis Club', sportType: 'Tennis' },
{ id: 'club-2', name: 'Swim Club', sportType: 'Swimming' },
],
setActiveClub: mockSetActiveClub,
userRole: 'admin'
});
render();
const swimClub = screen.getByText('Swim Club');
fireEvent.click(swimClub);
expect(mockSetActiveClub).toHaveBeenCalledWith('club-2');
});
});