veza/apps/web/src/hooks/useTranslation.test.ts

76 lines
1.9 KiB
TypeScript
Raw Normal View History

import { renderHook, act } from '@testing-library/react';
import { describe, it, expect, vi, beforeEach } from 'vitest';
import { useTranslation } from './useTranslation';
// Mock react-i18next
const mockT = vi.fn((key: string) => key);
const mockChangeLanguage = vi.fn();
const mockI18n = {
changeLanguage: mockChangeLanguage,
isInitialized: true,
};
vi.mock('react-i18next', () => ({
useTranslation: () => ({
i18n: mockI18n,
t: mockT,
}),
}));
// Mock UI store
const mockSetLanguage = vi.fn();
vi.mock('@/stores/ui', () => ({
useUIStore: () => ({
language: 'en',
setLanguage: mockSetLanguage,
}),
}));
describe('useTranslation', () => {
beforeEach(() => {
vi.clearAllMocks();
});
it('should return translation hook', () => {
const { result } = renderHook(() => useTranslation());
expect(result.current).toBeDefined();
expect(result.current).toHaveProperty('t');
expect(result.current).toHaveProperty('language');
expect(result.current).toHaveProperty('changeLanguage');
expect(result.current).toHaveProperty('isReady');
});
it('should translate text', () => {
const { result } = renderHook(() => useTranslation());
result.current.t('test.key');
expect(mockT).toHaveBeenCalledWith('test.key');
});
it('should change language', () => {
const { result } = renderHook(() => useTranslation());
act(() => {
result.current.changeLanguage('fr');
});
expect(mockChangeLanguage).toHaveBeenCalledWith('fr');
expect(mockSetLanguage).toHaveBeenCalledWith('fr');
});
it('should return current language', () => {
const { result } = renderHook(() => useTranslation());
expect(result.current.language).toBe('en');
});
it('should return isReady status', () => {
const { result } = renderHook(() => useTranslation());
expect(result.current.isReady).toBe(true);
});
});