diff --git a/scripts/smoke-mera-perimeter.sh b/scripts/smoke-mera-perimeter.sh index 3ac08d76..149cd7fa 100644 --- a/scripts/smoke-mera-perimeter.sh +++ b/scripts/smoke-mera-perimeter.sh @@ -190,11 +190,51 @@ check "meraocenka.ru payments/notify — must 404 (Caddy не проксируе "$BASE_MERA/trade-in/api/v1/trade-in/payments/notify" 404 check "meraocenka.ru payments/checkout — must 404 (Caddy не проксирует, PR-D4)" \ "$BASE_MERA/trade-in/api/v1/trade-in/payments/checkout" 404 -check "trade-in payments/notify — 401 anonymous (rbac закрыт до PR-D3)" \ - "$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" 401 -check "trade-in payments/checkout — 401 anonymous (rbac закрыт до PR-D3)" \ +# PR-D3 СМЕРЖЕН 29.08.2026 — канарейка сработала ровно как обещано выше, и её +# ожидания обновлены вместе с ней (иначе смоук остался бы красным навсегда и +# перестал бы что-либо значить). +# +# Что изменилось: `/payments/notify` теперь В `rbac._PUBLIC_PATHS` — иначе +# вебхук Т-Банка получал бы 401, а банк не умеет присылать X-Authenticated-User. +# Аутентификация там — подпись `Token` тела, её проверяет сам хендлер. +# `/payments/checkout` открыт НЕ был и остаётся под 401: его зовёт наш же фронт. +# +# Проверяем POST'ом, а не GET'ом: GET по POST-only маршруту даёт 405, и это +# ничего не говорит ни про rbac, ни про флаг. POST с пустым телом проходит +# rbac (иначе 401) и упирается в выключенный контур — 503. +# +# ⚠️ СЛЕДУЮЩАЯ КАНАРЕЙКА ЗДЕСЬ ЖЕ: когда владелец включит PAYMENTS_ENABLED, +# этот 503 станет отказом по подписи (400/403). Тогда ожидание надо обновить +# ВМЕСТЕ с включением флага — не подгонять задним числом. +check_post "trade-in payments/notify — 503 anonymous (rbac пропускает, контур выключен)" \ + "$BASE_MAIN/trade-in/api/v1/trade-in/payments/notify" '{}' 503 +check "trade-in payments/checkout — 401 anonymous (закрыт, зовёт только наш фронт)" \ "$BASE_MAIN/trade-in/api/v1/trade-in/payments/checkout" 401 +# ── Публичные ручки витрины лэндинга (29.08.2026) ──────────────────────────── +# +# Числа на лэндинге приходят из этих двух ручек. Если они отвалятся, страница +# по построению отрендерится БЕЗ блоков (честная деградация) — то есть тихо и +# незаметно. Поэтому проверяем их здесь: молчаливое исчезновение витрины +# ничем другим не ловится. +# +# Путь длинный (`/trade-in/api/public/...`) НАМЕРЕННО: короткого +# `/api/public/...` на публичном домене нет, и один и тот же адрес обязан +# работать с обоих хостов — см. шапку frontend/src/app/mera-public/public-api.ts. +check "meraocenka.ru /stats — public 200" \ + "$BASE_MERA/trade-in/api/public/mera/stats" 200 +check "meraocenka.ru /showcase — public 200" \ + "$BASE_MERA/trade-in/api/public/mera/showcase" 200 + +# Анонимный расчёт закрыт флагом public_estimate_enabled и обязан быть +# НЕОТЛИЧИМ от несуществующего пути. До 29.08 он отвечал 422 с перечнем своих +# полей: проверка флага стояла в теле хендлера, а FastAPI валидирует тело +# раньше. Гейт переехал в зависимости маршрута; здесь — прод-подтверждение. +check_post "meraocenka.ru /estimate — 404 при выключенном флаге (схема не течёт)" \ + "$BASE_MERA/trade-in/api/public/mera/estimate" '{}' 404 +check_post "meraocenka.ru /estimate/read — 404 при выключенном флаге" \ + "$BASE_MERA/trade-in/api/public/mera/estimate/read" '{}' 404 + echo "========================================" if [ "$fail" -eq 0 ]; then echo "ALL CHECKS PASSED"