Smoke-тест контроля очереди уведомлений

Назначение

Проверить закрытую Edge Function broker-notification-health, агрегированный RPC и пороги тревог до подключения внешнего мониторинга.

Публичный сайт во время теста сохраняет:

lead_capture:
  mode: "web3forms"
  endpoint: ""

Подготовка

Применить шесть миграций backend по порядку и выполнить smoke основного backend, Telegram-доставки и ручного retry.

Задать secrets функции:

Monitor token не должен совпадать с NOTIFICATION_ADMIN_TOKEN.

Локально задать:

export HEALTH_FUNCTION_URL="https://PROJECT.supabase.co/functions/v1/broker-notification-health"
export NOTIFICATION_MONITOR_TOKEN="LOCAL_MONITOR_SECRET"

Проверка конфигурации

В supabase/config.toml должна быть секция:

[functions.broker-notification-health]
verify_jwt = false

Это разрешает собственному bearer token дойти до handler. Авторизацию затем выполняет сама функция.

Проверка агрегированного RPC

В доверенном SQL Editor вызвать:

select *
from public.broker_lead_notification_queue_health();

Допустимые колонки:

Не должны возвращаться идентификаторы, имена, телефоны, города, URL, комментарии или raw_payload.

Авторизация

Без токена:

curl -i "$HEALTH_FUNCTION_URL"

Ожидается HTTP 401, unauthorized.

С неверным токеном ожидается тот же результат.

С правильным токеном:

curl -i "$HEALTH_FUNCTION_URL" \
  -H "Authorization: Bearer $NOTIFICATION_MONITOR_TOKEN"

Ожидается HTTP 200 для состояния ok или warning, либо HTTP 503 для critical.

HTTP-защита

Проверить:

Нормальное состояние

При отсутствии failed, зависших sending, большого pending и повышенных попыток ожидается:

{
  "ok": true,
  "status": "ok",
  "alerts": []
}

Проверить, что queue содержит только агрегаты, а thresholds соответствует окружению функции.

Warning: failed_present

На тестовой заявке установить notification_status = 'failed', не достигая критического порога.

Ожидается:

После теста вернуть запись в согласованное состояние.

Critical: stale_sending

На тестовой заявке установить:

update public.broker_leads
set
  notification_status = 'sending',
  notification_attempted_at = now() - interval '20 minutes'
where id = 'TEST_LEAD_ID';

Ожидается:

После теста восстановить тестовую запись штатным способом.

Critical: failed_critical

В тестовой среде создать количество failed, равное критическому порогу.

Ожидается:

Не использовать реальные заявки для искусственного увеличения счётчика.

Warning: pending_backlog

В тестовой среде временно установить небольшой NOTIFICATION_PENDING_WARNING_THRESHOLD и создать соответствующее число тестовых pending.

Ожидается HTTP 200, status = warning, код pending_backlog.

Warning: attempts_elevated

Для тестовой заявки увеличить notification_attempt_count до порога.

Ожидается HTTP 200, status = warning, код attempts_elevated.

Ошибка RPC

В отдельной тестовой среде проверить поведение без шестой миграции либо с временно недоступным RPC.

Ожидается HTTP 503, queue_health_unavailable, без технических деталей базы.

Проверка отсутствия персональных данных

В JSON-ответе не должно быть ключей и значений:

Runbook реакции

Для каждого кода проверить операционное действие:

Откат

При проблеме:

  1. удалить или отключить NOTIFICATION_MONITOR_TOKEN;
  2. не публиковать URL функции;
  3. оставить сайт в web3forms с пустым endpoint;
  4. не изменять заявки массово;
  5. анализировать очередь через доверенный SQL Editor;
  6. исправить причину и повторить smoke.

Результат

Зафиксировать в issue №7:

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