75 lines
3.8 KiB
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);
|
|
}
|
|
}
|