assertSame('simulator_fiscal_delta_20261021_test', $db->name); $this->assertSame(55441, (int) $db->port); $this->withoutVite(); } public function test_public_parks_remain_selectable_with_zero_results_without_exposing_private_or_other_territories(): void { $province = '059b02ca-7095-577a-8705-4d4c46896747'; $template = app(InvestmentZones::class)->visible()->firstOrFail(); $ids = []; foreach (['public', 'private', 'other'] as $case) { $zone = $template->replicate(); $zone->id = (string) Str::uuid(); $zone->code = 'SINT-SELECTOR-'.Str::random(12); $zone->name = 'SINTÉTICO QA '.$case; $zone->category = 'industrial_park'; $zone->primary_territory_id = $case === 'other' ? '9e42dac8-fd9b-523f-bf59-71a7d3aa0fb8' : $province; $zone->publication_status = $case === 'private' ? 'draft' : 'published'; $zone->source_evidence = [['source_type' => 'government', 'url' => 'https://example.test/qa-only', 'supports' => 'Synthetic QA fixture, not a legal source']]; $zone->save(); $ids[$case] = $zone->id; } $scope = ['province_id' => $province, 'park_id' => $ids['public'], 'q' => 'no-matching-opportunity-'.Str::uuid()]; $this->assertSame(0, app(InvestmentCatalogue::class)->query($scope)->count()); $response = $this->getJson('/api/v1/investment/references?'.http_build_query($scope))->assertOk(); $available = array_column($response->json('zones'), 'id'); $this->assertContains($ids['public'], $available); $this->assertNotContains($ids['private'], $available); $this->assertNotContains($ids['other'], $available); $this->assertContains($ids['other'], array_column($this->getJson('/api/v1/investment/references')->assertOk()->json('zones'), 'id')); $this->get('/zonas/'.$ids['public'])->assertOk(); $this->get('/zonas/'.$ids['private'])->assertNotFound(); } public function test_activity_catalogue_does_not_disappear_when_opportunity_search_has_no_matches(): void { $catalogue = app(InvestmentCatalogue::class); $global = collect($catalogue->references()['classification']['targets']['activity'])->pluck('id')->all(); $this->assertNotEmpty($global); foreach (['059b02ca-7095-577a-8705-4d4c46896747', '9e42dac8-fd9b-523f-bf59-71a7d3aa0fb8'] as $province) { $scope = ['province_id' => $province, 'q' => 'no-matching-opportunity-'.Str::uuid(), 'sector' => 'tourism']; $this->assertSame(0, $catalogue->query($scope)->count()); $this->assertSame($global, collect($catalogue->references(false, $scope)['classification']['targets']['activity'])->pluck('id')->all()); } } public function test_public_master_structures_and_chain_are_available_without_opportunities_or_published_dossiers(): void { $province = '059b02ca-7095-577a-8705-4d4c46896747'; $clusters = []; foreach (['public', 'internal'] as $visibility) { $id = (string) Str::uuid(); DB::table('economic_clusters')->insert(['id' => $id, 'code' => 'SINT-'.Str::random(12), 'name' => 'SINTÉTICO QA cluster', 'sector' => 'QA', 'status' => 'active', 'data_classification' => $visibility, 'primary_territory_id' => $province]); $clusters[$visibility] = $id; } $corridor = (string) Str::uuid(); DB::table('development_corridors')->insert(['id' => $corridor, 'code' => 'SINT-'.Str::random(12), 'name' => 'SINTÉTICO QA corredor', 'status' => 'active', 'data_classification' => 'public', 'primary_territory_id' => $province]); $project = Project::factory()->create(['data_classification' => 'public', 'primary_territory_id' => $province]); $chain = (string) Str::uuid(); DB::table('value_chains')->insert(['id' => $chain, 'cluster_id' => $clusters['public'], 'code' => 'SINT-'.Str::random(12), 'name' => 'SINTÉTICO QA cadeia', 'stage' => 'production', 'data_classification' => 'public']); $refs = app(InvestmentCatalogue::class)->references(false, ['province_id' => $province, 'q' => 'no-matching-opportunity']); $this->assertContains($clusters['public'], $refs['clusters']->pluck('id')->all()); $this->assertNotContains($clusters['internal'], $refs['clusters']->pluck('id')->all()); $this->assertContains($corridor, $refs['corridors']->pluck('id')->all()); $this->assertContains($project->id, $refs['projects']->pluck('id')->all()); $this->assertContains($chain, collect($refs['classification']['targets']['chain'])->pluck('id')->all()); $other = app(InvestmentCatalogue::class)->references(false, ['province_id' => '9e42dac8-fd9b-523f-bf59-71a7d3aa0fb8']); $this->assertNotContains($clusters['public'], $other['clusters']->pluck('id')->all()); $this->assertNotContains($chain, collect($other['classification']['targets']['chain'])->pluck('id')->all()); } }