"""Tests for Play model descriptive_text method. Covers score text generation for key plays display, specifically ensuring tied games show 'tied at X' instead of 'Team up X-X'. """ from models.play import Play from models.player import Player from models.team import Team def _make_team(abbrev: str) -> Team: """Create a minimal Team for descriptive_text tests.""" return Team.model_construct( id=1, abbrev=abbrev, sname=abbrev, lname=f"Team {abbrev}", season=13, ) def _make_player(name: str, team: Team) -> Player: """Create a minimal Player for descriptive_text tests.""" return Player.model_construct(id=1, name=name, wara=0.0, season=13, team_id=team.id) def _make_play(**overrides) -> Play: """Create a Play with sensible defaults for descriptive_text tests.""" tst_team = _make_team("TST") opp_team = _make_team("OPP") defaults = dict( id=1, game_id=1, play_num=1, on_base_code="000", inning_half="top", inning_num=7, batting_order=1, starting_outs=2, away_score=0, home_score=0, outs=1, batter_id=10, batter=_make_player("Test Batter", tst_team), batter_team=tst_team, pitcher_id=20, pitcher=_make_player("Test Pitcher", opp_team), pitcher_team=opp_team, ) defaults.update(overrides) return Play.model_construct(**defaults) class TestDescriptiveTextScoreText: """Tests for score text in Play.descriptive_text (issue #48).""" def test_tied_score_shows_tied_at(self): """When scores are equal after the play, should show 'tied at X' not 'Team up X-X'.""" away = _make_team("BSG") home = _make_team("DEN") # Top 7: away scores 1 RBI, making it 2-2 play = _make_play( inning_half="top", inning_num=7, away_score=1, home_score=2, rbi=1, hit=1, ) result = play.descriptive_text(away, home) assert "tied at 2" in result assert "up" not in result def test_home_team_leading(self): """When home team leads, should show 'HOME up X-Y'.""" away = _make_team("BSG") home = _make_team("DEN") play = _make_play( inning_half="top", away_score=0, home_score=3, outs=1, ) result = play.descriptive_text(away, home) assert "DEN up 3-0" in result def test_away_team_leading(self): """When away team leads, should show 'AWAY up X-Y'.""" away = _make_team("BSG") home = _make_team("DEN") play = _make_play( inning_half="bot", away_score=5, home_score=2, outs=1, ) result = play.descriptive_text(away, home) assert "BSG up 5-2" in result def test_tied_at_zero(self): """Tied at 0-0 should show 'tied at 0'.""" away = _make_team("BSG") home = _make_team("DEN") play = _make_play( inning_half="top", away_score=0, home_score=0, outs=1, ) result = play.descriptive_text(away, home) assert "tied at 0" in result def test_rbi_creates_tie_bottom_inning(self): """Bottom inning RBI that ties the game should show 'tied at X'.""" away = _make_team("BSG") home = _make_team("DEN") # Bot 5: home scores 2 RBI, tying at 4-4 play = _make_play( inning_half="bot", inning_num=5, away_score=4, home_score=2, rbi=2, hit=1, ) result = play.descriptive_text(away, home) assert "tied at 4" in result assert "up" not in result