FairRelay / brain /tests /fixtures /test_data.py
MouleeswaranM's picture
Upload folder using huggingface_hub
fcf8749 verified
raw
history blame
5 kB
"""
Test data generators for creating realistic test scenarios.
"""
import uuid
import random
from datetime import date, datetime, timedelta
import numpy as np
from faker import Faker
fake = Faker()
def generate_drivers(count: int = 50, ev_ratio: float = 0.2) -> list:
"""
Generate realistic driver data.
Args:
count: Number of drivers to generate
ev_ratio: Percentage of drivers that are EV (0.0 to 1.0)
Returns:
List of dictionaries containing driver data
"""
drivers = []
for i in range(count):
is_ev = i < (count * ev_ratio)
driver_id = f"drv_{i:03d}"
drivers.append({
"id": driver_id,
"name": fake.name(),
"vehicle_capacity_kg": 100.0 if is_ev else 150.0,
"preferred_language": random.choice(["en", "ta", "hi", "te", "kn"]),
# Internal fields (not in API input but useful for model creation)
"gameified_experience_points": random.randint(100, 5000),
"is_ev": is_ev,
"battery_range_km": 120.0 if is_ev else None,
"charging_time_minutes": 45 if is_ev else None,
"experience_years": np.random.uniform(0.5, 5.0),
"complexity_debt": np.random.uniform(0, 3.0)
})
# Shuffle so EVs are distributed
random.shuffle(drivers)
return drivers
def generate_routes(count: int = 50, difficulty_levels: list = [1.0, 1.5, 2.0, 2.5, 3.0]) -> list:
"""
Generate realistic route data.
Args:
count: Number of routes to generate
difficulty_levels: List of difficulty multipliers
Returns:
List of dictionaries containing route data
"""
routes = []
for i in range(count):
route_id = f"rt_{i:03d}"
diff = difficulty_levels[i % len(difficulty_levels)]
routes.append({
"route_id": route_id,
"cluster_id": i,
"stops": int(8 + diff * 4),
"total_weight_kg": 40 + diff * 20,
"total_distance_km": 35 + diff * 15,
"parking_difficulty": diff,
"traffic_complexity": diff,
"estimated_time_minutes": int((35 + diff * 15) * 4) # Rough estimate
})
return routes
def generate_packages(count: int = 50, center_lat: float = 12.9716, center_lng: float = 77.5946) -> list:
"""
Generate realistic package data.
Args:
count: Number of packages
center_lat: Warehouse latitude
center_lng: Warehouse longitude
Returns:
List of dictionaries valid for PackageInput schema
"""
packages = []
for i in range(count):
# Generate random location within ~10km of center
lat_offset = random.uniform(-0.1, 0.1)
lng_offset = random.uniform(-0.1, 0.1)
packages.append({
"id": f"pkg_{i:04d}",
"weight_kg": round(random.uniform(0.5, 15.0), 1),
"fragility_level": random.randint(1, 5),
"address": fake.address(),
"latitude": center_lat + lat_offset,
"longitude": center_lng + lng_offset,
"priority": random.choice(["NORMAL", "NORMAL", "NORMAL", "HIGH", "EXPRESS"])
})
return packages
def generate_allocation_request(drivers: list, routes: list, date_str: str = None) -> dict:
"""
Generate a complete allocation request payload.
Note: This transforms the internal route/driver structures into the API schema format.
Args:
drivers: List of driver dicts from generate_drivers
routes: List of route dicts from generate_routes
date_str: Date string for allocation (YYYY-MM-DD)
Returns:
Dictionary matching AllocationRequest schema
"""
if not date_str:
date_str = date.today().isoformat()
# Create packages from routes (reverse engineer helpful for consistent tests)
# Or just generate fresh packages if routes are just for reference
# For full E2E, we usually provide packages and let the system cluster them.
# However, if we want to force specific route characteristics, we might need
# to carefully craft packages.
# For now, let's just generate a bunch of packages.
total_packages_needed = sum(r["stops"] * 2 for r in routes) # Approx 2 packages per stop
packages = generate_packages(total_packages_needed)
# Filter drivers for API input (remove internal fields)
api_drivers = []
for d in drivers:
api_drivers.append({
"id": d["id"],
"name": d["name"],
"vehicle_capacity_kg": d["vehicle_capacity_kg"],
"preferred_language": d["preferred_language"]
})
return {
"allocation_date": date_str,
"warehouse": {"lat": 12.9716, "lng": 77.5946},
"packages": packages,
"drivers": api_drivers
}