Files
portal/app/tests/Feature/Advertising/CampaignBannerServiceTest.php
T
Дмитрий 2590c01477 test: половина грязи рекламных тестов убрана — остаток в базе со 116 до 44
Восьми файлам рекламной папки поставлен откат после теста. Проверено остатком
в базе снаружи: папка оставляла 116 записей арендаторов, теперь 44. Папка
целиком зелёная - 351 из 351. Полный прогон после уборки: 4111 тестов,
4107 зелёных, 4 пропущено, ноль падений - значит на эту грязь никто не
опирался. Побочно прогон стал БЫСТРЕЕ: 12,9 минуты против 16,5.

Один файл намеренно оставлен как был, причина записана прямо в нём:
CampaignBannerEndpointsTest нарочно ловит отказ базы, а Postgres после отказа
внутри транзакции глушит все следующие команды. С откатом файл падает -
чинить надо сам тест, а не обёртку.

Датчик пришлось расшифровывать, и это стоит помнить. Числа сперва выходили
с минусами: файл, который базы не касается вовсе, «уносил» девять записей.
Прямым замером выяснилось, что КАЖДЫЙ прогон начинается с пересборки базы -
было 6 записей, стало 0 после теста про расписание. Значит разница «до/после»
при переборе файлов = оставил этот минус оставил предыдущий. Расшифровал
цепочкой, сумма сошлась со 116 ровно - на этом расшифровка и проверяется.
Поимённый расклад по файлам перенесён в промт.

Грабля на будущее, тоже в промте: uses() обязан стоять НИЖЕ подключений
классов. Подключение действует с места объявления и ниже, поэтому вызов
выше падает «класс не найден» - и падает сразу вся папка. Полное имя
с ведущей чертой не спасает: pint САМ превращает его в подключение внизу
и ломает работавший файл.

Остаток долга измерен и НЕ закрыт: ~20 файлов оставляют по одной-две записи,
среди них миграционные, которым откат может быть противопоказан по сути.
По всей папке Feature без отката 96 файлов из 580 - корень общий,
в app/tests/Pest.php строка RefreshDatabase закомментирована.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 22:46:14 +03:00

63 lines
2.5 KiB
PHP

<?php
declare(strict_types=1);
use App\Models\AdCampaign;
use App\Models\AdCampaignBanner;
use App\Models\Tenant;
use App\Services\Advertising\CampaignBannerService;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Storage;
// Откат после теста. Без него записи файла остаются в базе и роняют ЧУЖИЕ тесты:
// 01.08.2026 девятнадцать чужих проводок уронили денежную проверку приёмника МТС.
uses(DatabaseTransactions::class);
function bannerSrcJpeg(int $w, int $h): string
{
$img = imagecreatetruecolor($w, $h);
imagefill($img, 0, 0, imagecolorallocate($img, 15, 110, 86));
ob_start();
imagejpeg($img, null, 90);
$bin = (string) ob_get_clean();
imagedestroy($img);
return $bin;
}
it('генерирует полный набор из 15 баннеров с файлами на диске', function () {
Storage::fake('local');
$tenant = Tenant::factory()->create();
$campaign = AdCampaign::create([
'tenant_id' => $tenant->id, 'name' => 'C', 'audience_days' => 10, 'use_uploaded_list' => false,
]);
$count = app(CampaignBannerService::class)->generate($campaign, bannerSrcJpeg(1500, 1500));
expect($count)->toBe(15)
->and(AdCampaignBanner::where('campaign_id', $campaign->id)->count())->toBe(15);
$b = AdCampaignBanner::where('campaign_id', $campaign->id)->where('width', 300)->where('height', 250)->first();
expect($b)->not->toBeNull();
Storage::disk('local')->assertExists($b->path);
$info = getimagesizefromstring((string) Storage::disk('local')->get($b->path));
expect($info[0])->toBe(300)->and($info[1])->toBe(250)->and($b->bytes)->toBeGreaterThan(0);
});
it('перегенерация заменяет прежний набор (снова 15, старые файлы удалены)', function () {
Storage::fake('local');
$tenant = Tenant::factory()->create();
$campaign = AdCampaign::create([
'tenant_id' => $tenant->id, 'name' => 'C', 'audience_days' => 10, 'use_uploaded_list' => false,
]);
$svc = app(CampaignBannerService::class);
$svc->generate($campaign, bannerSrcJpeg(1500, 1500));
$firstPaths = AdCampaignBanner::where('campaign_id', $campaign->id)->pluck('path')->all();
$svc->generate($campaign, bannerSrcJpeg(1200, 1200));
expect(AdCampaignBanner::where('campaign_id', $campaign->id)->count())->toBe(15);
expect(count($firstPaths))->toBe(15);
});