118 lines
3.8 KiB
Python
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
|