PromptWar / tests /test_queue_service.py
Mr-TD's picture
feat: Add operator dashboard, alerts, analytics, and simulator pages
aefe381
"""Queue management service tests."""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from services.queue_service import QueueService
from models.queue import QueueStation, QueueCategory
def _make_service():
"""Create a queue service with test stations."""
qs = QueueService()
stations = [
QueueStation(id="f1", name="Pizza Stall", category="food", zone_id="z1",
avg_service_time_sec=60, current_length=5),
QueueStation(id="f2", name="Burger Joint", category="food", zone_id="z1",
avg_service_time_sec=90, current_length=10),
QueueStation(id="r1", name="Restroom A", category="restroom", zone_id="z2",
avg_service_time_sec=120, current_length=3),
QueueStation(id="m1", name="Merch Shop", category="merch", zone_id="z3",
avg_service_time_sec=120, current_length=0, is_open=False),
]
qs.register_stations(stations)
return qs
class TestQueueStation:
"""Test queue station model."""
def test_wait_time_calculation(self):
station = QueueStation(id="t", name="T", category="food", zone_id="z",
avg_service_time_sec=60, current_length=5)
assert station.estimated_wait_minutes == 5.0
def test_zero_queue_wait(self):
station = QueueStation(id="t", name="T", category="food", zone_id="z",
current_length=0)
assert station.estimated_wait_minutes == 0.0
def test_closed_station_wait(self):
station = QueueStation(id="t", name="T", category="food", zone_id="z",
current_length=10, is_open=False)
assert station.estimated_wait_minutes == 0.0
def test_wait_levels(self):
short = QueueStation(id="t", name="T", category="food", zone_id="z",
avg_service_time_sec=60, current_length=2)
assert short.wait_level == "short"
moderate = QueueStation(id="t", name="T", category="food", zone_id="z",
avg_service_time_sec=60, current_length=8)
assert moderate.wait_level == "moderate"
long_q = QueueStation(id="t", name="T", category="food", zone_id="z",
avg_service_time_sec=60, current_length=20)
assert long_q.wait_level == "long"
def test_category_icons(self):
assert QueueCategory.FOOD.icon == "๐Ÿ•"
assert QueueCategory.RESTROOM.icon == "๐Ÿšป"
assert QueueCategory.MERCHANDISE.icon == "๐Ÿ›๏ธ"
class TestQueueService:
"""Test queue service operations."""
def test_get_all_stations(self):
qs = _make_service()
stations = qs.get_all_stations()
assert len(stations) == 4
def test_filter_by_category(self):
qs = _make_service()
food = qs.get_stations_by_category("food")
assert len(food) == 2
assert all(s["category"] == "food" for s in food)
def test_filter_by_zone(self):
qs = _make_service()
z1 = qs.get_stations_by_zone("z1")
assert len(z1) == 2
def test_update_queue_length(self):
qs = _make_service()
result = qs.update_queue_length("f1", 20)
assert result["current_length"] == 20
def test_update_nonexistent_station(self):
qs = _make_service()
result = qs.update_queue_length("nonexistent", 5)
assert result is None
def test_shortest_queue_overall(self):
qs = _make_service()
shortest = qs.get_shortest_queue()
assert shortest is not None
assert shortest["current_length"] <= 5
def test_shortest_queue_by_category(self):
qs = _make_service()
shortest = qs.get_shortest_queue("food")
assert shortest["category"] == "food"
assert shortest["id"] == "f1" # Pizza Stall has fewer people
def test_queue_summary(self):
qs = _make_service()
summary = qs.get_queue_summary()
assert "total_stations" in summary
assert "total_people_waiting" in summary
assert "categories" in summary
def test_virtual_queue_join(self):
qs = _make_service()
ticket = qs.join_virtual_queue("user1", "f1")
assert ticket is not None
assert ticket["user_id"] == "user1"
assert ticket["station_id"] == "f1"
assert ticket["position"] == 1
assert ticket["status"] == "waiting"
def test_virtual_queue_duplicate(self):
qs = _make_service()
t1 = qs.join_virtual_queue("user1", "f1")
t2 = qs.join_virtual_queue("user1", "f1")
# Should return existing ticket
assert t1["id"] == t2["id"]
def test_virtual_queue_position(self):
qs = _make_service()
t1 = qs.join_virtual_queue("user1", "f1")
t2 = qs.join_virtual_queue("user2", "f1")
assert t1["position"] == 1
assert t2["position"] == 2
def test_get_user_tickets(self):
qs = _make_service()
qs.join_virtual_queue("user1", "f1")
qs.join_virtual_queue("user1", "r1")
tickets = qs.get_user_tickets("user1")
assert len(tickets) == 2
def test_cancel_ticket(self):
qs = _make_service()
ticket = qs.join_virtual_queue("user1", "f1")
result = qs.cancel_ticket(ticket["id"], "user1")
assert result is True
def test_cancel_ticket_wrong_user(self):
qs = _make_service()
ticket = qs.join_virtual_queue("user1", "f1")
result = qs.cancel_ticket(ticket["id"], "user2")
assert result is False
def test_join_closed_station(self):
qs = _make_service()
ticket = qs.join_virtual_queue("user1", "m1") # Merch shop is closed
assert ticket is None