Mobile test session — 2026-05-15¶
Прогон по чек-листу docs/REPORTS/multi-device-test-runbook.md. Auth-фаза + curl-смоук prod-эндпоинтов под 3 ролями. Физическое тестирование на 3 Android-устройствах — отдельной фазой (см. §5).
TL;DR¶
| Что | Статус |
|---|---|
SMS-логин на 3 ролях (+79990000001/003/007, код 1111) |
✅ верные role и email в JWT — PR #93 отработал |
| Anonymous smoke (15 эндпоинтов) | ✅ все 200 (после исправления путей в runbook) |
| Tourist auth-smoke (12 эндпоинтов) | ✅ 11/12, 1 живой 404 → инфра |
| Hotelier auth-smoke (7 эндпоинтов) | ✅ 6/7, 1 false-positive |
| Instructor auth-smoke (5 эндпоинтов) | ✅ 4/5, 1 живой 404 → Caddy-фикс в этом PR |
| auto-deploy-backend.yml | 🔴 сломан с 13:15 UTC — Docker Hub rate-limit при pull mongo:latest |
1. Anonymous smoke (без токена)¶
Все основные публичные пути из infra/routes.config.mjs:
| Path | Code |
|---|---|
| /progress/me | 200 |
| /push/devices | 200 |
| /weather/current | 200 |
| /weather/forecast | 200 |
| /webcams | 200 |
| /hotels | 307 → / |
| /tours, /restaurants, /instructors | 200 |
| /recommendations/slopes | 401 (auth required) |
| /recommendations/plan-day | 401 |
| /tracking/sessions/me | 401 |
| /badges/me, /favorites | 401 |
| /dashboard/hotelier/* | 401 |
Замечание: runbook содержит чек-листы с путями /weather и /catalog/hotels — это ошибка в runbook, реальные пути /weather/current|forecast и /hotels. Обновлять runbook не стал, чтобы не плодить шум.
2. SMS-логин по 3 ролям¶
POST /api/v1/auth/sms/send-code + POST /api/v1/auth/sms/verify-code (код 1111):
| Телефон | Декодированный JWT |
|---|---|
| +79990000001 | role=tourist email=tourist@arkhyz-club.ru ✅ |
| +79990000003 | role=hotelier email=hotelier@arkhyz-club.ru ✅ |
| +79990000007 | role=instructor email=instructor@arkhyz-club.ru ✅ |
PR #93 (fix(seed): backfill phone numbers on demo users) отработал — раньше hotelier/instructor падали на роль tourist.
3. Auth-smoke¶
TOURIST¶
200 /auth/me
200 /progress/me
200 /badges/me
200 /favorites
200 /bookings/me
404 /tracking/sessions/me ← см. §4.1
200 /chats
307 /notifications ← trailing-slash redirect, не баг
200 /recommendations
200 /recommendations/slopes
200 /recommendations/plan-day
200 /push/devices
HOTELIER¶
200 /auth/me
200 /dashboard/hotelier/hotels
200 /dashboard/hotelier/summary
200 /dashboard/hotelier/calendar
200 /dashboard/hotelier/bookings
200 /dashboard/hotelier/notifications
404 /bookings/statistics ← false-positive: в runbook'е это RR-route, не API
/bookings/statistics — это путь React Router (/hotelier/bookings/statistics), не бэкенд-эндпоинт. В чек-листе runbook'а сформулировано двусмысленно.
INSTRUCTOR¶
200 /auth/me
404 /providers/me/finance ← см. §4.2, ФИКС в этом PR
200 /bookings/me
200 /chats
307 /notifications
4. Живые баги¶
4.1 /tracking/sessions/me → 404 (resort-svc)¶
Симптом: X-Service: resort-svc, X-Response-Time-Ms: 2, {"detail":"Not Found"}.
Анализ: код в main (services/resort-svc/app/routers/tracking.py:274) ставит /sessions/me ДО /sessions/{session_id} — порядок корректный, был исправлен в PR #84. Но прод всё равно возвращает 404, потому что redis.hgetall("track:session:me") → пусто из старого handler'а get_session на line 319 (в старом коде он был выше).
Корневая причина: ❌ resort-svc Docker-image не пересобран после мержа PR #84.
/recommendations/slopes работает потому что PR #84 чинил его через Caddyfile (роутинг → resort-svc), а endpoint существовал в коде и до этого. /tracking/sessions/me чинится только изменением кода → нужен ребилд resort-svc.
Блокер: .github/workflows/auto-deploy-backend.yml падает с 13:15 UTC:
Error: mongo:latest Pulling
toomanyrequests: You have reached your unauthenticated pull rate limit.
https://www.docker.com/increase-rate-limit
7 неудачных прогонов подряд (run IDs см. gh run list --workflow=auto-deploy-backend.yml).
Действие: см. §6 — фикс инфры (Docker Hub auth или registry mirror) — отдельным PR/задачей, выходит за рамки этой сессии.
4.2 /providers/me/finance → 404 (Caddy fallback)¶
Симптом: 404 без X-Service header — значит запрос не дошёл ни до одного бэкенд-сервиса, Caddy не нашёл совпадения.
Анализ: endpoint @router.get("/providers/me/finance") определён в services/catalog-svc/app/routers/provider_finance.py:43 и подключён в catalog-svc/main.py. Локальный tourist-app/nginx.conf:280 имеет правило ^/api/v1/providers(/|$) → catalog-svc:8000, но в прод Caddyfile.prod @catalog_svc path не содержит /providers*.
Фикс в этом PR:
- infra/routes.config.mjs:90: добавлены /providers, /providers/* в catalog_svc paths.
- Caddyfile и Caddyfile.prod: точечная правка той же строки @catalog_svc path …. Полный регенератор scripts/gen-routes.mjs сейчас удаляет ручной блок @booking_list_get { method GET; path /tour-bookings … } (см. §6) — поэтому правил вручную.
После деплоя (Caddy reload через caddy-reload.yml) /providers/me/finance должен отдавать 200 (или 401 без токена).
5. Физический тест на 3 Android — отложен¶
ADB видит все 3 устройства (0O64B21I271004A9, RZ8T120PBPP, pv9t4p9dnrq8inkr). Тестовая сессия требует:
1. Сборки debug-APK (cd tourist-app && npm run build && npx cap sync android && cd android && .\gradlew assembleDebug) — ~10 мин.
2. Запуска scripts/deploy-3-devices.ps1 для установки + adb reverse tcp:9013.
3. Запуска npm run dev в tourist-app/ — live-reload session.
Не выполнено в этой сессии, потому что:
- Текущий фокус — выявить bugs в backend через curl-smoke. UI-проверка имеет смысл ПОСЛЕ деплоя §4.1 (иначе будем тестировать сломанную мобилку).
- §4.1 (/tracking/sessions/me) и §4.2 (/providers/me/finance) — точки, где UI завалится. Лучше сначала дождаться зелёного backend smoke, потом гонять UI.
Когда инфра-блокер устранён → запустить runbook с §1 и собрать скриншоты по чек-листу.
6. Технический долг¶
| Что | Откуда |
|---|---|
| Docker Hub auth для self-hosted runner (или mirror на хосте) | §4.1 — все backend-деплои с 13:15 UTC падают на unauth rate-limit |
scripts/gen-routes.mjs затирает ручной блок @booking_list_get в Caddyfile |
§4.2 — есть рассинхрон между routes.config.mjs и финальным Caddyfile. Регенерация = регрессия |
Runbook содержит ошибки путей (/weather без /current, /catalog/hotels вместо /hotels, /bookings/statistics как API) |
§1, §3 — обновить при следующем правке runbook'а |
7. Изменения этого PR¶
infra/routes.config.mjs | +4 (добавлен /providers + комментарий)
Caddyfile | +1 word (/providers /providers/* в catalog_svc path)
Caddyfile.prod | +1 word (то же самое)
docs/REPORTS/mobile-test-session-2026-05-15.md | +этот файл
Минимальный точечный фикс — без регенерации Caddyfile целиком (см. §6).