"""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