vehicle-routing-python / tests /test_feasible.py
blackopsrepl's picture
Upload 36 files
08e15f1 verified
"""
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)
@pytest.mark.timeout(180) # 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}')