Smoke: безопасные ошибки публичной Edge Function

Preconditions

Общий критерий envelope

Каждая проверяемая ошибка должна возвращать:

{
  "ok": false,
  "success": false,
  "error_code": "<публичный код>",
  "request_id": "<UUID или исходный request_id>"
}

Допустимое дополнительное поле только одно: retry_after_seconds для HTTP 429.

Во всех ответах проверить Cache-Control: no-store.

1. Invalid JSON

Отправить обрезанный JSON с корректным Origin и Content-Type.

Ожидание:

2. Неподдерживаемый Content-Type

Отправить POST с text/plain.

Ожидание:

3. Слишком большой payload

Проверить ограничение по Content-Length и по фактическому размеру прочитанного тела.

Ожидание для обоих случаев:

4. Запрещённый Origin

Отправить POST и OPTIONS с Origin вне белого списка.

Ожидание:

5. Неправильный метод

Отправить GET с разрешённым Origin.

Ожидание:

6. Серверная валидация

Отправить JSON-объект с валидным request_id, но без обязательных полей.

Ожидание:

7. Антиспам

Отправить payload с заполненным honeypot либо likely_bot = true.

Ожидание:

8. Rate limit

На тестовом fingerprint исчерпать установленный лимит.

Ожидание:

{
  "ok": false,
  "success": false,
  "error_code": "rate_limit_exceeded",
  "request_id": "<исходный request_id>",
  "retry_after_seconds": 3600
}

Не должны возвращаться:

9. Backend unavailable

В тестовом окружении убрать обязательную серверную конфигурацию.

Ожидание:

10. Migration/RPC unavailable

На отдельном тестовом проекте проверить отсутствие обязательной RPC или несовместимую схему.

Ожидание:

11. Ошибка сохранения

Смоделировать безопасную ошибку вставки, не используя реальные данные клиента.

Ожидание:

12. Клиентская совместимость

Подтвердить, что assets/js/online-application.js:

Запрещённые поля

Проверить все ответы 202–503 на отсутствие:

Конфигурация сайта

lead_capture:
  mode: "web3forms"
  endpoint: ""

Критерий приёмки

Smoke пройден, когда все ошибки используют единый envelope, correlation ID присутствует во всех ветках, только 429 получает retry_after_seconds, внутренние причины остаются в закрытом журнале, а публичный Supabase endpoint не включён.

ЗаявкаПозвонитьВК