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]); } }