import pytest from sqlmodel import Session from in_game.gameplay_queries import ( get_batting_team, get_games_by_channel, get_channel_game_or_none, get_active_games_by_team, get_player_id_from_dict, get_player_name_from_dict, get_game_lineups ) from in_game.gameplay_models import Game, Team, Play from tests.factory import session_fixture class TestUtilityFunctions: """Test simple utility functions in gameplay_queries.""" def test_get_player_id_from_dict_with_player_id(self): """Test extracting player_id from dict with player_id key.""" json_data = {'player_id': 123, 'name': 'Test Player'} result = get_player_id_from_dict(json_data) assert result == 123 def test_get_player_id_from_dict_with_id(self): """Test extracting player_id from dict with id key.""" json_data = {'id': 456, 'name': 'Test Player'} result = get_player_id_from_dict(json_data) assert result == 456 def test_get_player_id_from_dict_missing_keys(self): """Test error when both player_id and id keys are missing.""" json_data = {'name': 'Test Player', 'team': 'Test Team'} with pytest.raises(KeyError) as exc_info: get_player_id_from_dict(json_data) assert 'Player ID could not be extracted from json data' in str(exc_info.value) def test_get_player_name_from_dict_with_p_name(self): """Test extracting player name from dict with p_name key.""" json_data = {'p_name': 'Test Player', 'id': 123} result = get_player_name_from_dict(json_data) assert result == 'Test Player' def test_get_player_name_from_dict_with_name(self): """Test extracting player name from dict with name key.""" json_data = {'name': 'Another Player', 'id': 456} result = get_player_name_from_dict(json_data) assert result == 'Another Player' def test_get_player_name_from_dict_missing_keys(self): """Test error when both p_name and name keys are missing.""" json_data = {'id': 123, 'team': 'Test Team'} with pytest.raises(KeyError) as exc_info: get_player_name_from_dict(json_data) assert 'Player name could not be extracted from json data' in str(exc_info.value) class TestGameQueries: """Test game-related query functions.""" def test_get_batting_team_top_inning(self, session: Session): """Test getting batting team in top half of inning (away team bats).""" this_game = session.get(Game, 3) play_1 = this_game.initialize_play(session) # Top half = away team bats play_1.inning_half = 'top' batting_team = get_batting_team(session, play_1) assert batting_team == this_game.away_team assert batting_team.id == this_game.away_team_id def test_get_batting_team_bottom_inning(self, session: Session): """Test getting batting team in bottom half of inning (home team bats).""" this_game = session.get(Game, 3) play_1 = this_game.initialize_play(session) # Bottom half = home team bats play_1.inning_half = 'bottom' batting_team = get_batting_team(session, play_1) assert batting_team == this_game.home_team assert batting_team.id == this_game.home_team_id def test_get_games_by_channel(self, session: Session): """Test getting games by channel ID.""" # Game 3 uses channel 5678 and is active games = get_games_by_channel(session, channel_id=5678) assert len(games) == 1 assert games[0].id == 3 assert games[0].channel_id == 5678 assert games[0].active is True def test_get_games_by_channel_no_games(self, session: Session): """Test getting games by channel ID when no games exist.""" games = get_games_by_channel(session, channel_id=99999) assert len(games) == 0 assert games == [] def test_get_channel_game_or_none_single_game(self, session: Session): """Test getting single game from channel.""" # Channel 5678 has exactly one active game game = get_channel_game_or_none(session, channel_id=5678) assert game is not None assert game.id == 3 assert game.channel_id == 5678 def test_get_channel_game_or_none_no_games(self, session: Session): """Test getting game from channel with no games.""" game = get_channel_game_or_none(session, channel_id=99999) assert game is None def test_get_active_games_by_team(self, session: Session): """Test getting active games for a specific team.""" # Team 420 is in game 3 (active) and game 2 (inactive) team_420 = session.get(Team, 420) games = get_active_games_by_team(session, team_420) # Should only return active games assert len(games) == 1 assert games[0].id == 3 assert games[0].active is True # Verify team is in the game assert games[0].home_team_id == 420 or games[0].away_team_id == 420 def test_get_active_games_by_team_no_active_games(self, session: Session): """Test getting active games for team with no active games.""" # Team 31 is only in game 1 which is active, but let's test with team not in any active games team_3 = session.get(Team, 3) games = get_active_games_by_team(session, team_3) # Team 3 (BAL) is not in any active games in our factory assert len(games) == 0 def test_get_game_lineups_all_lineups(self, session: Session): """Test getting all lineups for a game.""" this_game = session.get(Game, 3) lineups = get_game_lineups(session, this_game) # Game 3 should have lineups from both teams assert len(lineups) > 0 # All lineups should belong to this game for lineup in lineups: assert lineup.game_id == this_game.id def test_get_game_lineups_specific_team(self, session: Session): """Test getting lineups for a specific team in a game.""" this_game = session.get(Game, 3) team_420 = session.get(Team, 420) lineups = get_game_lineups(session, this_game, specific_team=team_420) # All lineups should belong to the specified team for lineup in lineups: assert lineup.game_id == this_game.id assert lineup.team_id == team_420.id def test_get_game_lineups_active_only(self, session: Session): """Test getting only active lineups for a game.""" this_game = session.get(Game, 3) lineups = get_game_lineups(session, this_game, is_active=True) # All lineups should be active for lineup in lineups: assert lineup.game_id == this_game.id # Note: The factory doesn't set active=False for any lineups, # but this tests the query logic