seed([RoleSeeder::class, SamplePsgcSeeder::class, SampleDropOffPointsSeeder::class, SampleDumpsitesSeeder::class]); $driver = User::factory()->create(['role' => User::ROLE_DRIVER, 'status' => 'active']); $truck = Truck::create(['plate_number' => 'NCR-GF', 'status' => 'active']); $team = CollectionTeam::create([ 'name' => 'T-GF', 'driver_id' => $driver->id, 'truck_id' => $truck->id, 'status' => 'active', ]); $truck->forceFill(['assigned_team_id' => $team->id])->save(); $dumpsite = Dumpsite::where('code', 'DS-PAYATAS-01')->firstOrFail(); $route = Route::create(['name' => 'R', 'code' => 'RT-GF', 'default_dumpsite_id' => $dumpsite->id, 'status' => 'active']); $trip = Trip::create([ 'trip_number' => 'TRIP-GF', 'route_id' => $route->id, 'team_id' => $team->id, 'dumpsite_id' => $dumpsite->id, 'scheduled_date' => now()->toDateString(), 'status' => 'in_progress', 'actual_start_time' => now(), ]); Sanctum::actingAs($driver); // First ping — outside the boundary $this->postJson("/api/v1/driver/trucks/{$truck->uuid}/location", [ 'lat' => 14.5, 'lng' => 121.0, 'trip_id' => $trip->uuid, ])->assertOk()->assertJsonPath('data.geofence_triggered', false); $this->assertSame('in_progress', $trip->fresh()->status); // Second ping — inside the seeded Payatas boundary $this->postJson("/api/v1/driver/trucks/{$truck->uuid}/location", [ 'lat' => 14.7155, 'lng' => 121.1083, 'trip_id' => $trip->uuid, ])->assertOk()->assertJsonPath('data.geofence_triggered', true); $this->assertSame('at_dumpsite', $trip->fresh()->status); $this->assertNotNull($trip->fresh()->dumpsite_arrival_time); } }