|
| 1 | +import { configureStore } from '@reduxjs/toolkit'; |
| 2 | +import { render, screen } from '@testing-library/react'; |
| 3 | +import React from 'react'; |
| 4 | +import { Provider } from 'react-redux'; |
| 5 | + |
| 6 | +import i18n from '../i18n'; |
| 7 | +import dayjs from '../i18n/dayjs'; |
| 8 | +import AchievementBadge from '../widgets/components/AchievementBadge'; |
| 9 | +import InvitesList from '../widgets/components/InvitesList'; |
| 10 | +import TournamentDescription from '../widgets/components/TournamentDescription'; |
| 11 | +import TournamentPreviewPanel from '../widgets/components/TournamentPreviewPanel'; |
| 12 | +import { localizeTournamentName } from '../widgets/utils/localizeTournamentName'; |
| 13 | + |
| 14 | +const translations = [ |
| 15 | + ['Points', 'Очки'], |
| 16 | + ['Today', 'Сегодня'], |
| 17 | + ['Back', 'Назад'], |
| 18 | + ['Next', 'Далее'], |
| 19 | + ['Month', 'Месяц'], |
| 20 | + ['Day', 'День'], |
| 21 | + ['Agenda', 'Расписание'], |
| 22 | + ['Season Points Distribution', 'Распределение очков сезона'], |
| 23 | + ['Duration', 'Длительность'], |
| 24 | + ['Winner', 'Победитель'], |
| 25 | + ['Ranking Points', 'Рейтинговые очки'], |
| 26 | + ['Tournament chat', 'Чат турнира'], |
| 27 | + ['Easy', 'Лёгкий'], |
| 28 | + ['Tournament: %{name}', 'Турнир: %{name}'], |
| 29 | + ['Open Tournament', 'Открыть турнир'], |
| 30 | + ['View League Ranking Points System', 'Система рейтинговых очков лиги'], |
| 31 | + ['Replay settings', 'Настройки повтора'], |
| 32 | + ['Tournament details', 'Подробности турнира'], |
| 33 | + ['Function Signature', 'Сигнатура функции'], |
| 34 | + ['Fastest Solutions', 'Самые быстрые решения'], |
| 35 | + ['Forgot your password?', 'Забыли пароль?'], |
| 36 | + ['Restricted Content', 'Ограниченный доступ'], |
| 37 | + ['No completed games', 'Нет завершённых игр'], |
| 38 | + ['Live tournaments', 'Активные турниры'], |
| 39 | + ['Editor settings', 'Настройки редактора'], |
| 40 | + ['Start tournament confirmation', 'Подтверждение запуска турнира'], |
| 41 | +] as const; |
| 42 | + |
| 43 | +beforeAll(async () => { |
| 44 | + await i18n.changeLanguage('ru'); |
| 45 | + dayjs.locale('ru'); |
| 46 | +}); |
| 47 | + |
| 48 | +afterAll(async () => { |
| 49 | + await i18n.changeLanguage('en'); |
| 50 | + dayjs.locale('en'); |
| 51 | +}); |
| 52 | + |
| 53 | +test.each(translations)('translates %s into Russian', (key, translation) => { |
| 54 | + expect(i18n.t(key)).toBe(translation); |
| 55 | +}); |
| 56 | + |
| 57 | +test('localizes the best streak achievement', () => { |
| 58 | + render(<AchievementBadge achievement={{ type: 'best_win_streak', meta: { count: 7 } }} />); |
| 59 | + |
| 60 | + expect(screen.getByText('Лучшая серия')).toBeInTheDocument(); |
| 61 | + expect(screen.getByTitle('Лучшая серия побед')).toBeInTheDocument(); |
| 62 | +}); |
| 63 | + |
| 64 | +test('localizes the empty invites state', () => { |
| 65 | + const store = configureStore({ reducer: () => ({}) }); |
| 66 | + |
| 67 | + render( |
| 68 | + <Provider store={store}> |
| 69 | + <InvitesList list={[]} currentUserId={1} /> |
| 70 | + </Provider>, |
| 71 | + ); |
| 72 | + |
| 73 | + expect(screen.getByText('Нет приглашений')).toBeInTheDocument(); |
| 74 | +}); |
| 75 | + |
| 76 | +test('localizes tournament preview dates and point labels', () => { |
| 77 | + render( |
| 78 | + <TournamentPreviewPanel |
| 79 | + tournament={{ grade: 'rookie' }} |
| 80 | + start="2026-08-05T02:00:00" |
| 81 | + end="2026-08-05T02:15:00" |
| 82 | + />, |
| 83 | + ); |
| 84 | + |
| 85 | + expect(screen.getByText('Дата начала: 5 августа 2026')).toBeInTheDocument(); |
| 86 | + expect(screen.getByText('Время: 02:00 - 02:15')).toBeInTheDocument(); |
| 87 | + expect(screen.getByText('Очки за первое место: 8')).toBeInTheDocument(); |
| 88 | +}); |
| 89 | + |
| 90 | +test('localizes tournament highlights and grade names', () => { |
| 91 | + render(<TournamentDescription tournament={{ grade: 'rookie' }} />); |
| 92 | + |
| 93 | + expect(screen.getByText('Главное о турнире:')).toBeInTheDocument(); |
| 94 | + expect(screen.getByText('Задачи: 4 уникальных алгоритмических задач')).toBeInTheDocument(); |
| 95 | + expect(screen.getByText('Система рейтинговых очков лиги')).toBeInTheDocument(); |
| 96 | + expect(screen.getByText('Новичок(*)')).toBeInTheDocument(); |
| 97 | + expect(screen.getByText('Челленджер')).toBeInTheDocument(); |
| 98 | + expect(screen.getByText('Гранд-слэм')).toBeInTheDocument(); |
| 99 | +}); |
| 100 | + |
| 101 | +test('localizes only system-generated tournament names', () => { |
| 102 | + expect(localizeTournamentName('Challenger Tournament #12', 'challenger')).toBe( |
| 103 | + 'Турнир «Челленджер» №12', |
| 104 | + ); |
| 105 | + expect(localizeTournamentName('Grand_slam Tournament #9', 'grand_slam')).toBe( |
| 106 | + 'Турнир «Гранд-слэм» №9', |
| 107 | + ); |
| 108 | + expect(localizeTournamentName('Rookie', 'rookie')).toBe('Новичок'); |
| 109 | + expect(localizeTournamentName('My custom tournament', 'rookie')).toBe('My custom tournament'); |
| 110 | +}); |
0 commit comments