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

96 lines
4.7 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\Sector;
use App\Models\User;
use App\Services\InvestmentGeography;
use App\Services\InvestmentZones;
use App\Services\SectorInvestment;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Tests\Support\ProactiveInvestmentFixture;
use Tests\TestCase;
final class InvestorUsabilityScopeTest extends TestCase
{
use DatabaseTransactions;
protected function setUp(): void
{
parent::setUp();
ProactiveInvestmentFixture::guard();
$this->withoutVite();
}
public function test_public_sector_is_consultable_by_guest_and_accounts_without_promoter_grants(): void
{
config(['portal.homologation_only' => false, 'portal.legacy_content_enabled' => false, 'portal.legacy_content_qa_enabled' => false]);
$this->get('/sectores/turismo')->assertOk();
$actor = User::factory()->create();
$this->actingAs($actor)->get('/sectores/turismo')->assertOk();
$this->assertSame(0, DB::table('portal_role_assignments')->where('user_id', $actor->id)->count());
config(['portal.profile_access_enabled' => true]);
$entry = app(SectorInvestment::class)->publicView(Sector::where('slug', 'turismo')->firstOrFail());
$this->assertSame('/perfil/promotor', $entry['register_href']);
$this->assertSame('Pedir acesso para cadastrar oportunidades', $entry['register_label']);
}
public function test_zones_all_equals_visible_set_and_province_and_district_never_fall_back_to_all(): void
{
$zones = app(InvestmentZones::class);
$geo = app(InvestmentGeography::class);
$province = '059b02ca-7095-577a-8705-4d4c46896747';
$district = $geo->publicReferences()->where('parent_id', $province)->where('location_type', 'district')->first();
$template = $zones->visible()->firstOrFail();
$make = function ($territory, $published = true) use ($template) {
$zone = $template->replicate();
$zone->id = (string) Str::uuid();
$zone->code = 'SYNTHETIC-'.Str::random(12);
$zone->name = 'SYNTHETIC QA zone scope';
$zone->primary_territory_id = $territory;
$zone->publication_status = $published ? 'published' : 'draft';
$zone->save();
return $zone;
};
$inside = $make($district->id);
$outside = $make('9e42dac8-fd9b-523f-bf59-71a7d3aa0fb8');
$private = $make($district->id, false);
$all = $zones->search([])->orderBy('id')->pluck('id')->all();
$this->assertSame($zones->visible()->orderBy('id')->pluck('id')->all(), $all);
foreach ([['province_id' => $province], ['province_id' => $province, 'district_id' => $district->id]] as $selection) {
$ids = $zones->search($selection)->pluck('id')->all();
$this->assertContains($inside->id, $ids);
$this->assertNotContains($outside->id, $ids);
$this->assertNotContains($private->id, $ids);
}
}
public function test_documented_legal_scope_covers_child_area_but_influence_does_not_become_an_installation(): void
{
$zones = app(InvestmentZones::class);
$geo = app(InvestmentGeography::class);
$province = '059b02ca-7095-577a-8705-4d4c46896747';
$district = $geo->publicReferences()->where('parent_id', $province)->where('location_type', 'district')->first();
$editor = User::factory()->create();
$reviewer = User::factory()->create();
$template = $zones->visible()->firstOrFail();
$ids = [];
foreach (['legal_scope', 'influence'] as $scope) {
$zone = $template->replicate();
$zone->id = (string) Str::uuid();
$zone->code = 'SYNTHETIC-'.Str::random(12);
$zone->name = 'SYNTHETIC QA legal coverage';
$zone->primary_territory_id = '9e42dac8-fd9b-523f-bf59-71a7d3aa0fb8';
$zone->save();
$ids[$scope] = $zone->id;
DB::table('investment_zone_locations')->insert(['id' => (string) Str::uuid(), 'zone_id' => $zone->id, 'geo_location_id' => $scope === 'legal_scope' ? $province : $district->id, 'scope_type' => $scope, 'source_reference' => 'SYNTHETIC isolated QA scope fixture', 'validation_status' => 'validated', 'editor_id' => $editor->id, 'reviewer_id' => $reviewer->id, 'valid_from' => now()->subDay(), 'version_no' => 1, 'created_at' => now(), 'updated_at' => now()]);
}
$matches = $zones->search(['province_id' => $province, 'district_id' => $district->id])->pluck('id')->all();
$this->assertContains($ids['legal_scope'], $matches);
$this->assertNotContains($ids['influence'], $matches);
}
}