Files
Verde-Web/tests/Feature/SuperAdminHierarchyTest.php

164 lines
5.3 KiB
PHP

<?php
namespace Tests\Feature;
use App\Models\Tenant;
use App\Models\User;
use App\Models\DropOffPoint;
use App\Models\Dumpsite;
use App\Models\Route;
use App\Models\CollectionTeam;
use App\Models\Trip;
use App\Models\Truck;
use App\Models\CityMunicipality;
use App\Models\Barangay;
use App\Models\Household;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
class SuperAdminHierarchyTest extends TestCase
{
use RefreshDatabase;
protected $seed = true;
protected Tenant $lguA;
protected Tenant $lguB;
protected User $superAdmin;
protected function setUp(): void
{
parent::setUp();
$this->lguA = $this->defaultTenant;
$this->lguB = Tenant::factory()->create(['code' => 'LGU-B', 'name' => 'LGU B']);
$this->superAdmin = User::factory()->create([
'tenant_id' => null,
'role' => User::ROLE_SUPER_ADMIN,
]);
$this->withoutHeader('X-Tenant-Code');
\App\Tenancy\Tenancy::clear();
}
protected function seedLguEntities(Tenant $tenant, string $suffix)
{
$city = CityMunicipality::first();
$barangay = Barangay::first();
$dumpsite = Dumpsite::factory()->create(['tenant_id' => $tenant->id, 'name' => "Dumpsite $suffix"]);
$dop = DropOffPoint::factory()->create(['tenant_id' => $tenant->id, 'name' => "DOP $suffix", 'barangay_id' => $barangay->id]);
$team = new CollectionTeam(['name' => "Team $suffix", 'status' => 'active']);
$team->tenant_id = $tenant->id;
$team->save();
$route = new Route(['name' => "Route $suffix", 'code' => "RT-$suffix", 'geojson' => []]);
$route->tenant_id = $tenant->id;
$route->save();
$truck = new Truck(['plate_number' => "ABC-123$suffix", 'capacity_tons' => 5]);
$truck->tenant_id = $tenant->id;
$truck->save();
$trip = new Trip([
'route_id' => $route->id,
'truck_id' => $truck->id,
'team_id' => $team->id,
'scheduled_date' => now()->format('Y-m-d'),
'status' => 'scheduled'
]);
$trip->tenant_id = $tenant->id;
$trip->save();
$household = Household::factory()->create(['tenant_id' => $tenant->id, 'barangay_id' => $barangay->id]);
return [
'dumpsite' => $dumpsite,
'dop' => $dop,
'team' => $team,
'route' => $route,
'truck' => $truck,
'trip' => $trip,
'household' => $household,
'barangay' => $barangay
];
}
public function test_super_admin_can_view_all_entities_across_all_lgus()
{
$dataA = $this->seedLguEntities($this->lguA, 'A');
$dataB = $this->seedLguEntities($this->lguB, 'B');
$this->actingAs($this->superAdmin);
// Verify Dumpsites
$this->getJson('/api/v1/admin/dumpsites')
->assertOk()
->assertJsonFragment(['id' => $dataA['dumpsite']->uuid])
->assertJsonFragment(['id' => $dataB['dumpsite']->uuid]);
// Verify Drop-off Points
$this->getJson('/api/v1/admin/drop-off-points')
->assertOk()
->assertJsonFragment(['id' => $dataA['dop']->uuid])
->assertJsonFragment(['id' => $dataB['dop']->uuid]);
// Verify Teams
$this->getJson('/api/v1/admin/teams')
->assertOk()
->assertJsonFragment(['id' => $dataA['team']->uuid])
->assertJsonFragment(['id' => $dataB['team']->uuid]);
// Verify Routes
$this->getJson('/api/v1/admin/routes')
->assertOk()
->assertJsonFragment(['id' => $dataA['route']->uuid])
->assertJsonFragment(['id' => $dataB['route']->uuid]);
// Verify Trips
$this->getJson('/api/v1/admin/trips')
->assertOk()
->assertJsonFragment(['id' => $dataA['trip']->uuid])
->assertJsonFragment(['id' => $dataB['trip']->uuid]);
}
public function test_super_admin_can_manipulate_all_entities_in_any_lgu()
{
$dataA = $this->seedLguEntities($this->lguA, 'A');
$dataB = $this->seedLguEntities($this->lguB, 'B');
$this->actingAs($this->superAdmin);
// Update Dumpsite in LGU A
$this->patchJson("/api/v1/admin/dumpsites/{$dataA['dumpsite']->uuid}", [
'name' => 'Updated Dumpsite A',
'status' => 'maintenance'
])->assertOk();
// Update DOP in LGU B
$this->patchJson("/api/v1/admin/drop-off-points/{$dataB['dop']->uuid}", [
'name' => 'Updated DOP B',
'status' => 'closed'
])->assertOk();
}
public function test_super_admin_can_query_by_barangay_and_lgu()
{
$dataA = $this->seedLguEntities($this->lguA, 'A');
$this->actingAs($this->superAdmin);
// Filter Drop-off points by Tenant
$this->getJson('/api/v1/admin/drop-off-points?tenant_id=' . $this->lguA->id)
->assertOk()
->assertJsonFragment(['id' => $dataA['dop']->uuid]);
// Filter Drop-off points by Barangay
$this->getJson('/api/v1/admin/drop-off-points?barangay_id=' . $dataA['barangay']->id)
->assertOk()
->assertJsonFragment(['id' => $dataA['dop']->uuid]);
}
}