Чек-лист проверки
То, что нельзя проверить ни тестами, ни скриншотами: всё это живёт в настоящем клиенте Telegram.
На живом клиенте
- [ ] Синхронизация между двумя устройствами под одним аккаунтом Telegram: отметить блок на телефоне — увидеть его на компьютере.
- [ ] Тактильная отдача на «+», при перетаскивании приоритетов и при выдаче достижения. Само перетаскивание проверяется браузером, отдача — нет.
- [ ] Кнопка «назад» клиента: закрывает шторку, потом вложенный экран, и только потом мини-приложение.
- [ ] Системные подтверждения: удаление приоритета, применение набора, привязка навыка, оба сброса.
- [ ] Сохранение обоев: на iOS через «Поделиться», на Android — скачиванием.
- [ ] Выгрузка копии в клиенте, который не даёт сохранять файлы: должна уходить в буфер обмена с объяснением, а не молча ничего не делать. Обычный путь — файлом и обратно — закрыт
npm run test:e2e; здесь проверяется только запасной, которого в браузере не бывает. - [ ] Ярлык на главный экран: на клиентах старше Bot API 8.0 кнопки быть не должно; после добавления она заменяется строкой «Ярлык уже на главном экране».
- [ ] Вход в демо и выход обратно: плашка сверху, чужие приоритеты, «Выйти» с подтверждением — и свои данные на месте, включая клик, сделанный перед самым входом.
- [ ] Демо не переживает закрытие мини-приложения: закрыть и открыть заново — должны быть свои данные, а не чужие.
- [ ] Ссылка-приглашение
?startapp=demo_fоткрывает демо сразу, а «Выйти» из него не возвращает в демо на следующем кадре.
Пограничные состояния
- [ ] Выключить и снова включить модуль «Навыки» — список должен вернуться прежним, а не пустым.
- [ ] Копия, сделанная до появления модулей, обязана читаться без ошибки.
- [ ] Клиент без CloudStorage — в настройках должно стоять «Только это устройство» и жёлтое предупреждение, а не тишина.
- [ ] Свернуть мини-приложение в полоску и развернуть обратно — каркас обязан снова занять экран целиком. Признак поломки: шапка, обрезанный переключатель периода и чёрное поле под ними при живом таб-баре внизу.
- [ ] Открыть на компьютере — окно клиента должно остаться окном: со своим заголовком, перетаскиваемым и уменьшаемым. Во весь экран приложение себя не разворачивает.
- [ ] Оставить приложение открытым через полночь — режим записи в прошлый день должен сброситься на сегодня.
- [ ] Ответить на вопрос о разряде после полуночи — ответ должен прикрепиться к вчерашнему переключению, а не потеряться.
Панель отладки
Проверяется только на настоящем устройстве: растеризация DOM в вебвью — то самое место, где браузеры расходятся сильнее всего.
- [ ] Жест тремя пальцами на живом iPhone внутри Telegram — панель открывается, и при этом ни один обычный жест (долгое нажатие, перетаскивание строк, листание) не сломался.
- [ ] Пролистать список статистики наполовину и снять кадр — кадр обязан совпадать с экраном, а не показывать список сверху.
- [ ] Собрать тикет в самолётном режиме — панель говорит «отправлю позже»; после возвращения сети тикет доезжает сам.
Сквозные проверки
Браузерный слой живёт в e2e/: Playwright поднимает собранное приложение (vite preview) и проходит его так, как ходит человек. Playwright лежит там же со своим package.json — по той же причине, что и в tools/shots: браузеры весят слишком много, чтобы качать их при каждой сборке приложения.
bash
npm run e2e:setup # один раз: playwright + chromium
npm run test:e2e # собирает, поднимает и проходитЧто стоит знать, читая эти проверки:
- Часы стоят. Момент времени прибит в
e2e/fixtures.ts, иначе прогон, начатый без четверти полночь, увидел бы смену суток посреди теста. Там же лежит и способ перевести их вперёд, когда проверяется длительность. - Консоль обязана молчать. Ошибка или предупреждение в браузере роняют тест, даже если на экране всё правильно.
- Чтение проверяется в демо, запись — в обычном режиме.
?demo=maxдаёт тринадцать месяцев истории без входа и без сети; у записи каждый тест получает свой чистый контекст браузера, а с ним своё пустое хранилище. - Системные вопросы настоящие. Вне Telegram подтверждения и сообщения — это
window.confirmиwindow.alert, а Playwright по умолчанию их отклоняет. Тесты импорта, удаления навыка и сброса берутacceptDialogsизfixtures.ts; без него действие молча не состоится, и проверка этого не заметит. - Офлайн проверяется вторым заходом. Воркер кладёт при установке только документ (
public/sw.js), ассеты попадают в кэш тем запросом, который прошёл через него, — то есть со следующей загрузки. Это не обход проверки, а тот же путь, что у человека: первый визит греет кэш, дальше приложение открывается без сети всегда.
Что проверяет автоматика
Это перечислено, чтобы не проверять руками:
| Что | Чем |
|---|---|
| Окна периодов, серии, интервалы заряда через полночь и переход на летнее время | npm test |
| Пороги лестницы, аддитивность часов навыка, обратимость отвязки | npm test |
| Условия достижений, несъёмность автоматических | npm test |
| Что худший месяц влезает в 4096 байт | npm test |
| Что копия читается кругом и отвергает чужой файл | npm test |
| Что демо-профили валидны, детерминированы и открывают весь реестр достижений | npm test |
| Что у каждого экрана есть страница документации, а у каждого кадра — ссылка | npm test |
| Что панель отладки не тянет ничего из приложения и список зависимостей не вырос | npm test |
| Что из тикета вычищено личное: длинные строки, почта, токены | npm test |
| Что приложение открывается, вкладки открывают свои экраны и консоль молчит | npm run test:e2e |
| Что отмеченный блок виден сразу и переживает перезагрузку — на настоящем IndexedDB | npm run test:e2e |
| Что заряд переключается и виден в шапке, на экране и в статистике | npm run test:e2e |
| Что кнопка языка меняет интерфейс, запоминает выбор и не оставляет ключей на экране | npm run test:e2e |
| Что на 390 и 320 px ничего не шире экрана, а таб-бар цел | npm run test:e2e |
| Что запись из демо не доходит до данных владельца — включая выбранный гостем язык | npm run test:e2e |
| Что копия выгружается файлом, возвращается обратно и битый файл отвергается вслух | npm run test:e2e |
| Что навык заводится, правится по потере фокуса, уходит в архив и возвращается с часами | npm run test:e2e |
| Что приоритеты переставляются перетаскиванием и стрелками, а промах пальцем список не двигает | npm run test:e2e |
| Что воркер встаёт в браузере, не встаёт в демо, и без сети приложение открывается и пишет | npm run test:e2e |
| Что давние даты называют год, а сегодняшние — нет | npm run test:e2e |
| Что интерфейс выглядит как задумано | npm run docs:shots (два прогона подряд → «Изменилось 0») |
| Что в документации нет битых ссылок | npm run docs:build |