Smoke-тест хранения и очистки заявок

Назначение

Проверить миграцию 202607140001_broker_lead_retention.sql в подтверждённом тестовом Supabase-проекте до включения серверного канала и до работы с реальными заявками.

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

lead_capture:
  mode: "web3forms"
  endpoint: ""

Retention policy должна оставаться выключенной до этапа явного тестового включения.

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

  1. Используется отдельный тестовый проект или полностью тестовые строки с пометкой RETENTION SMOKE.
  2. Применены миграции по порядку, включая 202607140001_broker_lead_retention.sql.
  3. Secrets, телефоны реальных клиентов и реальные тексты заявок не используются.
  4. Автоматический Cron job отсутствует.
  5. Назначен оператор теста и подготовлен план отката.

Проверка объектов

Проверить таблицы и поля:

select to_regclass('public.broker_lead_retention_settings');
select to_regclass('public.broker_lead_retention_runs');

select column_name, data_type
from information_schema.columns
where table_schema = 'public'
  and table_name = 'broker_leads'
  and column_name in (
    'retention_hold',
    'anonymized_at',
    'retention_reason_code'
  )
order by column_name;

Проверить функции:

select routine_name, security_type
from information_schema.routines
where routine_schema = 'public'
  and routine_name in (
    'broker_lead_retention_preview',
    'apply_broker_lead_retention'
  )
order by routine_name;

Ожидается:

Политика выключена по умолчанию

select *
from public.broker_lead_retention_settings;

Ожидается:

Попытка добавить new в terminal_statuses должна завершиться ошибкой constraint.

Подготовка тестовых сценариев

Создать минимум шесть тестовых лидов:

  1. старый closed + sent — кандидат;
  2. старый new + sent — активный и защищённый;
  3. старый closed + failed — unresolved и защищённый;
  4. старый closed + sent + retention_hold = true — защищённый hold;
  5. свежий closed + sent — ещё не достиг срока;
  6. старый неизвестный статус + sent — защищён fail-closed.

Для кандидата заполнить тестовые значения во всех группах полей:

Добавить:

Использовать только явно тестовые значения.

Preview

select *
from public.broker_lead_retention_preview();

Проверить:

Сохранить агрегаты без идентификаторов клиента в issue приёмки.

Блокировка выключенной политики

select *
from public.apply_broker_lead_retention('APPLY_BROKER_RETENTION');

При enabled = false ожидается ошибка:

broker_retention_disabled

Ни одна строка и событие не должны измениться.

Блокировка неправильного подтверждения

В тестовой среде временно включить policy:

update public.broker_lead_retention_settings
set enabled = true,
    updated_at = now()
where singleton = true;

Вызвать с неправильной строкой:

select *
from public.apply_broker_lead_retention('WRONG_CONFIRMATION');

Ожидается broker_retention_confirmation_required без изменений данных.

Успешное применение

Перед применением повторить preview и сверить ожидаемые количества.

select *
from public.apply_broker_lead_retention('APPLY_BROKER_RETENTION');

Ожидается:

Проверка обезличивания

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

select
  status,
  notification_status,
  retention_hold,
  anonymized_at,
  retention_reason_code,
  client_name,
  phone,
  city,
  comment,
  phone_normalized,
  raw_payload,
  tracking,
  qualification,
  spam_check,
  preparation,
  preparation_completed,
  remaining_questions
from public.broker_leads
where id = 'TEST_LEAD_ID';

Ожидается:

Повторный запуск не должен повторно учитывать уже обезличенный лид.

Проверка событий

Проверить, что:

Проверка rate limit

Проверить, что:

Журнал успешного запуска

select
  id,
  started_at,
  finished_at,
  status,
  policy_snapshot,
  anonymized_leads,
  deleted_events,
  deleted_rate_limits
from public.broker_lead_retention_runs
order by started_at desc
limit 1;

Ожидается:

Проверка атомарного отката

Только в изолированной тестовой среде временно создать контролируемую ошибку после начала операции, например запретить вставку в тестовый журнал retention.

Запустить apply и убедиться:

После проверки вернуть схему в состояние миграции.

Проверка hold

Установить retention_hold = true на старом terminal-лиде и повторить preview/apply.

Ожидается:

Снять hold только после завершения теста и отдельной проверки основания.

Повторный preview

После успешного запуска повторить:

select *
from public.broker_lead_retention_preview();

Количество кандидатов должно уменьшиться на число обезличенных лидов. Активные, unresolved и hold-защиты должны остаться неизменными.

Отключение после теста

Обязательно вернуть:

update public.broker_lead_retention_settings
set enabled = false,
    updated_at = now()
where singleton = true;

Не создавать Cron job и не включать автоматический запуск в рамках первого smoke.

Проверка сторонних каналов

Подтвердить отдельно:

Результат

Зафиксировать в отдельном issue:

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