Spaces:
Sleeping
Sleeping
| 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() | |