75 lines
2.9 KiB
Python
75 lines
2.9 KiB
Python
"""
|
|
Tests for domain-agent correctness fixes.
|
|
|
|
FleetAgent: hub availability accounting must stay within [0, total] across
|
|
maintenance / release / double-release (it used to drift because maintenance
|
|
didn't decrement and release incremented unconditionally).
|
|
|
|
OrderAgent: validation/categorization must not crash on a null address block or
|
|
a numeric pincode (valid JSON the backend may send).
|
|
|
|
Run:
|
|
python -m unittest discover -s tests
|
|
"""
|
|
import unittest
|
|
|
|
from core.types import AgentTask
|
|
from core.message_bus import message_bus
|
|
from agents.fleet_agent import FleetAgent
|
|
from agents.order_agent import OrderAgent
|
|
|
|
|
|
def _task(task_type, **data):
|
|
return AgentTask(task_id="t", agent_type="x", task_type=task_type, data=data)
|
|
|
|
|
|
class TestFleetCapacity(unittest.IsolatedAsyncioTestCase):
|
|
async def asyncTearDown(self):
|
|
message_bus.unregister_agent("FLEET_AGENT")
|
|
|
|
async def test_maintenance_release_stay_in_bounds(self):
|
|
fleet = FleetAgent()
|
|
hub = "DL-HUB-01"
|
|
total = fleet._hub_capacity[hub]["total"]
|
|
start = fleet._hub_capacity[hub]["available"]
|
|
|
|
await fleet._schedule_maintenance(_task("schedule_maintenance", vehicle_id="DL-V-001"))
|
|
self.assertEqual(fleet._hub_capacity[hub]["available"], start - 1) # decremented
|
|
|
|
await fleet._release_vehicle(_task("release_vehicle", vehicle_id="DL-V-001"))
|
|
self.assertEqual(fleet._hub_capacity[hub]["available"], start) # restored
|
|
|
|
# Releasing an already-available vehicle must not push above total.
|
|
await fleet._release_vehicle(_task("release_vehicle", vehicle_id="DL-V-001"))
|
|
self.assertEqual(fleet._hub_capacity[hub]["available"], start)
|
|
self.assertLessEqual(fleet._hub_capacity[hub]["available"], total)
|
|
|
|
|
|
class TestOrderRobustness(unittest.IsolatedAsyncioTestCase):
|
|
async def asyncTearDown(self):
|
|
message_bus.unregister_agent("ORDER_AGENT")
|
|
|
|
def test_addr_pincode_tolerates_null_and_numeric(self):
|
|
self.assertEqual(OrderAgent._addr_pincode({"pickup_address": None}, "pickup_address"), "")
|
|
self.assertEqual(OrderAgent._addr_pincode({"pickup_address": {"pincode": 400001}}, "pickup_address"), "400001")
|
|
self.assertEqual(OrderAgent._addr_pincode({}, "pickup_address"), "")
|
|
|
|
def test_valid_pincode_handles_int_and_none(self):
|
|
agent = OrderAgent()
|
|
self.assertTrue(agent._is_valid_pincode(400001)) # numeric, 6 digits
|
|
self.assertFalse(agent._is_valid_pincode(None))
|
|
self.assertFalse(agent._is_valid_pincode("12"))
|
|
|
|
def test_categorize_does_not_crash_on_bad_addresses(self):
|
|
agent = OrderAgent()
|
|
out = agent._categorize_order_data({
|
|
"pickup_address": None, # explicit null
|
|
"delivery_address": {"pincode": 400001}, # numeric pincode
|
|
"items": [],
|
|
})
|
|
self.assertIn("zone_type", out)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|