added tests

This commit is contained in:
Jan Felix Wiebe 2025-07-09 22:18:21 +02:00
parent 4e359cf3ef
commit cbe9369712
9 changed files with 960 additions and 150 deletions

View file

@ -11,6 +11,8 @@ Eine RESTful API für Tschunk-Bestellungen, entwickelt mit FastAPI.
- 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
@ -115,6 +117,7 @@ Beispiel-Request:
**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
```
@ -126,11 +129,51 @@ GET /orders
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:
```json
{
"type": "order_created",
"timestamp": "2024-01-15T10:30:00",
"order": {
"id": "uuid-here",
"order_date": "2024-01-15T10:30:00",
"drinks": [...]
}
}
```
#### Bestellung gelöscht:
```json
{
"type": "order_deleted",
"timestamp": "2024-01-15T10:35:00",
"order_id": "uuid-here"
}
```
#### Alle Bestellungen (bei Verbindung):
```json
{
"type": "all_orders",
"timestamp": "2024-01-15T10:30:00",
"orders": [...]
}
```
## Beispiel-Verwendung mit curl
### Bestellung erstellen:
@ -164,10 +207,75 @@ curl -X GET "http://localhost:8000/orders"
curl -X DELETE "http://localhost:8000/orders/{order_id}"
```
## WebSocket-Client Beispiel
### JavaScript (Browser):
```javascript
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:
```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 ein Test-Skript, das alle API-Endpunkte testet:
Das Projekt enthält mehrere Test-Optionen:
### 1. Automatisierte Tests (Empfohlen)
```bash
# 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
```bash
# Stelle sicher, dass das virtuelle Environment aktiviert ist
source venv/bin/activate
@ -176,18 +284,47 @@ source venv/bin/activate
python test_api.py
```
### 3. WebSocket-Tests
```bash
# Stelle sicher, dass das virtuelle Environment aktiviert ist
source venv/bin/activate
# WebSocket-Test ausführen
python test_websocket.py
```
### 4. Erweiterte Test-Optionen
```bash
# 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
├── test_api.py # Test-Skript
├── requirements.txt # Python-Abhängigkeiten
├── .gitignore # Git-Ignore-Datei
├── venv/ # Virtuelles Environment (wird ignoriert)
└── README.md # Diese Datei
├── 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
@ -198,6 +335,8 @@ backend/
- **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
@ -217,4 +356,16 @@ Falls Port 8000 bereits belegt ist, kannst du einen anderen Port verwenden:
```bash
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`