File size: 6,971 Bytes
315fafc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
"""
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)