Files
BSN-Chatsystem/test_empfehlung.py
Alicia (BSN) 0a8f5f62f3
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 11m56s
feat: Spiele-Empfehlungs-Engine mit Scoring-Algorithmus
2026-06-21 22:13:37 +00:00

118 lines
3.8 KiB
Python

"""Tests fuer die Spiele-Empfehlungs-Engine."""
import pytest
from game_database import SPIEL, spiele_laden, spiele_filtern
from empfehlung_service import score_berechnen, empfehlungen_erstellen
EXAKT_SPIEL: SPIEL = {
"name": "Testspiel",
"min_spieler": 2,
"max_spieler": 4,
"dauer_min": 45,
"komplexitaet": 2.5,
"kategorien": ["Strategie"],
}
class TestSpielFilter:
"""Tests fuer spiele_filtern."""
def test_filter_spieler_count(self) -> None:
"""Spieler count=4: alle Spiele mit passendem Bereich."""
alle = spiele_laden()
ergebnis = spiele_filtern(alle, spieler_count=4)
assert len(ergebnis) > 0
for spiel in ergebnis:
assert spiel["min_spieler"] <= 4 <= spiel["max_spieler"]
def test_filter_kategorien(self) -> None:
"""Kategorie-Filter: nur Spiele mit Strategie-Kategorie."""
alle = spiele_laden()
ergebnis = spiele_filtern(alle, kategorien=["Strategie"])
assert len(ergebnis) > 0
for spiel in ergebnis:
assert "Strategie" in spiel.get("kategorien", [])
def test_filter_max_dauer(self) -> None:
"""Maximaldauer-Filter: keine Spiele laenger als 60 Minuten."""
alle = spiele_laden()
ergebnis = spiele_filtern(alle, max_dauer=60)
for spiel in ergebnis:
assert spiel.get("dauer_min", 999) <= 60
def test_filter_kombiniert(self) -> None:
"""Kombinierter Filter: Spieler, Kategorie, Dauer."""
alle = spiele_laden()
ergebnis = spiele_filtern(
alle,
spieler_count=4,
kategorien=["Strategie"],
max_dauer=60,
)
assert len(ergebnis) > 0
for spiel in ergebnis:
assert spiel["min_spieler"] <= 4 <= spiel["max_spieler"]
assert "Strategie" in spiel.get("kategorien", [])
assert spiel.get("dauer_min", 999) <= 60
class TestScoreBerechnen:
"""Tests fuer score_berechnen."""
def test_score_exakte_uebereinstimmung(self) -> None:
"""Exakte Uebereinstimmung: Testspiel scoret perfekt (100 Punkte)."""
alle = spiele_laden()
wuensche = {
"komplexitaet": 2.5,
"dauer": 45,
"interaktion": 4.0,
}
exakt_score = score_berechnen(EXAKT_SPIEL, wuensche)
assert exakt_score == pytest.approx(100.0, abs=0.1)
for spiel in alle:
punktzahl = score_berechnen(spiel, wuensche)
assert punktzahl < exakt_score
def test_score_ferne_werte(self) -> None:
"""Fernte Werte: deutlich geringerer Score als passende Werte."""
ferne = {"komplexitaet": 5.0, "dauer": 5, "interaktion": 10}
exakte_prefs = {"komplexitaet": 2.5, "dauer": 45, "interaktion": 4}
ferne_score = score_berechnen(EXAKT_SPIEL, ferne)
exakte_score = score_berechnen(EXAKT_SPIEL, exakte_prefs)
assert ferne_score < 20
assert ferne_score < exakte_score
class TestEmpfehlungenErstellen:
"""Tests fuer empfehlungen_erstellen."""
def test_empfehlungen_sind_sortiert(self) -> None:
"""Empfehlungen: Score-Werte sind absteigend sortiert."""
alle = spiele_laden()
wuensche = {"komplexitaet": 2.5, "dauer": 45, "interaktion": 4}
ergebnis = empfehlungen_erstellen(alle, wuensche)
for i in range(len(ergebnis) - 1):
assert ergebnis[i][1] >= ergebnis[i + 1][1]
def test_empfehlungen_respektiert_limit(self) -> None:
"""Empfehlungen: Anzahl entspricht dem Limit."""
alle = spiele_laden()
wuensche = {"komplexitaet": 2.5, "dauer": 45, "interaktion": 4}
ergebnis_3 = empfehlungen_erstellen(alle, wuensche, limit=3)
ergebnis_5 = empfehlungen_erstellen(alle, wuensche, limit=5)
assert len(ergebnis_3) == 3
assert len(ergebnis_5) == 5