paper-dynasty-discord/tests/in_game/test_gameplay_queries.py
Cal Corum 3debfd6e82 Catchup commit
Includes discord_ui refactor, testing overhaul, addition of
2025-07-22 09:22:19 -05:00

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