tests/test_plan_sessions_wp15.py hinzugefügt

This commit is contained in:
Lars 2025-08-12 13:07:36 +02:00
parent 1dbcf33540
commit 5c51d3bc4f

View File

@ -0,0 +1,121 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Integration/E2E-Tests für plan_sessions (v0.1.0)."""
import os
import requests
from datetime import datetime, timezone
BASE = os.getenv("BASE_URL", "http://127.0.0.1:8000").rstrip("/")
def test_plan_session_create_read():
# 1) Template minimal
tpl = {
"name": "Std 60 for sessions",
"discipline": "Karate",
"age_group": "Erwachsene",
"target_group": "Breitensport",
"total_minutes": 60,
"sections": [
{"name": "Warmup", "target_minutes": 10, "must_keywords": [], "forbid_keywords": [], "capability_targets": {}}
],
"goals": [],
"equipment_allowed": [],
"created_by": "tester",
"version": "1.0"
}
r1 = requests.post(f"{BASE}/plan_templates", json=tpl)
assert r1.status_code == 200, r1.text
# 2) Plan minimal
plan = {
"template_id": r1.json()["id"],
"title": "SessionPlan",
"discipline": "Karate",
"age_group": "Erwachsene",
"target_group": "Breitensport",
"total_minutes": 60,
"sections": [
{"name": "Warmup", "minutes": 10, "items": []}
],
"goals": [],
"capability_summary": {},
"created_by": "tester",
"created_at": datetime.now(timezone.utc).isoformat(),
"source": "test"
}
r2 = requests.post(f"{BASE}/plan", json=plan)
assert r2.status_code == 200, r2.text
plan_id = r2.json()["id"]
# 3) Session anlegen
session = {
"plan_id": plan_id,
"executed_at": datetime.now(timezone.utc).isoformat(),
"location": "Dojo A",
"coach": "Sensei K.",
"group_label": "Montag 18:00",
"feedback": {"rating": 4, "notes": "Gute Energie, Warmup etwas zu kurz."},
"used_equipment": [" Pratzen ", "Bälle", "pratzen"]
}
r3 = requests.post(f"{BASE}/plan_sessions", json=session)
assert r3.status_code == 200, r3.text
sess_id = r3.json()["id"]
# 4) Session lesen & Normalisierung prüfen
r4 = requests.get(f"{BASE}/plan_sessions/{sess_id}")
assert r4.status_code == 200
js = r4.json()
# used_equipment dedupliziert/trimmed/casefolded → len == 2
assert len(js["used_equipment"]) == 2
assert "Pratzen" in js["used_equipment"] or "pratzen" in [x.lower() for x in js["used_equipment"]]
def test_plan_session_invalid_rating():
# Minimaler Plan für Referenz
tpl = {
"name": "Std 45 for sessions",
"discipline": "Karate",
"age_group": "Erwachsene",
"target_group": "Breitensport",
"total_minutes": 45,
"sections": [
{"name": "Warmup", "target_minutes": 10, "must_keywords": [], "forbid_keywords": [], "capability_targets": {}}
],
"goals": [],
"equipment_allowed": [],
"created_by": "tester",
"version": "1.0"
}
r1 = requests.post(f"{BASE}/plan_templates", json=tpl)
assert r1.status_code == 200
plan = {
"template_id": r1.json()["id"],
"title": "Fehlerfall",
"discipline": "Karate",
"age_group": "Erwachsene",
"target_group": "Breitensport",
"total_minutes": 45,
"sections": [
{"name": "Warmup", "minutes": 10, "items": []}
],
"goals": [],
"capability_summary": {},
"created_by": "tester",
"created_at": datetime.now(timezone.utc).isoformat(),
"source": "test"
}
r2 = requests.post(f"{BASE}/plan", json=plan)
assert r2.status_code == 200
bad_session = {
"plan_id": r2.json()["id"],
"executed_at": datetime.now(timezone.utc).isoformat(),
"location": "Dojo B",
"coach": "Assist.",
"group_label": "Dienstag 19:00",
"feedback": {"rating": 7, "notes": "invalid"}, # ungültig (1..5)
"used_equipment": []
}
r_bad = requests.post(f"{BASE}/plan_sessions", json=bad_session)
assert r_bad.status_code == 422