Files
Lottery_Project/tests/util/test_util.py
T

148 lines
6.8 KiB
Python

"""Tests for the `util` module."""
from datetime import datetime
from httpx import ConnectError
import pytest
import util.convert as uc
import util.drawing as ud
import util.environment as ue
import util.scrape as sc
import util.odds as uo
from data.database import PowerballDraw, MegaMillionsDraw
def test_check_table_name() -> None:
assert isinstance(ud.check_table_name('PowerballDraw'), dict)
assert isinstance(ud.check_table_name('MegaMillionsDraw'), dict)
assert ud.check_table_name('SomeNonExistentTableName') is None
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 len(env_vars) == 24