endcustomer()->create([ 'max_guests' => 50, 'max_photos' => 100, ]); $event = Event::factory()->for($this->tenant)->create([ 'status' => 'published', ]); $eventPackage = EventPackage::create([ 'event_id' => $event->id, 'package_id' => $package->id, 'purchased_price' => $package->price, 'purchased_at' => now(), 'used_photos' => 0, 'used_guests' => 0, 'gallery_expires_at' => now()->addDays(30), 'extra_guests' => 20, ]); EventPackageAddon::create([ 'event_package_id' => $eventPackage->id, 'event_id' => $event->id, 'tenant_id' => $this->tenant->id, 'addon_key' => 'extra_guests_100', 'quantity' => 1, 'extra_guests' => 100, 'status' => 'completed', 'purchased_at' => now(), ]); $response = $this->authenticatedRequest('GET', "/api/v1/tenant/events/{$event->slug}"); $response->assertOk(); $response->assertJsonPath('data.addons.0.key', 'extra_guests_100'); $response->assertJsonPath('data.addons.0.extra_guests', 100); $response->assertJsonPath('data.capabilities.ai_styling', false); } public function test_event_resource_reports_ai_styling_capability_when_addon_is_completed(): void { $package = Package::factory()->endcustomer()->create([ 'features' => ['basic_uploads'], ]); $event = Event::factory()->for($this->tenant)->create([ 'status' => 'published', ]); $eventPackage = EventPackage::create([ 'event_id' => $event->id, 'package_id' => $package->id, 'purchased_price' => $package->price, 'purchased_at' => now(), 'used_photos' => 0, 'used_guests' => 0, 'gallery_expires_at' => now()->addDays(30), ]); EventPackageAddon::create([ 'event_package_id' => $eventPackage->id, 'event_id' => $event->id, 'tenant_id' => $this->tenant->id, 'addon_key' => 'ai_styling_unlock', 'quantity' => 1, 'status' => 'completed', 'purchased_at' => now(), ]); $response = $this->authenticatedRequest('GET', "/api/v1/tenant/events/{$event->slug}"); $response->assertOk(); $response->assertJsonPath('data.capabilities.ai_styling', true); $response->assertJsonPath('data.capabilities.ai_styling_granted_by', 'addon'); } public function test_event_resource_uses_catalog_label_when_addon_metadata_label_missing(): void { $package = Package::factory()->endcustomer()->create([ 'features' => ['basic_uploads'], ]); $event = Event::factory()->for($this->tenant)->create([ 'status' => 'published', ]); $eventPackage = EventPackage::create([ 'event_id' => $event->id, 'package_id' => $package->id, 'purchased_price' => $package->price, 'purchased_at' => now(), 'used_photos' => 0, 'used_guests' => 0, 'gallery_expires_at' => now()->addDays(30), ]); PackageAddon::create([ 'key' => 'catalog_label_summary_test', 'label' => 'Catalog Summary Label', 'active' => true, 'sort' => 3, 'metadata' => ['price_eur' => 3], ]); EventPackageAddon::create([ 'event_package_id' => $eventPackage->id, 'event_id' => $event->id, 'tenant_id' => $this->tenant->id, 'addon_key' => 'catalog_label_summary_test', 'quantity' => 1, 'status' => 'completed', 'purchased_at' => now(), 'metadata' => [], ]); $response = $this->authenticatedRequest('GET', "/api/v1/tenant/events/{$event->slug}"); $response->assertOk(); $response->assertJsonPath('data.addons.0.label', 'Catalog Summary Label'); } }