.. | ||
.gitignore | ||
database.py | ||
main.py | ||
models.py | ||
pytest.ini | ||
README.md | ||
requirements.txt | ||
run_tests.py | ||
test_automated.py | ||
websocket_manager.py |
Tschunk Order API
Eine RESTful API für Tschunk-Bestellungen, entwickelt mit FastAPI.
Features
- Bestellungen mit mehreren Getränken erstellen
- Alle Bestellungen abrufen
- Spezifische Bestellungen löschen
- Unterstützung für verschiedene Tschunk-Varianten
- Wahl zwischen Flora Mate und Club Mate
- Mengenangabe für jedes Getränk (Standard: 1)
- Anmerkungen und Sonderwünsche für jedes Getränk
- WebSocket-Unterstützung für Echtzeit-Updates
- Automatisierte Tests mit pytest
Verfügbare Getränke
- Tschunk
- Tschunk Hannover-Mische
- Tschunk alkoholfreier Rum
- Virgin Tschunk
Mate-Sorten
- Flora Mate
- Club Mate
Installation
Voraussetzungen
- Python 3.8+ installiert
Setup
- Virtuelles Environment erstellen und aktivieren:
cd backend
# Virtuelles Environment erstellen
python -m venv venv
# Virtuelles Environment aktivieren
# Unter Linux/macOS:
source venv/bin/activate
# Unter Windows:
# venv\Scripts\activate
- Abhängigkeiten installieren:
pip install -r requirements.txt
Verwendung
Server starten
# Stelle sicher, dass das virtuelle Environment aktiviert ist
source venv/bin/activate # Linux/macOS
# venv\Scripts\activate # Windows
# Server starten
python main.py
Oder mit uvicorn:
uvicorn main:app --reload
Der Server läuft dann auf http://localhost:8000
API-Dokumentation
Die automatisch generierte API-Dokumentation ist verfügbar unter:
- Swagger UI:
http://localhost:8000/docs
- ReDoc:
http://localhost:8000/redoc
API-Endpunkte
1. Bestellung erstellen
POST /orders
Beispiel-Request:
{
"drinks": [
{
"drink_type": "Tschunk",
"mate_type": "Club Mate",
"quantity": 2,
"notes": "Bitte extra kalt servieren"
},
{
"drink_type": "Virgin Tschunk",
"mate_type": "Flora Mate",
"notes": "Ohne Eiswürfel"
},
{
"drink_type": "Tschunk Hannover-Mische",
"mate_type": "Club Mate",
"quantity": 1
}
]
}
Hinweise:
- Das
quantity
-Feld ist optional. Falls nicht angegeben, wird automatisch 1 verwendet. - Das
notes
-Feld ist optional und kann für Sonderwünsche oder Anmerkungen verwendet werden (max. 500 Zeichen). - Alle verbundenen WebSocket-Clients erhalten automatisch ein Update.
2. Alle Bestellungen abrufen
GET /orders
3. Bestellung löschen
DELETE /orders/{order_id}
Hinweis: Alle verbundenen WebSocket-Clients erhalten automatisch ein Update.
4. Verfügbare Getränke anzeigen
GET /drinks
5. WebSocket für Echtzeit-Updates
WS /ws
WebSocket-Nachrichten-Formate:
Neue Bestellung:
{
"type": "order_created",
"timestamp": "2024-01-15T10:30:00",
"order": {
"id": "uuid-here",
"order_date": "2024-01-15T10:30:00",
"drinks": [...]
}
}
Bestellung gelöscht:
{
"type": "order_deleted",
"timestamp": "2024-01-15T10:35:00",
"order_id": "uuid-here"
}
Alle Bestellungen (bei Verbindung):
{
"type": "all_orders",
"timestamp": "2024-01-15T10:30:00",
"orders": [...]
}
Beispiel-Verwendung mit curl
Bestellung erstellen:
curl -X POST "http://localhost:8000/orders" \
-H "Content-Type: application/json" \
-d '{
"drinks": [
{
"drink_type": "Tschunk",
"mate_type": "Club Mate",
"quantity": 3,
"notes": "Bitte mit Limettenscheibe garnieren"
},
{
"drink_type": "Virgin Tschunk",
"mate_type": "Flora Mate",
"notes": "Allergie gegen Zitrusfrüchte"
}
]
}'
Alle Bestellungen abrufen:
curl -X GET "http://localhost:8000/orders"
Bestellung löschen:
curl -X DELETE "http://localhost:8000/orders/{order_id}"
WebSocket-Client Beispiel
JavaScript (Browser):
const ws = new WebSocket('ws://localhost:8000/ws');
ws.onopen = function() {
console.log('WebSocket verbunden');
};
ws.onmessage = function(event) {
const data = JSON.parse(event.data);
switch(data.type) {
case 'order_created':
console.log('Neue Bestellung:', data.order);
break;
case 'order_deleted':
console.log('Bestellung gelöscht:', data.order_id);
break;
case 'all_orders':
console.log('Alle Bestellungen:', data.orders);
break;
}
};
ws.onclose = function() {
console.log('WebSocket getrennt');
};
Python:
import asyncio
import websockets
import json
async def websocket_client():
async with websockets.connect('ws://localhost:8000/ws') as websocket:
while True:
message = await websocket.recv()
data = json.loads(message)
print(f"Empfangen: {data}")
asyncio.run(websocket_client())
Testing
Das Projekt enthält mehrere Test-Optionen:
1. Automatisierte Tests (Empfohlen)
# Stelle sicher, dass das virtuelle Environment aktiviert ist
source venv/bin/activate
# Führe alle Tests automatisch aus
python run_tests.py
Features der automatisierten Tests:
- ✅ Kein Server-Start nötig - Tests laufen automatisch
- ✅ Vollständige API-Abdeckung - Alle Endpunkte getestet
- ✅ WebSocket-Tests - Echtzeit-Funktionalität getestet
- ✅ Datenbank-Tests - CRUD-Operationen getestet
- ✅ Validierung-Tests - Pydantic-Modelle getestet
- ✅ Fehlerbehandlung - Edge Cases getestet
2. Manuelle API-Tests
# Stelle sicher, dass das virtuelle Environment aktiviert ist
source venv/bin/activate
# Test-Skript ausführen
python test_api.py
3. WebSocket-Tests
# Stelle sicher, dass das virtuelle Environment aktiviert ist
source venv/bin/activate
# WebSocket-Test ausführen
python test_websocket.py
4. Erweiterte Test-Optionen
# Detaillierte pytest-Ausgabe
python -m pytest test_automated.py -v
# Nur bestimmte Tests ausführen
python -m pytest test_automated.py -k "test_create"
# Tests mit Coverage
python -m pytest test_automated.py --cov=.
# Tests parallel ausführen
python -m pytest test_automated.py -n auto
Projektstruktur
backend/
├── main.py # FastAPI-Anwendung
├── models.py # Pydantic-Modelle
├── database.py # In-Memory-Datenbank
├── websocket_manager.py # WebSocket-Management
├── test_automated.py # Automatisierte Tests (pytest)
├── test_api.py # Manueller API-Test
├── test_websocket.py # WebSocket-Test
├── run_tests.py # Test-Runner
├── pytest.ini # pytest-Konfiguration
├── requirements.txt # Python-Abhängigkeiten
├── .gitignore # Git-Ignore-Datei
├── venv/ # Virtuelles Environment (wird ignoriert)
└── README.md # Diese Datei
Hinweise
- Virtuelles Environment: Das Projekt verwendet ein virtuelles Environment, um Abhängigkeiten zu isolieren
- In-Memory-Datenbank: Die API verwendet eine In-Memory-Datenbank, d.h. alle Daten gehen beim Neustart verloren
- Produktionsumgebung: Für Produktionsumgebungen sollte eine persistente Datenbank verwendet werden
- Validierung: Die API validiert automatisch alle Eingaben mit Pydantic
- Mengenangabe: Jedes Getränk kann eine Menge haben (mindestens 1, Standard: 1)
- Anmerkungen: Jedes Getränk kann optionale Anmerkungen haben (max. 500 Zeichen)
- Echtzeit-Updates: WebSocket-Clients erhalten automatisch Updates bei Änderungen
- Automatisierte Tests: Vollständige Test-Suite mit pytest für alle Funktionen
Troubleshooting
Virtuelles Environment aktivieren
Falls du eine Fehlermeldung bezüglich fehlender Module erhältst, stelle sicher, dass das virtuelle Environment aktiviert ist:
# Status prüfen
which python # Sollte auf venv/bin/python zeigen
# Falls nicht aktiviert:
source venv/bin/activate
Port bereits belegt
Falls Port 8000 bereits belegt ist, kannst du einen anderen Port verwenden:
uvicorn main:app --reload --port 8001
WebSocket-Verbindungsprobleme
Falls WebSocket-Verbindungen nicht funktionieren:
- Stelle sicher, dass der Server läuft
- Prüfe Firewall-Einstellungen
- Verwende
ws://
für lokale Verbindungen,wss://
für HTTPS
Test-Probleme
Falls Tests fehlschlagen:
- Stelle sicher, dass alle Abhängigkeiten installiert sind:
pip install -r requirements.txt
- Aktiviere das virtuelle Environment:
source venv/bin/activate
- Führe Tests mit detaillierter Ausgabe aus:
python -m pytest test_automated.py -v