Spaces:
Sleeping
Sleeping
| """Tests for Pydantic models.""" | |
| import pytest | |
| from src.config import DIFFICULTY_PRESETS | |
| from src.models.player import DifficultySettings, PlayerStats | |
| class TestPlayerStats: | |
| """Tests for PlayerStats model.""" | |
| def test_from_db_row(self, sample_player_data: list) -> None: | |
| """Test creating PlayerStats from database row tuple.""" | |
| row = sample_player_data[0] # LeBron James data | |
| player = PlayerStats.from_db_row(row) | |
| assert player.full_name == "LeBron James" | |
| assert player.pts == 39223 | |
| assert player.ast == 10141 | |
| assert player.is_active is True | |
| def test_validates_negative_stats(self) -> None: | |
| """Test that negative stats are rejected.""" | |
| with pytest.raises(ValueError): | |
| PlayerStats( | |
| full_name="Test Player", | |
| ast=-1, # Invalid | |
| blk=0, | |
| dreb=0, | |
| fg3a=0, | |
| fg3m=0, | |
| fg3_pct=0.0, | |
| fga=0, | |
| fgm=0, | |
| fg_pct=0.0, | |
| fta=0, | |
| ftm=0, | |
| ft_pct=0.0, | |
| gp=0, | |
| gs=0, | |
| min=0, | |
| oreb=0, | |
| pf=0, | |
| pts=0, | |
| reb=0, | |
| stl=0, | |
| tov=0, | |
| first_name="Test", | |
| last_name="Player", | |
| full_name_lower="test player", | |
| first_name_lower="test", | |
| last_name_lower="player", | |
| is_active=True, | |
| ) | |
| def test_validates_percentage_range(self) -> None: | |
| """Test that percentages must be 0-1.""" | |
| with pytest.raises(ValueError): | |
| PlayerStats( | |
| full_name="Test Player", | |
| ast=0, | |
| blk=0, | |
| dreb=0, | |
| fg3a=0, | |
| fg3m=0, | |
| fg3_pct=1.5, # Invalid - over 1.0 | |
| fga=0, | |
| fgm=0, | |
| fg_pct=0.0, | |
| fta=0, | |
| ftm=0, | |
| ft_pct=0.0, | |
| gp=0, | |
| gs=0, | |
| min=0, | |
| oreb=0, | |
| pf=0, | |
| pts=0, | |
| reb=0, | |
| stl=0, | |
| tov=0, | |
| first_name="Test", | |
| last_name="Player", | |
| full_name_lower="test player", | |
| first_name_lower="test", | |
| last_name_lower="player", | |
| is_active=True, | |
| ) | |
| class TestDifficultySettings: | |
| """Tests for DifficultySettings model.""" | |
| def test_from_preset_valid(self, preset_name: str) -> None: | |
| """Test creating DifficultySettings from valid presets.""" | |
| settings = DifficultySettings.from_preset(preset_name) | |
| assert settings.name == preset_name | |
| expected = DIFFICULTY_PRESETS[preset_name] | |
| assert settings.pts_threshold == expected[0] | |
| assert settings.reb_threshold == expected[1] | |
| assert settings.ast_threshold == expected[2] | |
| assert settings.stl_threshold == expected[3] | |
| def test_from_preset_invalid(self) -> None: | |
| """Test that invalid preset name raises ValueError.""" | |
| with pytest.raises(ValueError) as exc_info: | |
| DifficultySettings.from_preset("Invalid Preset") | |
| assert "Unknown difficulty preset" in str(exc_info.value) | |
| def test_as_tuple(self) -> None: | |
| """Test converting settings to tuple.""" | |
| settings = DifficultySettings.from_preset("Regular") | |
| result = settings.as_tuple() | |
| assert result == DIFFICULTY_PRESETS["Regular"] | |
| assert isinstance(result, tuple) | |
| assert len(result) == 4 | |
| def test_regular_preset_values(self) -> None: | |
| """Test Regular preset has expected values.""" | |
| settings = DifficultySettings.from_preset("Regular") | |
| assert settings.pts_threshold == 850 | |
| assert settings.reb_threshold == 400 | |
| assert settings.ast_threshold == 200 | |
| assert settings.stl_threshold == 60 | |
| def test_dream_team_preset_values(self) -> None: | |
| """Test Dream Team preset has highest values.""" | |
| settings = DifficultySettings.from_preset("Dream Team") | |
| assert settings.pts_threshold == 1450 | |
| assert settings.reb_threshold == 700 | |
| assert settings.ast_threshold == 500 | |
| assert settings.stl_threshold == 120 | |