Smoke: отображение ошибок онлайн-заявки
Предусловия
- используется тестовое окружение;
- рабочая конфигурация сайта остаётся
mode: "web3forms"иendpoint: ""; - для проверки будущего endpoint применяется временная локальная или тестовая конфигурация;
- Web3Forms и Supabase проверяются раздельно и в hybrid-сценарии;
- в тестовых данных нет реальных персональных сведений.
1. Порядок скриптов
Подтвердить в собранной странице /online-zayavka/:
application-inputs.jsрасположен раньшеonline-application.js;- error UI устанавливает обёртку
window.fetchдо первого прямого запроса; - JavaScript не содержит синтаксических ошибок.
2. Общий критерий сообщения
Для каждой ошибки прямой отправки подтвердить:
- блок
data-application-delivery-noteимеет классis-error; - сообщение написано понятным языком;
- присутствует фраза
Технический номер, если request ID валиден; - присутствуют SMS, MAX, ВКонтакте и копирование;
- сырой
error_codeне отображается; - SQLSTATE, stack trace, название таблицы или RPC отсутствуют;
- подготовленный текст заявки остаётся доступен.
3. Validation
Вернуть HTTP 422:
{
"ok": false,
"success": false,
"error_code": "validation_failed",
"request_id": "11111111-1111-4111-8111-111111111111"
}
Ожидание:
- сообщение предлагает проверить обязательные поля;
- отображается технический номер;
data-error-category="validation";- достигаются цели
online_application_endpoint_errorиonline_application_endpoint_error_validation.
4. Rate limit
Вернуть HTTP 429 с retry_after_seconds: 3600.
Ожидание:
- сообщение сообщает о частых попытках;
- показывается приблизительно 60 минут;
- внутренние
attempt_countиrate_limitотсутствуют; data-error-category="rate_limit".
Повторить с отрицательным, строковым и превышающим 24 часа значением. Время ожидания не должно отображаться.
5. Request rejected
Вернуть HTTP 202, success: false, error_code: "request_rejected".
Ожидание:
- ответ не считается успешной доставкой;
- клиенту предлагается резервный канал;
- конкретная причина антиспам-проверки не раскрывается;
data-error-category="rejected".
6. Backend
По очереди проверить:
backend_unavailable;backend_migration_required;lead_storage_failed.
Ожидание: одинаковая безопасная категория backend, готовый текст сохранён, технические детали базы отсутствуют.
7. Request errors
Проверить:
origin_not_allowed;method_not_allowed;content_type_not_supported;payload_too_large;invalid_json.
Ожидание: безопасная категория request, предложение обновить страницу или использовать резервный способ.
8. Неизвестный код
Вернуть корректный error envelope с error_code: "unknown_internal_case".
Ожидание:
- сырой код не отображается;
- модуль не создаёт произвольную аналитическую цель;
- основной транспорт показывает общий безопасный fallback.
9. Невалидный request ID
Вернуть телефон, email, произвольную строку и слишком длинное значение в request_id.
Ожидание:
- значение сервера не выводится;
- используется текущий валидный request ID формы;
- персональные сведения не появляются в сообщении.
10. Таймаут и сеть
Имитировать AbortError и сетевой отказ без JSON.
Ожидание:
- категория
networkиспользуется только локально; - отображается текущий request ID формы;
- резервные каналы остаются доступны;
- серверный error code не выдумывается.
11. Новая попытка
После ошибки снова нажать кнопку отправки.
Ожидание:
- предыдущая ошибка удалена из памяти;
data-error-categoryочищен;- новый ответ не использует старый correlation ID.
12. Hybrid
Настроить тестовый hybrid:
- Web3Forms отвечает успешно;
- Supabase endpoint возвращает
backend_unavailable.
Ожидание:
- заявка считается отправленной;
- открывается
/spasibo/; - успешное сообщение не заменяется ошибкой дополнительного канала;
- endpoint error может быть учтён в аналитике без request ID.
13. Локальное хранение и аналитика
Проверить DevTools:
- модуль ошибок не создаёт ключи в localStorage или sessionStorage;
- request ID не передаётся в Яндекс Метрику;
- в целях используются только фиксированные названия категорий.
Критерий приёмки
Smoke пройден, когда все allowlist-коды переводятся в понятные категории, клиент видит безопасный технический номер и резервный путь, сырой код и внутренние данные не раскрываются, Web3Forms-успех не теряется, а рабочий Supabase endpoint остаётся выключенным до общей приёмки.