create(); $user = User::factory()->create(['tenant_id' => $tenant->id]); $campaign = AdCampaign::create([ 'tenant_id' => $tenant->id, 'name' => 'C', 'audience_days' => 10, 'use_uploaded_list' => false, ]); return [$tenant, $user, $campaign]; } it('загрузка одной картинки генерирует набор из 15 баннеров', function () { Storage::fake('local'); [, $user, $campaign] = bannerCampaign(); $res = $this->actingAs($user)->postJson("/api/advertising/campaigns/{$campaign->id}/banner-source", [ 'file' => UploadedFile::fake()->image('src.jpg', 1500, 1500), ]); $res->assertCreated()->assertJsonPath('count', 15); expect(AdCampaignBanner::where('campaign_id', $campaign->id)->count())->toBe(15) ->and(count($res->json('banners')))->toBe(15); expect($res->json('banners.0'))->toHaveKeys(['id', 'width', 'height', 'preview_url']); }); it('список баннеров и стрим превью работают', function () { Storage::fake('local'); [, $user, $campaign] = bannerCampaign(); $this->actingAs($user)->postJson("/api/advertising/campaigns/{$campaign->id}/banner-source", [ 'file' => UploadedFile::fake()->image('src.jpg', 1500, 1500), ])->assertCreated(); $list = $this->actingAs($user)->getJson("/api/advertising/campaigns/{$campaign->id}/banners"); $list->assertOk(); expect(count($list->json('banners')))->toBe(15); $bannerId = AdCampaignBanner::where('campaign_id', $campaign->id)->value('id'); $preview = $this->actingAs($user)->get("/api/advertising/campaigns/{$campaign->id}/banners/{$bannerId}/preview"); $preview->assertOk(); expect($preview->headers->get('content-type'))->toContain('image/jpeg'); }); it('утверждение набора ставит banners_approved_at', function () { Storage::fake('local'); [, $user, $campaign] = bannerCampaign(); $this->actingAs($user)->postJson("/api/advertising/campaigns/{$campaign->id}/banner-source", [ 'file' => UploadedFile::fake()->image('src.jpg', 1500, 1500), ])->assertCreated(); $this->actingAs($user)->postJson("/api/advertising/campaigns/{$campaign->id}/banners/approve")->assertOk(); expect($campaign->fresh()->banners_approved_at)->not->toBeNull(); }); it('нельзя утвердить пустой набор', function () { [, $user, $campaign] = bannerCampaign(); $this->actingAs($user)->postJson("/api/advertising/campaigns/{$campaign->id}/banners/approve")->assertStatus(422); }); it('чужой тенант не видит баннеры (404)', function () { Storage::fake('local'); [, $user, $campaign] = bannerCampaign(); $this->actingAs($user)->postJson("/api/advertising/campaigns/{$campaign->id}/banner-source", [ 'file' => UploadedFile::fake()->image('src.jpg', 1500, 1500), ])->assertCreated(); $bannerId = AdCampaignBanner::where('campaign_id', $campaign->id)->value('id'); $otherTenant = Tenant::factory()->create(); $otherUser = User::factory()->create(['tenant_id' => $otherTenant->id]); $this->actingAs($otherUser)->get("/api/advertising/campaigns/{$campaign->id}/banners/{$bannerId}/preview")->assertNotFound(); });