veza/apps/web/src/context/ThemeContext.test.tsx

60 lines
1.6 KiB
TypeScript

import { renderHook, act } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { ThemeProvider, useTheme } from './ThemeContext';
import { ReactNode } from 'react';
import { ThemeVariant } from '@/types';
const wrapper = ({ children }: { children: ReactNode }) => (
<ThemeProvider>{children}</ThemeProvider>
);
describe('ThemeContext', () => {
beforeEach(() => {
vi.clearAllMocks();
localStorage.clear();
});
it('should provide theme context', () => {
const { result } = renderHook(() => useTheme(), { wrapper });
expect(result.current).toBeDefined();
expect(result.current).toHaveProperty('theme');
expect(result.current).toHaveProperty('setTheme');
});
it('should have default theme', () => {
const { result } = renderHook(() => useTheme(), { wrapper });
expect(result.current.theme).toBeDefined();
});
it('should change theme', () => {
const { result } = renderHook(() => useTheme(), { wrapper });
const initialTheme = result.current.theme;
act(() => {
result.current.setTheme(ThemeVariant.GAMING);
});
expect(result.current.theme).toBe(ThemeVariant.GAMING);
expect(result.current.theme).not.toBe(initialTheme);
});
it('should toggle theme', () => {
const { result } = renderHook(() => useTheme(), { wrapper });
const initialTheme = result.current.theme;
act(() => {
if (result.current.toggleTheme) {
result.current.toggleTheme();
}
});
// Le thème devrait changer si toggleTheme existe
if (result.current.toggleTheme) {
expect(result.current.theme).not.toBe(initialTheme);
}
});
});