84 lines
3.7 KiB
PHP
84 lines
3.7 KiB
PHP
|
|
<?php
|
||
|
|
|
||
|
|
declare(strict_types=1);
|
||
|
|
|
||
|
|
use App\Models\AdCampaign;
|
||
|
|
use App\Models\AdCampaignBanner;
|
||
|
|
use App\Models\AdCreativeJob;
|
||
|
|
use App\Models\Tenant;
|
||
|
|
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||
|
|
|
||
|
|
uses(DatabaseTransactions::class);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Список «ждёт разбора»: кампании, где робот сходил в кабинет и НЕ ПОНЯЛ, что видит.
|
||
|
|
*
|
||
|
|
* Это не про обычные отказы — их клиент разбирает сам, по причине в переписке. Это про
|
||
|
|
* сбой цепочки: разметка кабинета поменялась, страница не открылась, объявления в списке
|
||
|
|
* не нашлось. Без такого списка цепочка встанет молча: клиент будет ждать ответа, которого
|
||
|
|
* не будет, и никто об этом не узнает.
|
||
|
|
*/
|
||
|
|
function stuckSetup(string $status, string $kind = AdCreativeJob::KIND_INSPECT): array
|
||
|
|
{
|
||
|
|
$tenant = Tenant::factory()->create(['organization_name' => 'Окна Москва']);
|
||
|
|
$campaign = AdCampaign::create([
|
||
|
|
'tenant_id' => $tenant->id,
|
||
|
|
'name' => 'Кампания',
|
||
|
|
'status' => AdCampaign::STATUS_REJECTED,
|
||
|
|
'audience_days' => 10,
|
||
|
|
'budget_rub' => '500.00',
|
||
|
|
]);
|
||
|
|
|
||
|
|
$banner = AdCampaignBanner::create([
|
||
|
|
'tenant_id' => $tenant->id, 'campaign_id' => $campaign->id,
|
||
|
|
'width' => 300, 'height' => 250, 'bytes' => 1000, 'included' => true,
|
||
|
|
'path' => "ad-banners/{$tenant->id}/{$campaign->id}/300x250.jpg",
|
||
|
|
'yandex_ad_id' => 17787055204,
|
||
|
|
]);
|
||
|
|
|
||
|
|
$job = AdCreativeJob::create([
|
||
|
|
'tenant_id' => $tenant->id, 'campaign_id' => $campaign->id,
|
||
|
|
'kind' => $kind, 'status' => $status,
|
||
|
|
'yandex_ad_id' => $banner->yandex_ad_id,
|
||
|
|
'failure_reason' => 'разметка не совпала: окна BannerStatusCell.Popup нет',
|
||
|
|
'finished_at' => now(),
|
||
|
|
]);
|
||
|
|
|
||
|
|
return [$tenant, $campaign, $job];
|
||
|
|
}
|
||
|
|
|
||
|
|
test('в списке ждёт разбора видно кампанию, где разведка сорвалась', function () {
|
||
|
|
[$tenant, $campaign] = stuckSetup(AdCreativeJob::STATUS_FAILED);
|
||
|
|
|
||
|
|
$r = $this->getJson('/api/admin/advertising/robot-stuck');
|
||
|
|
$r->assertStatus(200);
|
||
|
|
|
||
|
|
$row = collect($r->json('data'))->firstWhere('campaign_id', $campaign->id);
|
||
|
|
|
||
|
|
expect($row)->not->toBeNull()
|
||
|
|
->and($row['tenant_name'])->toBe('Окна Москва')
|
||
|
|
->and($row['failure_reason'])->toContain('разметка не совпала')
|
||
|
|
->and((int) $row['yandex_ad_id'])->toBe(17787055204);
|
||
|
|
});
|
||
|
|
|
||
|
|
/** Удачная разведка разбора не ждёт — она уже всё рассказала клиенту в переписке. */
|
||
|
|
test('удачная разведка в список ждёт разбора не попадает', function () {
|
||
|
|
[, $campaign] = stuckSetup(AdCreativeJob::STATUS_DONE);
|
||
|
|
|
||
|
|
$r = $this->getJson('/api/admin/advertising/robot-stuck');
|
||
|
|
|
||
|
|
expect(collect($r->json('data'))->firstWhere('campaign_id', $campaign->id))->toBeNull();
|
||
|
|
});
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Сорванная ЗАЛИВКА картинок — тоже сбой робота, и владельцу её видеть надо: кампания
|
||
|
|
* стоит и не запускается. Список один на все виды заданий.
|
||
|
|
*/
|
||
|
|
test('сорванная заливка картинок в списке тоже видна', function () {
|
||
|
|
[, $campaign] = stuckSetup(AdCreativeJob::STATUS_FAILED, AdCreativeJob::KIND_UPLOAD);
|
||
|
|
|
||
|
|
$r = $this->getJson('/api/admin/advertising/robot-stuck');
|
||
|
|
|
||
|
|
expect(collect($r->json('data'))->firstWhere('campaign_id', $campaign->id))->not->toBeNull();
|
||
|
|
});
|