import { render, screen } from '@testing-library/react'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import { LanguageSelector } from './LanguageSelector'; import React from 'react'; // Default mock — three-language app (matches DEFAULT_LANGUAGES) const defaultLanguages = [ { code: 'pt-BR', label: 'Português (BR)', shortLabel: 'PT' }, { code: 'en', label: 'English', shortLabel: 'EN' }, { code: 'es', label: 'Español', shortLabel: 'ES' }, ]; const useLanguageMock = vi.fn(() => ({ language: 'pt-BR', setLanguage: vi.fn(), availableLanguages: defaultLanguages, isMonolingual: false, })); vi.mock('../../../contexts/LanguageContext', () => ({ useLanguage: () => useLanguageMock(), })); vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string, fallback?: string) => { const map: Record = { 'languageSelector.label': 'Selecionar idioma', 'languageSelector.placeholder': 'Idioma', 'languageSelector.ptBR': 'Português (BR)', 'languageSelector.en': 'English', 'languageSelector.es': 'Español', }; return map[key] ?? fallback ?? key; }, }), })); describe('LanguageSelector', () => { beforeEach(() => { // Reset to default three-language behavior between tests useLanguageMock.mockReturnValue({ language: 'pt-BR', setLanguage: vi.fn(), availableLanguages: defaultLanguages, isMonolingual: false, }); }); it('renders with current language from context', () => { render(); expect(screen.getByText('Português (BR)')).toBeInTheDocument(); }); it('renders the globe icon by default', () => { render(); // Globe icon is rendered as SVG expect(document.querySelector('svg')).toBeInTheDocument(); }); it('applies the aria-label from i18n', () => { render(); expect(screen.getByLabelText('Selecionar idioma')).toBeInTheDocument(); }); it('renders nothing when monolingual (default behavior)', () => { useLanguageMock.mockReturnValue({ language: 'en', setLanguage: vi.fn(), availableLanguages: [{ code: 'en', label: 'English', shortLabel: 'EN' }], isMonolingual: true, }); const { container } = render(); expect(container.firstChild).toBeNull(); }); it('renders even when monolingual if showWhenMonolingual is true', () => { useLanguageMock.mockReturnValue({ language: 'en', setLanguage: vi.fn(), availableLanguages: [{ code: 'en', label: 'English', shortLabel: 'EN' }], isMonolingual: true, }); render(); expect(screen.getByText('English')).toBeInTheDocument(); }); it('shows custom languages added via availableLanguages', () => { useLanguageMock.mockReturnValue({ language: 'fr', setLanguage: vi.fn(), availableLanguages: [ ...defaultLanguages, { code: 'fr', label: 'Français', shortLabel: 'FR' }, ], isMonolingual: false, }); render(); expect(screen.getByText('Français')).toBeInTheDocument(); }); });