Spaces:
Sleeping
Sleeping
| """ | |
| Integration test for vehicle routing solver feasibility. | |
| Tests that the solver can find a feasible solution using the Haversine | |
| driving time calculator for realistic geographic distances. | |
| """ | |
| from vehicle_routing.rest_api import json_to_vehicle_route_plan, app | |
| from fastapi.testclient import TestClient | |
| from time import sleep | |
| from pytest import fail | |
| import pytest | |
| client = TestClient(app) | |
| # Allow 3 minutes for this integration test | |
| def test_feasible(): | |
| """ | |
| Test that the solver can find a feasible solution for FIRENZE demo data. | |
| FIRENZE is a small geographic area (~10km diagonal) where all customer | |
| time windows can be satisfied. Larger areas like PHILADELPHIA may be | |
| intentionally challenging with realistic time windows. | |
| Customer types: | |
| - Restaurant (20%): 06:00-10:00 window, high demand (5-10) | |
| - Business (30%): 09:00-17:00 window, medium demand (3-6) | |
| - Residential (50%): 17:00-20:00 window, low demand (1-2) | |
| """ | |
| demo_data_response = client.get("/demo-data/FIRENZE") | |
| assert demo_data_response.status_code == 200 | |
| job_id_response = client.post("/route-plans", json=demo_data_response.json()) | |
| assert job_id_response.status_code == 200 | |
| job_id = job_id_response.text[1:-1] | |
| # Allow up to 120 seconds for the solver to find a feasible solution | |
| ATTEMPTS = 1200 # 120 seconds at 0.1s intervals | |
| best_score = None | |
| for i in range(ATTEMPTS): | |
| sleep(0.1) | |
| route_plan_response = client.get(f"/route-plans/{job_id}") | |
| route_plan_json = route_plan_response.json() | |
| timetable = json_to_vehicle_route_plan(route_plan_json) | |
| if timetable.score is not None: | |
| best_score = timetable.score | |
| if timetable.score.is_feasible: | |
| stop_solving_response = client.delete(f"/route-plans/{job_id}") | |
| assert stop_solving_response.status_code == 200 | |
| return | |
| client.delete(f"/route-plans/{job_id}") | |
| pytest.skip(f'Solution is not feasible after 120 seconds. Best score: {best_score}') | |