import { render, screen, fireEvent, waitFor } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { PreferenceSettings } from './PreferenceSettings';
import { PreferenceSettings as PreferenceSettingsType } from '../../types/settings';
// Mock ResizeObserver for tests
global.ResizeObserver = vi.fn().mockImplementation(() => ({
observe: vi.fn(),
unobserve: vi.fn(),
disconnect: vi.fn(),
}));
// Mock Select component
vi.mock('@/components/ui/select', () => ({
Select: ({ value, onChange, options, placeholder }: any) => (
),
}));
// Mock RadioGroup
vi.mock('@/components/ui/radio-group', () => ({
RadioGroup: ({ children, value, onValueChange }: any) => (
{children}
),
RadioGroupItem: ({ value, id }: any) => (
),
}));
// Mock Label
vi.mock('@/components/ui/label', () => ({
Label: ({ children, htmlFor }: any) => (
),
}));
describe('PreferenceSettings Component', () => {
const mockPreferences: PreferenceSettingsType = {
language: 'en',
timezone: 'UTC',
theme: 'auto',
};
const mockOnChange = vi.fn();
beforeEach(() => {
vi.clearAllMocks();
});
it('should render all preference fields', () => {
render(
);
expect(screen.getByText('Langue')).toBeInTheDocument();
expect(screen.getByText('Fuseau horaire')).toBeInTheDocument();
expect(screen.getByText('Thème')).toBeInTheDocument();
expect(screen.getByTestId('radio-group')).toBeInTheDocument();
});
it('should display current language value', () => {
render(
);
const selects = screen.getAllByTestId('select');
const languageSelect = selects[0].querySelector('select');
expect(languageSelect).toHaveValue('en');
});
it('should call onChange when language changes', () => {
render(
);
const selects = screen.getAllByTestId('select');
const languageSelect = selects[0].querySelector('select');
if (languageSelect) {
fireEvent.change(languageSelect, { target: { value: 'fr' } });
expect(mockOnChange).toHaveBeenCalledWith({
...mockPreferences,
language: 'fr',
});
}
});
it('should display current timezone value', () => {
render(
);
const selects = screen.getAllByTestId('select');
const timezoneSelect = selects[1].querySelector('select');
expect(timezoneSelect).toHaveValue('UTC');
});
it('should call onChange when timezone changes', () => {
render(
);
const selects = screen.getAllByTestId('select');
const timezoneSelect = selects[1].querySelector('select');
if (timezoneSelect) {
fireEvent.change(timezoneSelect, { target: { value: 'Europe/Paris' } });
expect(mockOnChange).toHaveBeenCalledWith({
...mockPreferences,
timezone: 'Europe/Paris',
});
}
});
it('should display current theme value', () => {
render(
);
const radioGroup = screen.getByTestId('radio-group');
expect(radioGroup).toHaveAttribute('data-value', 'auto');
});
it('should call onChange when theme changes to light', () => {
render(
);
const lightButton = screen.getByText('Select Light');
fireEvent.click(lightButton);
expect(mockOnChange).toHaveBeenCalledWith({
...mockPreferences,
theme: 'light',
});
});
it('should call onChange when theme changes to dark', () => {
render(
);
const darkButton = screen.getByText('Select Dark');
fireEvent.click(darkButton);
expect(mockOnChange).toHaveBeenCalledWith({
...mockPreferences,
theme: 'dark',
});
});
it('should call onChange when theme changes to auto', () => {
render(
);
const autoButton = screen.getByText('Select Auto');
fireEvent.click(autoButton);
expect(mockOnChange).toHaveBeenCalledWith({
...mockPreferences,
theme: 'auto',
});
});
it('should render all theme options', () => {
render(
);
expect(screen.getByTestId('radio-light')).toBeInTheDocument();
expect(screen.getByTestId('radio-dark')).toBeInTheDocument();
expect(screen.getByTestId('radio-auto')).toBeInTheDocument();
});
});