165 lines
5.3 KiB
PHP
165 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->seed([\Database\Seeders\SamplePsgcSeeder::class]);
|
|
|
|
$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]);
|
|
}
|
|
}
|