Под капотом: +290 тестов и 3 скрытых бага

Внутренняя стабилизация — нет новых фичей для игроков, но игра стала серьёзно надёжнее.

ТЕСТАМИ

Написано около 290 новых unit- и компонентных тестов. Общее покрытие выросло до 574 зелёных тестов. Каждый деплой теперь прогоняет их все перед выкаткой на прод.

Покрыто:
— движок Golden Rush (сервер + клиент)
— основной 2p-движок (раньше не было ни одного теста на него)
— валидация входов, античит, WS-сообщения
— админ-аудит, ачивки, чат-рейтлимит, XP-движок
— компонент туториала Golden Rush
— сбор тренировочных данных, share-логика, victory-city хелперы

3 СКРЫТЫХ БАГА

Пока писал тесты, нашёл три реальных проблемы:

1. Инициализация БД: индекс idx_season_rewards_user в базовой схеме ссылался на таблицу которая создавалась только миграцией №5. На проде это не стреляло потому что БД уже существует с прошлых запусков и таблица уже есть. Но при первом fresh-запуске или в тестовой in-memory базе инициализация падала с ошибкой no such table. Починили порядок: сначала все CREATE TABLE, потом CREATE INDEX.

2. Метка сложности AI: для строки "вроде как числа но не число" (такая дыра в данных) функция возвращала "Лёгкая" (потому что parseInt давал 0, а 0 < 150 = easy). Теперь возвращает null — как и для null/undefined. Семантика выдержана.

3. Счётчик наград Golden Rush: если какой-то бонус равен 0, UI показал бы "+0 бриксов" отдельной строчкой. В реальности сервер шлёт ненулевые значения, но на всякий случай добавил фильтр > 0.

CI БОРЬБА

Пока прогонял тесты в CI, пришлось выловить ещё кучу мелких вещей: обновил GitHub Actions с v4 на v5 (старые были deprecated с Node.js 20), добавил happy-dom и @testing-library/react для компонентных тестов, починил permission-denied при уплоаде на сервер (при импорте БД в тестах создавался файлик с правами только для owner, scp-контейнер не мог его упаковать в tar).

ЗАЧЕМ ЭТО ВСЁ

Тесты не делают игру лучше сегодня. Они делают её лучше в день когда я напишу новую фичу и случайно сломаю старый edge case — CI покажет красное до выкатки на прод. Баги которые нашлись за эту сессию — меня бы не укусили, а вот первый установивший Highrise Heist с нуля — да.