Контекст
В 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
Проверочная команда (текущий статус)
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.
Контекст
В
tests/test_v5_live_write.pyвсе 21 тест имеют файл кассеты (1:1), но 8 кассет фиксируют только запрос + ошибку API (тестpytest.skip), а не реальный lifecycleadd → update → delete. То есть мутирующий путь этих команд против боевого API живьём не проверен — кассета доказывает лишь форму запроса.Выявлено при ревизии после #536 (live-write coverage для feeds/retargeting/strategies). Трекинг-родитель: #59.
Что недозаписано
Две разные категории.
A. Ограничения аккаунта записи (нужен другой аккаунт)
Полный lifecycle нельзя записать на текущем аккаунте — API сразу отвечает ошибкой. Нужен аккаунт с включёнными типами кампаний / разрешением на загрузку.
adimages_add_get_deletedynamicads_add_deleteDYNAMIC_TEXT_CAMPAIGNdynamicads_suspend_resumesmartadtargets_add_update_deleteSMART_CAMPAIGNsmartadtargets_suspend_resumeУже задокументировано в
tests/MANUAL_COVERAGE.md(Category B). Эти типы кампаний доступны только на agency/pilot-аккаунтах.B. Синтетический внешний ID по конвенции (намеренный skip)
Используют синтетический goal-плейсхолдер
ALL:12345:30, чтобы не хардкодить реальный ID аккаунта в публичный репозиторий → API отвечает 8800 → skip. Это осознанное решение (см. #536), а не баг.retargeting_add_update_deleteaudiencetargets_add_deleteaudiencetargets_suspend_resume(
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
retargeting/audiencetargetsпишут полный lifecycle при заданном env, иначе graceful-skipMANUAL_COVERAGE.mdкак «account-tier limited, lifecycle не записывается»Проверочная команда (текущий статус)
Сейчас: 12 passed (реальный lifecycle), 9 skipped (8 заглушек + 1 draft-state by design), 0 failed.