Skip to content

Live-write кассеты: 8 тестов содержат skip-заглушки вместо полного lifecycle #537

Description

@axisrow

Контекст

В tests/test_v5_live_write.py все 21 тест имеют файл кассеты (1:1), но 8 кассет фиксируют только запрос + ошибку API (тест pytest.skip), а не реальный lifecycle add → update → delete. То есть мутирующий путь этих команд против боевого API живьём не проверен — кассета доказывает лишь форму запроса.

Выявлено при ревизии после #536 (live-write coverage для feeds/retargeting/strategies). Трекинг-родитель: #59.

Что недозаписано

Две разные категории.

A. Ограничения аккаунта записи (нужен другой аккаунт)

Полный lifecycle нельзя записать на текущем аккаунте — API сразу отвечает ошибкой. Нужен аккаунт с включёнными типами кампаний / разрешением на загрузку.

Тест Ошибка Что нужно для записи
adimages_add_get_delete 5004 Аккаунт, где разрешена загрузка изображений (сейчас PNG отвергается)
dynamicads_add_delete 3500 Аккаунт с включённым DYNAMIC_TEXT_CAMPAIGN
dynamicads_suspend_resume 3500 То же
smartadtargets_add_update_delete 3500 Аккаунт с включённым SMART_CAMPAIGN
smartadtargets_suspend_resume 3500 То же

Уже задокументировано в tests/MANUAL_COVERAGE.md (Category B). Эти типы кампаний доступны только на agency/pilot-аккаунтах.

B. Синтетический внешний ID по конвенции (намеренный skip)

Используют синтетический goal-плейсхолдер ALL:12345:30, чтобы не хардкодить реальный ID аккаунта в публичный репозиторий → API отвечает 8800 → skip. Это осознанное решение (см. #536), а не баг.

Тест Ошибка Запись полного lifecycle
retargeting_add_update_delete 8800 Требует реальный Metrica goal id
audiencetargets_add_delete 8800 Требует реальный adgroup + retargeting list в нужном контексте
audiencetargets_suspend_resume 8800 То же

(ads_suspend_resume_archive_unarchive частично скипается на 8300 — draft нельзя suspend; это by design, не входит в scope.)

Предлагаемое решение

Для категории B — ввести env-override для тестовых ID по уже существующему в репо паттерну (YANDEX_DIRECT_TEST_ADVIDEO_ID, YANDEX_DIRECT_TEST_BUSINESS_ID, YANDEX_DIRECT_TEST_CAMPAIGN_ID в _smoke_probes.py):

  • YANDEX_DIRECT_TEST_RETARGETING_GOAL_ID — реальный goal из env, синтетический 12345 как fallback. Если env задан → тест пишет полный lifecycle; если нет → skip на 8800 (как сейчас). Реальный ID НИКОГДА не в коде.

Для категории A — записать кассеты разово на agency/pilot-аккаунте с включёнными SMART/DYNAMIC и загрузкой изображений, затем закоммитить (логин/токен/ID отфильтровываются conftest.py, как сейчас). Либо оставить как документированное ограничение, если такого аккаунта нет.

Acceptance

  • Введён env-override для retargeting/audiencetargets goal id (fallback на синтетику, реальный ID не в коде)
  • retargeting/audiencetargets пишут полный lifecycle при заданном env, иначе graceful-skip
  • Категория A: либо записана на подходящем аккаунте, либо явно помечена в MANUAL_COVERAGE.md как «account-tier limited, lifecycle не записывается»
  • Проверка: ни в одной кассете нет реальных ID аккаунта / секретов

Проверочная команда (текущий статус)

YANDEX_DIRECT_TOKEN=dummy YANDEX_DIRECT_LOGIN=dummy YANDEX_DIRECT_LIVE_WRITE=1 \
  python -m pytest -m integration_live_write -rs

Сейчас: 12 passed (реальный lifecycle), 9 skipped (8 заглушек + 1 draft-state by design), 0 failed.

Metadata

Metadata

Assignees

No one assigned

    Labels

    api-status:sandbox-limitedBehavior is limited by Yandex Direct sandbox or test tierdocumentationImprovements or additions to documentationtesting

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions