feat: Spiele-Empfehlungs-Engine mit Scoring-Algorithmus
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 11m56s
Quality Gate / 🛡️ Lint + Type Check + Tests (push) Failing after 11m56s
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
"""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
|
||||
Reference in New Issue
Block a user