Files
Investidor-V2/tests/Feature/PortalAuditRoutesTest.php

75 lines
3.8 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\User;
use Database\Seeders\TerritoryReferenceSeeder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Route;
use Tests\TestCase;
class PortalAuditRoutesTest extends TestCase
{
use RefreshDatabase;
public function test_static_portal_get_routes_for_public_investor_and_manager_do_not_crash(): void
{
$this->withoutVite();
$identity = DB::selectOne('SELECT current_database() AS database,inet_server_port() AS port');
$this->assertStringEndsWith('_test', $identity->database);
$this->assertSame(55441, (int) $identity->port);
Http::fake();
$this->seed(TerritoryReferenceSeeder::class);
DB::statement("SET LOCAL statement_timeout = '20s'");
$investor = User::factory()->create();
$manager = User::factory()->create();
$reviewer = User::factory()->create();
$reviewer->forceFill(['two_factor_secret' => Crypt::encryptString('QA-SYNTHETIC'), 'two_factor_confirmed_at' => now()])->save();
config(['portal.managers' => [$manager->email, $reviewer->email], 'suitecrm.enabled' => false, 'investmoz_ai.enabled' => false, 'education.enabled' => true]);
foreach (['existing-business' => ['reviewers', 'triagers', 'approvers_l1', 'approvers_l2', 'publishers'], 'investment-zones' => ['legal_reviewers', 'gis_reviewers', 'territory_reviewers', 'publishers'], 'territorial' => ['editors', 'reviewers', 'publishers'], 'simulation-tax-governance' => ['editors', 'reviewers', 'publishers']] as $module => $roles) {
foreach ($roles as $role) {
config([$module.'.'.$role => [$reviewer->email]]);
}
}
$results = [];
$failures = [];
foreach (['public' => null, 'investor' => $investor, 'manager' => $manager, 'designated_mfa_qa' => $reviewer] as $profile => $actor) {
if ($actor) {
$this->actingAs($actor);
} else {
$this->app['auth']->forgetGuards();
}
foreach (Route::getRoutes() as $route) {
$uri = $route->uri();
if (! in_array('GET', $route->methods(), true) || str_contains($uri, '{') || ! str_contains($route->getActionName(), 'App\\Http\\Controllers\\') || str_contains($uri, 'export')) {
continue;
}
$url = '/'.ltrim($uri, '/');
if (str_ends_with($url, '/territory-options')) {
$url .= '?type=province&q=Maputo';
}
$response = $this->get($url);
$results[] = ['profile' => $profile, 'route' => $url, 'status' => $response->status(), 'coverage' => 'HTTP GET, schema migrated and empty QA; not visual acceptance'];
if ($url === '/management/territory-geometry-import' && in_array($profile, ['manager', 'designated_mfa_qa'], true) && ! config('geometry-import.enabled')) {
$response->assertStatus(503); // The disabled import explicitly reports unavailability.
continue;
}
if ($response->status() >= 500) {
$failures[] = $profile.' '.$url.' HTTP '.$response->status();
}
}
}
$dir = storage_path('app/private/investmoz-v2/portal-audit');
if (! is_dir($dir)) {
mkdir($dir, 0700, true);
}
file_put_contents($dir.'/ensaios-rotas.json', json_encode(['captured_at' => gmdate('c'), 'qa' => $identity, 'results' => $results, 'failures' => $failures, 'active_writes' => 0], JSON_PRETTY_PRINT | JSON_THROW_ON_ERROR));
Http::assertNothingSent();
$this->assertSame([], $failures);
}
}