added ordering of orders

This commit is contained in:
Jan Felix Wiebe 2025-07-09 22:23:29 +02:00
parent cbe9369712
commit 87310d77f0
2 changed files with 126 additions and 2 deletions

View file

@ -25,8 +25,8 @@ class OrderDatabase:
return order
def get_all_orders(self) -> List[Order]:
"""Get all orders."""
return list(self.orders.values())
"""Get all orders sorted by order date (oldest first)."""
return sorted(self.orders.values(), key=lambda order: order.order_date)
def get_order_by_id(self, order_id: str) -> Optional[Order]:
"""Get a specific order by ID."""

View file

@ -142,6 +142,42 @@ class TestTschunkOrderAPI:
# Prüfe, dass unsere Bestellung dabei ist
order_ids = [order["id"] for order in orders]
assert create_response.json()["id"] in order_ids
def test_orders_sorted_by_date(self, client):
"""Test dass Bestellungen nach Bestelldatum sortiert sind (älteste zuerst)"""
# Erstelle mehrere Bestellungen mit kurzen Pausen
import time
orders = []
for i in range(3):
order_data = {
"drinks": [
{
"drink_type": "Tschunk",
"mate_type": "Club Mate",
"quantity": i + 1,
"notes": f"Test-Bestellung {i + 1}"
}
]
}
response = client.post("/orders", json=order_data)
assert response.status_code == 201
orders.append(response.json())
time.sleep(0.1) # Kurze Pause zwischen Bestellungen
# Hole alle Bestellungen
response = client.get("/orders")
assert response.status_code == 200
all_orders = response.json()
# Prüfe, dass Bestellungen nach order_date sortiert sind (älteste zuerst)
order_dates = [order["order_date"] for order in all_orders if order["id"] in [o["id"] for o in orders]]
assert len(order_dates) == 3
# Prüfe Sortierung (order_dates sollten aufsteigend sein)
for i in range(len(order_dates) - 1):
assert order_dates[i] <= order_dates[i + 1], f"Bestellungen sind nicht korrekt sortiert: {order_dates[i]} > {order_dates[i + 1]}"
def test_delete_order_success(self, client, sample_order):
"""Test erfolgreiche Bestelllöschung"""
@ -465,6 +501,94 @@ class TestWebSocket:
websocket_manager.disconnect(mock_ws2)
websocket_manager.disconnect(mock_ws3)
@pytest.mark.asyncio
async def test_websocket_orders_sorted(self):
"""Test dass WebSocket-Broadcasts sortierte Bestellungen senden"""
from websocket_manager import websocket_manager
from database import db # Verwende globale Datenbank-Instanz
from models import Drink, DrinkType, MateType
# Erstelle einen Test-WebSocket
class MockWebSocket:
def __init__(self):
self.messages = []
self.closed = False
async def accept(self):
pass
async def send_text(self, message):
self.messages.append(message)
async def receive_text(self):
return "ping"
async def close(self):
self.closed = True
# Erstelle mehrere Bestellungen in der globalen Datenbank
import asyncio
orders = []
for i in range(3):
drinks = [
Drink(
drink_type=DrinkType.TSCHUNK,
mate_type=MateType.CLUB_MATE,
quantity=i + 1,
notes=f"Test-Bestellung {i + 1}"
)
]
order = await db.create_order(drinks)
orders.append(order)
await asyncio.sleep(0.1) # Kurze Pause zwischen Bestellungen
# Verbinde Mock-WebSocket (sollte all_orders broadcast auslösen)
mock_ws = MockWebSocket()
await websocket_manager.connect(mock_ws)
# Simuliere den WebSocket-Endpunkt: Sende alle Bestellungen
all_orders = [order.model_dump() for order in db.get_all_orders()]
await websocket_manager.broadcast_all_orders(all_orders)
# Prüfe, dass die all_orders Nachricht gesendet wurde
assert len(mock_ws.messages) >= 1
# Finde die "all_orders" Nachricht
all_orders_message = None
for message in mock_ws.messages:
try:
data = json.loads(message)
if data.get("type") == "all_orders":
all_orders_message = data
break
except json.JSONDecodeError:
continue
assert all_orders_message is not None
assert "orders" in all_orders_message
# Prüfe, dass Bestellungen sortiert sind (älteste zuerst)
orders_data = all_orders_message["orders"]
assert len(orders_data) >= 3
# Extrahiere unsere Test-Bestellungen
test_order_ids = [order.id for order in orders]
test_orders = [order for order in orders_data if order["id"] in test_order_ids]
assert len(test_orders) == 3
# Prüfe Sortierung nach order_date
order_dates = [order["order_date"] for order in test_orders]
for i in range(len(order_dates) - 1):
assert order_dates[i] <= order_dates[i + 1], f"WebSocket-Bestellungen sind nicht korrekt sortiert: {order_dates[i]} > {order_dates[i + 1]}"
# Cleanup: Lösche Test-Bestellungen
for order in orders:
await db.delete_order(order.id)
websocket_manager.disconnect(mock_ws)
class TestDatabase:
"""Test-Klasse für Datenbankfunktionalität"""