{"id":29127779,"url":"https://github.com/korolev2512/intergalactic_analytics_tests","last_synced_at":"2026-04-11T03:02:36.159Z","repository":{"id":301921838,"uuid":"1010676708","full_name":"KoroLev2512/intergalactic_analytics_tests","owner":"KoroLev2512","description":"yandex shri 2025 homework","archived":false,"fork":false,"pushed_at":"2025-06-29T15:42:49.000Z","size":4853,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-29T16:37:47.153Z","etag":null,"topics":["classnames","css-modules","eslint","jest","playwright","prettier","react","react-router","react-testing-library","typescript","vite","zustand"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/KoroLev2512.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-29T15:24:06.000Z","updated_at":"2025-06-29T16:01:36.000Z","dependencies_parsed_at":"2025-06-29T16:49:44.380Z","dependency_job_id":null,"html_url":"https://github.com/KoroLev2512/intergalactic_analytics_tests","commit_stats":null,"previous_names":["korolev2512/intergalactic_analytics_tests"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/KoroLev2512/intergalactic_analytics_tests","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoroLev2512%2Fintergalactic_analytics_tests","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoroLev2512%2Fintergalactic_analytics_tests/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoroLev2512%2Fintergalactic_analytics_tests/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoroLev2512%2Fintergalactic_analytics_tests/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KoroLev2512","download_url":"https://codeload.github.com/KoroLev2512/intergalactic_analytics_tests/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KoroLev2512%2Fintergalactic_analytics_tests/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31667034,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-10T17:19:37.612Z","status":"online","status_checked_at":"2026-04-11T02:00:05.776Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["classnames","css-modules","eslint","jest","playwright","prettier","react","react-router","react-testing-library","typescript","vite","zustand"],"created_at":"2025-06-30T01:01:52.343Z","updated_at":"2026-04-11T03:02:36.116Z","avatar_url":"https://github.com/KoroLev2512.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀Написание тестов для сервиса межгалактической аналитики Young Yandex 2025\n\nЭто веб-приложение для «Сервиса межгалактической аналитики». Проект разработан в рамках Школы разработки интерфейсов Яндекса 2025.\n\n## Технологический стек (frontend)\n\n- **Основной стек**: `React`, `TypeScript`, `Vite`\n- **Управление состоянием**: `Zustand`\n- **Роутинг**: `React Router`\n- **Стилизация**: `CSS Modules`\n- **Тестирование**: `Jest`, `React Testing Library`, `Playwright`\n- **Качество кода**: `ESLint`, `Prettier`, `typescript-eslint`\n- **Утилиты**: `classnames`\n\n## Функциональность\n\n### Главная страница (`/`)\n- Загрузка CSV-файла с помощью drag-and-drop или через диалог выбора файла.\n- Анализ файла с отображением прогресса.\n- Сохранение результатов анализа (включая ошибки) в историю, которая хранится в `localStorage`.\n- Возможность очистить текущие данные и загрузить новый файл.\n\n### Страница генерации (`/generate`)\n- Генерация новых данных\n- Автоматическая загрузка сгенерированного файла\n- Обработка ошибок\n\n### Страница истории (`/history`)\n- Просмотр истории загрузок в виде списка.\n- Удаление отдельных записей из истории.\n- Просмотр ключевых метрик (хайлайтов) в модальном окне.\n- Полная очистка истории.\n- Кнопка для быстрого перехода на страницу генерации.\n\n## Тестирование\n\nПроект включает полное покрытие тестами с использованием современных инструментов тестирования.\n\n### Unit тесты (Jest + React Testing Library)\n\n#### Компоненты с тестами:\n\n**1. ClearHistoryButton** - 4 теста\n- ✅ Не рендерится когда история пуста\n- ✅ Рендерится когда в истории есть элементы\n- ✅ Вызывает функции очистки при клике\n- ✅ Применяет правильный variant для кнопки\n\n**2. GenerateMoreButton** - 4 теста\n- ✅ Рендерит кнопку с правильным текстом\n- ✅ Вызывает navigate при клике\n- ✅ Применяет правильный variant для кнопки\n- ✅ Кнопка доступна для взаимодействия\n\n**3. FileDisplay** - 8 тестов\n- ✅ Рендерит имя файла\n- ✅ Вызывает onClear при клике на кнопку очистки\n- ✅ Блокирует кнопку очистки когда isProcessing=true\n- ✅ Не блокирует кнопку очистки когда isProcessing=false\n- ✅ Применяет правильные CSS классы для завершенного состояния\n- ✅ Отображает иконку очистки\n- ✅ Рендерит с длинным именем файла\n- ✅ Работает с пустым именем файла\n\n**4. FileStatus** - 8 тестов\n- ✅ Отображает успешное состояние\n- ✅ Отображает состояние ошибки\n- ✅ Отображает иконку Smile для успешного состояния\n- ✅ Отображает иконку SmileSad для состояния ошибки\n- ✅ Применяет активный класс когда isActive=true\n- ✅ Не применяет активный класс когда isActive=false\n- ✅ Рендерит с правильной структурой для успешного состояния\n- ✅ Рендерит с правильной структурой для состояния ошибки\n\n**5. HistoryItem** - 11 тестов\n- ✅ Рендерит информацию о файле\n- ✅ Вызывает onClick при клике на элемент с хайлайтами\n- ✅ Не вызывает onClick при клике на элемент без хайлайтов\n- ✅ Вызывает onDelete при клике на кнопку удаления\n- ✅ Отображает иконку файла\n- ✅ Отображает иконку корзины для удаления\n- ✅ Отображает статус успеха для элемента с хайлайтами\n- ✅ Отображает статус ошибки для элемента без хайлайтов\n- ✅ Применяет disabled класс для элемента без хайлайтов\n- ✅ Отображает отформатированную дату\n- ✅ Имеет правильные aria-label атрибуты\n\n**6. HistoryModal** - 8 тестов\n- ✅ Не рендерится когда модал закрыт\n- ✅ Не рендерится когда нет выбранного элемента\n- ✅ Не рендерится когда у элемента нет хайлайтов\n- ✅ Рендерится когда модал открыт и есть выбранный элемент с хайлайтами\n- ✅ Отображает хайлайты из выбранного элемента\n- ✅ Вызывает convertHighlightsToArray с правильными данными\n- ✅ Применяет правильные CSS классы\n- ✅ Передает правильные props в HighlightCard\n\n**7. Dropzone** - 9 тестов\n- ✅ Рендерит базовую структуру\n- ✅ Открывает файловый диалог при клике\n- ✅ Вызывает onFileSelect для валидного CSV файла\n- ✅ Обрабатывает drag and drop событие\n- ✅ Показывает Loader когда файл загружен и status=\"processing\"\n- ✅ Применяет правильные CSS классы при drag\n- ✅ Применяет CSS класс при ошибке валидации\n- ✅ Очищает ошибку валидации при новом drag\n- ✅ Не открывает файловый диалог при клике когда файл уже загружен\n\n**8. Modal** - 11 тестов\n- ✅ Рендерит содержимое когда открыт\n- ✅ Не применяет backdropShown класс когда закрыт\n- ✅ Вызывает onClose при клике на backdrop\n- ✅ Не вызывает onClose при клике на содержимое модала\n- ✅ Вызывает onClose при клике на кнопку закрытия\n- ✅ Не отображает кнопку закрытия когда onClose не передан\n- ✅ Отображает иконку закрытия\n- ✅ Применяет правильные CSS классы когда открыт\n- ✅ Рендерит сложное содержимое\n- ✅ Работает без onClose функции\n- ✅ Всегда рендерится в DOM через Portal\n\n**9. UI компоненты** - 14 тестов\n- **Button** - 4 теста (рендеринг, варианты, disabled состояние, className)\n- **Typography** - 4 теста (рендеринг, HTML элементы, className, комбинирование props)\n- **Loader** - 4 теста (базовый размер, кастомный размер, нулевой размер, отрицательный размер)\n- **Upload Icon** - 6 тестов (SVG рендеринг, размеры, пропсы, path элементы)\n\n**10. Хуки** - 2 теста\n- **useDebounce** - 2 теста (debounce функциональность, очистка таймера)\n\n**11. Утилиты** - 8 тестов\n- **storage** - 4 теста (сохранение, загрузка, удаление, очистка)\n- **formatDate** - 4 теста (форматирование дат, различные форматы)\n\n**12. Store** - 6 тестов\n- **analysis slice** - 3 теста (actions, reducers, state)\n- **history slice** - 3 теста (actions, reducers, state)\n\n### E2E тесты (Playwright)\n\n#### Основные тесты:\n\n**1. Главная страница** - 4 теста\n- ✅ Отображает основные элементы главной страницы\n- ✅ Навигация работает корректно\n- ✅ Заголовки отображаются правильно\n- ✅ Кнопки доступны для взаимодействия\n\n**2. Загрузка файлов** - 3 теста\n- ✅ Загружает CSV файл успешно\n- ✅ Отображает состояние загрузки\n- ✅ Обрабатывает ошибки загрузки\n\n**3. Страница генерации** - 3 теста\n- ✅ Отображает основные элементы страницы генерации\n- ✅ Генерация работает корректно\n- ✅ Навигация между страницами\n\n**4. Страница истории** - 3 теста\n- ✅ Отображает основные элементы страницы истории\n- ✅ Отображает пустое состояние когда история пуста\n- ✅ Навигация назад работает\n\n**5. Доступность** - 2 теста\n- ✅ Все элементы имеют правильные атрибуты\n- ✅ Навигация с клавиатуры работает\n\n**6. Производительность** - 2 теста\n- ✅ Страницы загружаются быстро\n- ✅ Анимации работают плавно\n\n**7. Скриншоты** - 4 теста\n- ✅ Главная страница\n- ✅ Страница генерации\n- ✅ Страница истории\n- ✅ Dropzone с файлом\n\n### Статистика тестирования \n\n- **Unit тестов**: 81 тест\n- **E2E тестов**: 43 теста\n- **Общее покрытие**: 124 теста\n- **Время выполнения unit тестов**: ~0.9 секунд\n- **Время выполнения e2E тестов**: ~3.3 секунды\n- **Успешность**: 100%\n\n## Установка и запуск\n\n1. Установите зависимости:\n   ```bash\n   npm install\n   ```\n\n2. Запустите проект в режиме разработки:\n   ```bash\n   npm run dev\n   ```\n\n## Скрипты (frontend)\n\n- `npm run dev` - запуск в режиме разработки\n- `npm run build` - сборка проекта\n- `npm run lint` - проверка кода линтером\n- `npm run lint:fix` - исправление ошибок линтера и форматирование кода\n- `npm run format` - форматирование кода\n- `npm run preview` - предпросмотр собранного проекта\n\n### Тестирование (frontend)\n\n- `npm test` - запуск unit тестов\n- `npm run test:watch` - запуск unit тестов в режиме наблюдения\n- `npm run test:coverage` - запуск unit тестов с отчетом о покрытии\n- `npm run test:e2e` - запуск e2e тестов\n- `npm run test:e2e:ui` - запуск e2e тестов с UI\n- `npm run test:e2e:headed` - запуск e2e тестов в браузере\n- `npm run test:e2e:debug` - запуск e2e тестов в режиме отладки\n- `npm run test:e2e:report` - показать HTML отчет e2e тестов\n- `npm run test:e2e:update-screenshots` - обновление скриншотов e2e тестов\n- `npm run test:e2e:screenshots` - запуск только тестов скриншотов\n- `npm run test:e2e:screenshots-update` - обновление скриншотов\n\n## Структура проекта\n\nНиже представлена структура основных директорий проекта:\n\n```\nsrc/\n├── App.tsx             # Корневой компонент приложения\n├── main.tsx            # Точка входа\n├── components/         # Переиспользуемые UI-компоненты\n│   ├── ClearHistoryButton/\n│   ├── Dropzone/\n│   ├── FileDisplay/\n│   ├── FileStatus/\n│   ├── GenerateMoreButton/\n│   ├── Header/\n│   ├── HighlightCard/\n│   ├── HighlightsSection/\n│   ├── HistoryItem/\n│   ├── HistoryList/\n│   ├── HistoryModal/\n│   └── MainLayout/\n├── hooks/              # Пользовательские хуки React\n├── pages/              # Компоненты страниц (роуты)\n├── store/              # Логика управления состоянием (Zustand)\n│   ├── analysis/       # Стор для страницы анализа\n│   └── history/        # Стор для страницы истории\n├── styles/             # Глобальные стили\n├── types/              # Глобальные типы TypeScript\n├── ui/                 # Базовые UI-компоненты (кнопки, иконки и т.д.)\n│   ├── Button/\n│   ├── icons/\n│   ├── Loader/\n│   ├── Modal/\n│   ├── Portal/\n│   ├── SvgBase/\n│   └── Typography/\n├── utils/              # Вспомогательные функции\n└── setupTests.ts       # Настройка тестов\n\ne2e/                    # E2E тесты (Playwright)\n├── accessibility.spec.ts\n├── file-upload.spec.ts\n├── generate.spec.ts\n├── history.spec.ts\n├── home.spec.ts\n├── performance.spec.ts\n├── screenshots.spec.ts\n└── utils/\n    └── test-helpers.ts\n```\n\n## Технологии тестирования (frontend)\n\n- **Jest** - фреймворк для unit тестирования\n- **React Testing Library** - библиотека для тестирования React компонентов\n- **Playwright** - фреймворк для e2e тестирования\n- **@testing-library/user-event** - симуляция пользовательских действий\n- **@testing-library/jest-dom** - дополнительные matchers для Jest\n\n## Практики тестирования (frontend)\n\n1. **Тестирование поведения, а не реализации**\n2. **Использование семантических селекторов** (getByRole, getByText)\n3. **Mock'ирование внешних зависимостей**\n4. **Тестирование accessibility**\n5. **Покрытие edge cases**\n6. **Читаемые названия тестов на русском языке**\n7. **Изоляция тестов**\n8. **Использование data-testid для сложных селекторов**\n\n### Доступные ручки (backend)\n\n-   **GET /report**\n\n   -   Генерирует CSV отчет с заданными параметрами.\n   -   Параметры запроса:\n      -   `size` (number, обязателен): Размер отчета в ГБ\n      -   `withErrors` (string, по умолчанию \"off\"): Включать ли ошибки в отчет\n      -   `maxSpend` (string, по умолчанию \"1000\"): Максимальная сумма расходов\n   -   Ответ: CSV файл с отчетом или объект с ошибкой\n\n-   **POST /aggregate**\n   -   Агрегирует данные, полученные в виде файла (multipart/form-data).\n   -   Параметры запроса:\n      -   `rows` (number, обязателен): Количество строк для промежуточного агрегирования\n   -   Тело запроса: multipart/form-data с файлом\n   -   Ответ: JSON-стрим с результатами агрегации или объект с ошибкой\n\n### Документация API (Swagger)\n\nИнтерактивная документация доступна по адресу: [http://localhost:3000/swagger](http://localhost:3000/swagger)\n\nВ ней можно посмотреть описание ручек, параметры и протестировать запросы прямо из браузера.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkorolev2512%2Fintergalactic_analytics_tests","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkorolev2512%2Fintergalactic_analytics_tests","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkorolev2512%2Fintergalactic_analytics_tests/lists"}