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()