create(['name' => 'Rascunho', 'published_at' => null]); $second = WeddingPackage::factory()->published()->create(['name' => 'Segundo', 'sort_order' => 20]); $first = WeddingPackage::factory()->published()->create(['name' => 'Primeiro', 'sort_order' => 10]); $packages = WeddingPackage::query()->published()->orderBy('sort_order')->get(); $this->assertCount(2, $packages); $this->assertTrue($packages->first()?->is($first)); $this->assertTrue($packages->last()?->is($second)); } public function test_content_seeder_creates_official_wedding_modalities(): void { $this->app->detectEnvironment(fn (): string => 'testing'); $this->seed(ContentSeeder::class); $this->assertSame( ['Essenza', 'Conduzione', 'Grand Jour'], WeddingPackage::query()->published()->orderBy('sort_order')->pluck('name')->all(), ); $essenza = WeddingPackage::query()->where('name', 'Essenza')->first(); $this->assertNotNull($essenza); $this->assertSame('Assessoria completa', $essenza->tag); $this->assertSame('Do primeiro planejamento ao grande dia.', $essenza->subtitle); $this->assertStringContainsString('desde o início da organização', (string) $essenza->summary); $this->assertContains('Estruturação e acompanhamento do planejamento', $essenza->scope_items); $this->assertSame( ['Casais no início da organização', 'Quem ainda está estruturando etapas importantes', 'Quem quer acompanhamento do planejamento à execução'], $essenza->audience_points, ); $publicCopy = WeddingPackage::query()->published()->get()->map(fn (WeddingPackage $package): string => json_encode([ $package->summary, $package->subtitle, $package->hero_lead, $package->scope_items, $package->included_items, $package->audience_intro, $package->final_cta_body, ], JSON_THROW_ON_ERROR))->implode(' '); $this->assertStringNotContainsString('R$', $publicCopy); $this->assertStringNotContainsString('3.500', $publicCopy); $this->assertStringNotContainsString('Assessoria VIP', $publicCopy); $this->assertStringNotContainsString('90 km', $publicCopy); $this->assertStringNotContainsString('3,49%', $publicCopy); } public function test_factory_generates_a_slug_and_autofills_blank_slug_from_name(): void { $package = WeddingPackage::factory()->published()->create(); $this->assertNotEmpty($package->slug); $this->assertSame(Str::slug($package->name), $package->slug); $explicit = WeddingPackage::factory()->create(['name' => 'Pacote com nome', 'slug' => null]); $this->assertSame('pacote-com-nome', $explicit->slug); } public function test_package_icon_catalog_accepts_known_keys_and_rejects_unknown(): void { foreach (PackageIconCatalog::keys() as $key) { $this->assertTrue(PackageIconCatalog::isValid($key)); $this->assertNotNull(PackageIconCatalog::labelFor($key)); } $this->assertFalse(PackageIconCatalog::isValid('paw')); $this->assertNull(PackageIconCatalog::labelFor('paw')); } }