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); });