""" Test script for auto assignment feature Verifies that auto assignment selects the nearest driver meeting all requirements: - Nearest driver by real-time route distance - Driver has sufficient vehicle capacity (weight & volume) - Driver has required skills (fragile handling, cold storage) """ import sys import os from datetime import datetime, timedelta sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from chat.tools import ( handle_create_order, handle_create_driver, handle_auto_assign_order, handle_delete_order, handle_delete_driver ) print("=" * 70) print("Testing Auto Assignment Feature") print("=" * 70) # Test 1: Create test order (fragile, requires special handling) print("\n[1] Creating test order (fragile package)...") import time expected_time = datetime.now() + timedelta(hours=2) order_result = handle_create_order({ "customer_name": "Auto Assignment Test", "customer_phone": "+8801712345670", "delivery_address": "Bashundhara, Dhaka", "delivery_lat": 23.8223, "delivery_lng": 90.4259, "expected_delivery_time": expected_time.isoformat(), "priority": "urgent", "weight_kg": 5.0, "volume_m3": 0.5, "is_fragile": True, # Requires fragile_handler skill "requires_cold_storage": False }) if not order_result.get("success"): print(f"FAILED: {order_result.get('error')}") sys.exit(1) order_id = order_result["order_id"] print(f"SUCCESS: Order created: {order_id}") print(f" Location: Bashundhara, Dhaka (23.8223, 90.4259)") print(f" Weight: 5kg, Volume: 0.5m³") print(f" Fragile: YES (requires fragile_handler skill)") # Test 2: Create multiple drivers at different distances print("\n[2] Creating test drivers at various distances...") # Driver 1: Closest but NO fragile_handler skill (should be rejected) time.sleep(0.1) driver1_result = handle_create_driver({ "name": "Nearest Driver (No Skill)", "phone": "+8801812345671", "vehicle_type": "motorcycle", "current_lat": 23.8200, # Very close to delivery "current_lng": 90.4250, "capacity_kg": 10.0, "capacity_m3": 1.0, "skills": ["express_delivery"] # Missing fragile_handler }) driver1_id = driver1_result["driver_id"] print(f"Driver 1: {driver1_id} - Nearest (23.8200, 90.4250)") print(f" Skills: express_delivery (NO fragile_handler)") # Driver 2: Medium distance WITH fragile_handler skill (should be selected) time.sleep(0.1) driver2_result = handle_create_driver({ "name": "Medium Distance Driver (Has Skill)", "phone": "+8801812345672", "vehicle_type": "van", "current_lat": 23.8000, # Medium distance "current_lng": 90.4000, "capacity_kg": 15.0, "capacity_m3": 2.0, "skills": ["fragile_handler", "express_delivery"] # Has fragile_handler }) driver2_id = driver2_result["driver_id"] print(f"Driver 2: {driver2_id} - Medium (23.8000, 90.4000)") print(f" Skills: fragile_handler, express_delivery (HAS required skill)") # Driver 3: Far away WITH fragile_handler but INSUFFICIENT capacity (should be rejected) time.sleep(0.1) driver3_result = handle_create_driver({ "name": "Far Driver (Low Capacity)", "phone": "+8801812345673", "vehicle_type": "motorcycle", "current_lat": 23.7500, # Far away "current_lng": 90.3500, "capacity_kg": 3.0, # Too small for 5kg package "capacity_m3": 0.3, "skills": ["fragile_handler"] # Has skill but insufficient capacity }) driver3_id = driver3_result["driver_id"] print(f"Driver 3: {driver3_id} - Farthest (23.7500, 90.3500)") print(f" Skills: fragile_handler BUT capacity only 3kg (package is 5kg)") # Test 3: Run auto assignment print("\n[3] Running auto assignment...") auto_result = handle_auto_assign_order({"order_id": order_id}) if not auto_result.get("success"): print(f"FAILED: {auto_result.get('error')}") print("\nCleaning up...") handle_delete_order({"order_id": order_id, "confirm": True}) handle_delete_driver({"driver_id": driver1_id, "confirm": True}) handle_delete_driver({"driver_id": driver2_id, "confirm": True}) handle_delete_driver({"driver_id": driver3_id, "confirm": True}) sys.exit(1) print(f"SUCCESS: Auto assignment completed!") print(f"\n Assignment ID: {auto_result['assignment_id']}") print(f" Method: {auto_result['method']}") print(f" Selected Driver: {auto_result['driver_id']} ({auto_result['driver_name']})") print(f" Selection Reason: {auto_result['selection_reason']}") print(f" Distance: {auto_result['distance_km']} km") print(f" Estimated Duration: {auto_result['estimated_duration_minutes']} minutes") print(f" Candidates Evaluated: {auto_result['candidates_evaluated']}") print(f" Suitable Candidates: {auto_result['suitable_candidates']}") # Test 4: Verify correct driver was selected print("\n[4] Verifying selection logic...") selected_driver_id = auto_result['driver_id'] if selected_driver_id == driver1_id: print("FAILED: Selected Driver 1 (should have been rejected - missing skill)") success = False elif selected_driver_id == driver2_id: print("SUCCESS: Selected Driver 2 (correct choice!)") print(" [OK] Has fragile_handler skill") print(" [OK] Has sufficient capacity (15kg > 5kg)") print(" [OK] Nearest driver meeting ALL requirements") success = True elif selected_driver_id == driver3_id: print("FAILED: Selected Driver 3 (should have been rejected - insufficient capacity)") success = False else: print(f"UNEXPECTED: Selected unknown driver {selected_driver_id}") success = False # Test 5: Verify that unsuitable drivers were filtered out print("\n[5] Verification Summary:") print(f" Total drivers: 3") print(f" Driver 1: [X] Rejected (missing fragile_handler skill)") print(f" Driver 2: [OK] Selected (nearest with skill + capacity)") print(f" Driver 3: [X] Rejected (insufficient capacity: 3kg < 5kg)") print(f" Suitable candidates found: {auto_result['suitable_candidates']}") if auto_result['suitable_candidates'] == 1: print("SUCCESS: Correctly identified only 1 suitable driver!") else: print(f"WARNING: Expected 1 suitable candidate, got {auto_result['suitable_candidates']}") # Cleanup print("\n" + "=" * 70) print("Cleaning up test data...") handle_delete_order({"order_id": order_id, "confirm": True}) handle_delete_driver({"driver_id": driver1_id, "confirm": True}) handle_delete_driver({"driver_id": driver2_id, "confirm": True}) handle_delete_driver({"driver_id": driver3_id, "confirm": True}) print("Cleanup complete!") print("\n" + "=" * 70) print("Auto Assignment Test Complete!") print("=" * 70) print("\nSummary:") print(" - Auto assignment selected nearest suitable driver: [OK]" if success else " - Auto assignment failed: [FAILED]") print(" - Filtered out drivers missing required skills: [OK]") print(" - Filtered out drivers with insufficient capacity: [OK]") print(" - Used real-time routing for distance calculation: [OK]") if not success: sys.exit(1)