175 lines
7.0 KiB
Python
175 lines
7.0 KiB
Python
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 |