Files
portal/app/tests/Feature/Advertising/AdvertisingScheduleTest.php
T
Дмитрий fcf4331d24 fix(реклама): карточка объясняет, что происходит с объявлениями
Владелец, глядя на две живые карточки: «статус на модерации — не понятно,
идут показы или ожидает! и принято, когда реально отклонили».

Корень: ярлык один на всю кампанию, а объявления внутри в разных состояниях,
и у объявления два независимых признака — прошло проверку и показывается.
Карточка сваливала их в одно слово.

Три починки:

1. Портал спрашивает Яндекс о модерации каждые 15 минут вместо двух часов.
   У кампании #11 проверка кончилась между обходами, и клиент полтора часа
   видел бы «На модерации» на уже работающей кампании. Сторож держит
   расписание */15.

2. Портал считает придержанные объявления — одобренные, показ которых
   Яндекс не включил. Признак уже ставился на объявление, но наверх не
   поднимался; теперь в списке есть banners_held. Два сторожа: слепок
   боевой #6 даёт 13, слепок #11 даёт 0.

3. Ярлык называет положение дел словами, приписка всегда даёт числа:
   «Яндекс проверяет объявления» + «Одобрено 9 из 15, остальные ещё
   проверяются»; «Одобрено, но показ не включён» + «Одобрено 13 из 15,
   отклонено 2. Яндекс их пока не показывает — причина в сообщениях
   кампании»; «Крутится» + «Одобрено 15 из 15». Числа показываются всегда,
   а не только при частичном отказе.

Живой замер, ради которого всё это: у боевой кампании #6 все 15 объявлений
выключены при 13 одобренных — Яндекс просит документы, поэтому показов нет
с 30.07. Карточка про это молчала.

Прогон: 386 сторожей блока рекламы, 1974 фронта, статанализ 0, стиль чист.
Схема не менялась. Тесты гонялись на отдельной базе liderra_testing_s19 —
общую соседняя смена сносила трижды за прогон.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-04 14:20:41 +03:00

45 lines
2.2 KiB
PHP

<?php
declare(strict_types=1);
use Illuminate\Console\Scheduling\Schedule;
it('registers advertising Direct jobs in the scheduler', function () {
$events = app(Schedule::class)->events();
$summaries = array_map(fn ($e) => $e->getSummaryForDisplay(), $events);
$joined = implode("\n", $summaries);
expect($joined)->toContain('ChargeCampaignSpendJob')
->and($joined)->toContain('SyncCampaignAudienceJob')
->and($joined)->toContain('SyncCampaignModerationJob');
});
/**
* Как часто портал спрашивает Яндекс о судьбе объявлений.
*
* 🔴 Было «раз в два часа», и клиент столько же времени видел на карточке «На модерации»,
* когда Яндекс уже всё одобрил и объявления шли. Поймано владельцем 04.08.2026 на живой
* кампании #11: проверка кончилась, а портал об этом узнал бы только через полтора часа.
* Обход дешёвый — чтение по кампаниям, ждущим вердикта, ничего в кабинете не меняет.
*/
it('спрашивает Яндекс о модерации каждые 15 минут', function () {
$event = collect(app(Schedule::class)->events())
->first(fn ($e) => str_contains($e->getSummaryForDisplay(), 'SyncCampaignModerationJob'));
expect($event)->not->toBeNull()
->and($event->expression)->toBe('*/15 * * * *');
});
/**
* Сторож очереди робота обязан быть в расписании.
*
* Сама команда без расписания бесполезна: зависшее «в работе» задание держит очередь для
* ВСЕХ клиентов, а разбирать пробку руками некому — робот работает по ночам без людей.
*/
it('registers the creative job reaper in the scheduler', function () {
$events = app(Schedule::class)->events();
$joined = implode("\n", array_map(fn ($e) => $e->getSummaryForDisplay(), $events));
expect($joined)->toContain('creative-jobs:reap');
});