2026_MLB_Model / tests /test_provider_theoddsapi.py
Syntrex's picture
Add odds API coverage probe diagnostics
e213a9c
raw
history blame
5.09 kB
from __future__ import annotations
import os
import sys
import unittest
from unittest.mock import patch
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
from data.provider_theoddsapi import TheOddsAPIProvider
class _FakeResponse:
def __init__(self, payload, status_code: int = 200, headers: dict | None = None) -> None:
self._payload = payload
self.status_code = status_code
self.headers = headers or {}
self.text = ""
def json(self):
return self._payload
def raise_for_status(self) -> None:
return None
class TestTheOddsAPIProvider(unittest.TestCase):
def test_upcoming_hr_props_passes_requested_bookmakers(self) -> None:
provider = TheOddsAPIProvider()
captured_params: list[dict] = []
def fake_get(url, params=None, timeout=None):
captured_params.append(dict(params or {}))
if url.endswith("/events"):
return _FakeResponse(
[
{
"id": "event-1",
"away_team": "Away",
"home_team": "Home",
"commence_time": "2026-03-25T00:10:00Z",
}
],
headers={"x-requests-remaining": "100"},
)
return _FakeResponse(
{
"bookmakers": [
{
"key": "draftkings",
"markets": [
{
"key": "batter_home_runs",
"outcomes": [
{"description": "Slugger Sam", "price": 400, "point": 0.5}
],
}
],
}
]
},
headers={"x-requests-remaining": "99"},
)
with patch("data.provider_theoddsapi.ODDS_API_KEY", "test-key"), \
patch("data.provider_theoddsapi.requests.get", side_effect=fake_get), \
patch("data.provider_theoddsapi.time.sleep", return_value=None):
df = provider.fetch_all_upcoming_hr_props(
sportsbooks=["draftkings", "fanduel"]
)
self.assertEqual(len(df), 1)
self.assertEqual(captured_params[1]["bookmakers"], "draftkings,fanduel")
def test_upcoming_coverage_probe_reports_market_by_book(self) -> None:
provider = TheOddsAPIProvider()
captured_params: list[dict] = []
def fake_get(url, params=None, timeout=None):
captured_params.append(dict(params or {}))
if url.endswith("/events"):
return _FakeResponse(
[
{
"id": "event-1",
"away_team": "Away",
"home_team": "Home",
"commence_time": "2026-03-25T00:10:00Z",
}
],
headers={"x-requests-remaining": "100"},
)
book_key = params.get("bookmakers")
market_key = params.get("markets")
bookmakers = []
if book_key == "draftkings" and market_key == "batter_hits":
bookmakers = [
{
"key": "draftkings",
"markets": [
{
"key": "batter_hits",
"outcomes": [
{"description": "Slugger Sam", "price": -110, "point": 1.5}
],
}
],
}
]
return _FakeResponse({"bookmakers": bookmakers}, headers={"x-requests-remaining": "99"})
with patch("data.provider_theoddsapi.ODDS_API_KEY", "test-key"), \
patch("data.provider_theoddsapi.requests.get", side_effect=fake_get):
df = provider.fetch_upcoming_market_coverage_probe(
sportsbooks=["draftkings", "fanduel"],
markets=["batter_home_runs", "batter_hits"],
max_events=1,
)
self.assertEqual(len(df), 4)
hits_row = df[
(df["sportsbook_key"] == "draftkings")
& (df["market_key"] == "batter_hits")
].iloc[0]
hr_row = df[
(df["sportsbook_key"] == "fanduel")
& (df["market_key"] == "batter_home_runs")
].iloc[0]
self.assertTrue(bool(hits_row["has_data"]))
self.assertEqual(int(hits_row["outcomes_returned"]), 1)
self.assertFalse(bool(hr_row["has_data"]))
self.assertEqual(
captured_params[1]["bookmakers"],
"draftkings",
)
if __name__ == "__main__":
unittest.main()