Cards e páginas /pacotes passam a usar o texto conceitual oficial, sem preço, VIP ou limites comerciais. Co-authored-by: Cursor <cursoragent@cursor.com>
93 lines
3.7 KiB
PHP
93 lines
3.7 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Tests\Feature\Marketing;
|
|
|
|
use App\Domain\Marketing\PackageIconCatalog;
|
|
use App\Models\WeddingPackage;
|
|
use Database\Seeders\ContentSeeder;
|
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
use Illuminate\Support\Str;
|
|
use Tests\TestCase;
|
|
|
|
class WeddingPackageTest extends TestCase
|
|
{
|
|
use RefreshDatabase;
|
|
|
|
public function test_published_scope_excludes_drafts_and_keeps_cms_order(): void
|
|
{
|
|
WeddingPackage::factory()->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'));
|
|
}
|
|
}
|