Files
Investidor-V2/tests/Feature/SectorCatalogueContentTest.php
T

96 lines
4.7 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\Opportunity;
use App\Models\Sector;
use App\Services\SectorInvestment;
use App\Support\IsolatedQaDatabase;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Tests\TestCase;
class SectorCatalogueContentTest extends TestCase
{
use DatabaseTransactions;
public function createApplication(): Application
{
$app = parent::createApplication();
if (! IsolatedQaDatabase::allowsSchemaChanges()) {
throw new \LogicException('Isolated QA required for sector catalogue restoration.');
}
return $app;
}
protected function setUp(): void
{
parent::setUp();
$this->withoutVite();
config(['portal.legacy_content_enabled' => false, 'portal.legacy_content_qa_enabled' => false,
'investor-path.enabled' => true, 'portal.profile_access_enabled' => true]);
}
private function sector(array $attributes = []): Sector
{
return Sector::create([...['name' => 'Sector sintético QA', 'slug' => 'qa-sector-'.Str::lower(Str::random(12)),
'short_description' => 'Exemplo isolado para a reposição.', 'is_active' => true, 'published_at' => now()->subDay()], ...$attributes]);
}
public function test_complete_catalogue_matches_public_sector_pages_including_sectors_without_guides(): void
{
$withoutGuide = $this->sector();
$this->assertArrayNotHasKey($withoutGuide->slug, SectorInvestment::CONTENT);
$before = [DB::table('desk_cases')->count(), DB::table('opportunities')->count(), DB::table('portal_resources')->count()];
$props = $this->get('/sectores')->assertOk()->inertiaProps();
$this->assertSame(array_column($props['sectors'], 'id'), array_column(array_column($props['sectorDetails'], 'sector'), 'id'));
foreach ($props['sectorDetails'] as $detail) {
$single = $this->get('/sectores/'.$detail['sector']['slug'])->assertOk()->inertiaProps();
$this->assertSame($single['sector'], $detail['sector']);
$this->assertSame($single['sectorEntry'], $detail['sectorEntry']);
$this->assertSame($single['opportunities'], $detail['opportunities']);
$this->assertIsArray($detail['sectorEntry']['articles']);
$this->assertIsArray($detail['sectorEntry']['relations']);
$this->assertIsArray($detail['sectorEntry']['locations']);
}
$entry = collect($props['sectorDetails'])->firstWhere('sector.id', $withoutGuide->id)['sectorEntry'];
$this->assertSame([], $entry['articles']);
$this->assertSame('/minhas-oportunidades/create?sector_id='.$withoutGuide->id, $entry['register_href']);
$this->assertNotNull($entry['start_href']);
$this->assertGuest();
$this->assertSame($before, [DB::table('desk_cases')->count(), DB::table('opportunities')->count(), DB::table('portal_resources')->count()]);
}
public function test_full_catalogue_preserves_publication_boundaries_and_private_tool_notices(): void
{
$public = $this->sector();
$unpublished = $this->sector(['published_at' => null]);
$inactive = $this->sector(['is_active' => false]);
$slugs = [];
foreach (['published', 'draft', 'future'] as $state) {
$slug = 'qa-sector-opportunity-'.Str::lower(Str::random(12));
$slugs[$state] = $slug;
Opportunity::create(['sector_id' => $public->id, 'reference' => $slug, 'title' => $state,
'slug' => $slug, 'summary' => 'Conteúdo sintético de teste.',
'status' => $state === 'draft' ? 'draft' : 'published', 'published_at' => $state === 'future' ? now()->addDay() : now()->subDay()]);
}
config(['investor-path.enabled' => false, 'portal.profile_access_enabled' => false]);
$props = $this->get('/sectores')->assertOk()->inertiaProps();
$ids = array_column(array_column($props['sectorDetails'], 'sector'), 'id');
$this->assertNotContains($unpublished->id, $ids);
$this->assertNotContains($inactive->id, $ids);
$detail = collect($props['sectorDetails'])->firstWhere('sector.id', $public->id);
$this->assertSame([$slugs['published']], array_column($detail['opportunities'], 'slug'));
$this->assertNull($detail['sectorEntry']['start_href']);
$this->assertNull($detail['sectorEntry']['register_href']);
$this->assertNotEmpty($detail['sectorEntry']['start_notice']);
$this->assertNotEmpty($detail['sectorEntry']['register_notice']);
$this->get('/sectores/'.$unpublished->slug)->assertNotFound();
$this->get('/sectores/'.$inactive->slug)->assertNotFound();
}
}