"""Tests for the `util` module.""" from datetime import datetime import pytest from httpx import ConnectError import util.convert as uc import util.drawing as ud import util.environment as ue import util.odds as uo import util.scrape as sc from data.database import MegaMillionsDraw, PowerballDraw def test_convert_string_to_integer() -> None: """Test string value conversion to integer.""" assert uc.convert_string_to_integer("0") == 0 assert uc.convert_string_to_integer("3.14") == 3 with pytest.raises(uc.InvalidStringException): uc.convert_string_to_integer("a") def test_get_next_draw_date_none() -> None: """Test when a game is not provided.""" assert not ud.get_next_draw_date(game=None) def test_get_previous_draw_date_none() -> None: """Test when a game is not provided.""" assert not ud.get_previous_draw_date(game=None) def test_get_next_draw_date_minimum() -> None: """Test the next draw date returned for each game and when an invalid name is presented (None)""" assert ud.get_next_draw_date(game="mega-millions") assert ud.get_next_draw_date(game="powerball") assert not ud.get_next_draw_date(game="something") with pytest.raises(TypeError): ud.get_next_draw_date() def test_get_previous_draw_date_minimum() -> None: """Test the next draw date returned for each game and when an invalid name is presented (None)""" assert ud.get_previous_draw_date(game="mega-millions") assert ud.get_previous_draw_date(game="powerball") assert not ud.get_previous_draw_date(game="something") with pytest.raises(TypeError): ud.get_previous_draw_date() def test_get_next_draw_date_specified_from_date() -> None: """Test drawing dates returned for each possible day of the week.""" assert ud.get_next_draw_date( game="mega-millions", from_date='02/15/2026', ) == '02/17/2026' assert ud.get_next_draw_date( game="mega-millions", from_date='02/16/2026', ) == '02/17/2026' assert ud.get_next_draw_date( game="mega-millions", from_date='02/17/2026', ) == '02/17/2026' assert ud.get_next_draw_date( game="mega-millions", from_date='02/18/2026', ) == '02/20/2026' assert ud.get_next_draw_date( game="mega-millions", from_date='02/19/2026', ) == '02/20/2026' assert ud.get_next_draw_date( game='powerball', from_date='02/15/2026', ) == '02/16/2026' assert ud.get_next_draw_date( game='powerball', from_date='02/16/2026', ) == '02/16/2026' assert ud.get_next_draw_date( game='powerball', from_date='02/17/2026', ) == '02/18/2026' assert ud.get_next_draw_date( game='powerball', from_date='02/18/2026', ) == '02/18/2026' assert ud.get_next_draw_date( game='powerball', from_date='02/19/2026', ) == '02/21/2026' assert ud.get_next_draw_date( game='powerball', from_date='02/20/2026', ) == '02/21/2026' def test_get_previous_draw_date_specified_from_date() -> None: """Test drawing dates returned for each possible day of the week.""" assert ud.get_previous_draw_date( game="mega-millions", from_date='02/15/2026', ) == '02/13/2026' assert ud.get_previous_draw_date( game="mega-millions", from_date='02/16/2026', ) == '02/13/2026' assert ud.get_previous_draw_date( game="mega-millions", from_date='02/17/2026', ) == '02/13/2026' assert ud.get_previous_draw_date( game="mega-millions", from_date='02/18/2026', ) == '02/17/2026' assert ud.get_previous_draw_date( game="mega-millions", from_date='02/19/2026', ) == '02/17/2026' assert ud.get_previous_draw_date( game='powerball', from_date='02/15/2026', ) == '02/14/2026' assert ud.get_previous_draw_date( game='powerball', from_date='02/16/2026', ) == '02/14/2026' assert ud.get_previous_draw_date( game='powerball', from_date='02/17/2026', ) == '02/16/2026' assert ud.get_previous_draw_date( game='powerball', from_date='02/18/2026', ) == '02/16/2026' assert ud.get_previous_draw_date( game='powerball', from_date='02/19/2026', ) == '02/18/2026' assert ud.get_previous_draw_date( game='powerball', from_date='02/20/2026', ) == '02/18/2026' @pytest.mark.parametrize("game", ['powerball', 'mega-millions']) def test_scrape_game_history(game) -> None: """Test scraping the powerball result page for 1996, 2020, and current year.""" try: scrape_data = sc.scrape_game_history(game, year=1996) assert len(scrape_data) in [17, 104] scrape_data = sc.scrape_game_history(game, year=2020) assert len(scrape_data) in [104, 105] scrape_data = sc.scrape_game_history(game) assert len(scrape_data) in range(0, 105) except ConnectError as ce: pytest.fail(f"Target scrape site is unavailable: {ce}") def test_calculate_odds() -> None: """the odds calculation for a number of draws within a specific pool size""" assert uo.calculate_odds(pool_size=49, draw_count=5) == 1906884 assert uo.calculate_odds(pool_size=18, draw_count=1) == 18 with pytest.raises(TypeError): uo.calculate_odds() with pytest.raises(ValueError): uo.calculate_odds(pool_size=1, draw_count=2) def test_get_odds_of_winning() -> None: assert uo.get_odds_of_winning( main_ball_draw_pool=49, main_ball_draw_count=5, game_ball_draw_pool=18, game_ball_draw_count=1, ) == 'The odds of winning are 1 in 34,323,912' with pytest.raises(TypeError): uo.get_odds_of_winning() with pytest.raises(ValueError): uo.get_odds_of_winning( main_ball_draw_pool=49, main_ball_draw_count=50, game_ball_draw_pool=18, game_ball_draw_count=1, ) assert uo.get_odds_of_winning( main_ball_draw_pool=69, main_ball_draw_count=5, game_ball_draw_pool=26, game_ball_draw_count=1, ) == 'The odds of winning are 1 in 292,201,338' def test_get_powerball_object() -> None: data_value = ud.get_powerball_object( draw_date='2026-01-03', draw_result={ 'main_balls': [18, 21, 40, 53, 60], 'powerball': 23, 'multiplier': 3, }, ) test_record = PowerballDraw( draw_date=datetime(2026, 1, 3).date(), main_ball1=18, main_ball2=21, main_ball3=40, main_ball4=53, main_ball5=60, powerball=23, power_play=3, ) assert data_value == test_record def test_get_mega_millions_object() -> None: data_value = ud.get_mega_millions_object( draw_date='2010-02-02', draw_result={ 'main_balls': [6, 7, 26, 27, 49], 'mega-ball': 9, 'multiplier': 4, }, ) test_record = MegaMillionsDraw( draw_date=datetime(2010, 2, 2).date(), main_ball1=6, main_ball2=7, main_ball3=26, main_ball4=27, main_ball5=49, mega_ball=9, megaplier=4, ) assert data_value == test_record def test_load_environment_variables() -> None: """test loading environment variables for script use""" env_vars = ue.load_environment_variables() assert type(env_vars) == dict assert isinstance(len(env_vars), int)