Tests cover providers, dedup, Telegram, scoring, main runner, and Airbnb stubs. Ticketmaster and SeatGeek use configurable lat/lon/radius (Thornhill default). Pipeline filters noise listings, merges same-day sports duplicates, optional MIN_ALERT_SCORE, and Telegram severity summary. Made-with: Cursor
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
"""Tests for the SeatGeek provider."""
|
|
|
|
from datetime import date
|
|
|
|
import pytest
|
|
|
|
from src.providers.seatgeek import SeatGeekProvider, MIN_SCORE_THRESHOLD
|
|
from tests.conftest import SEATGEEK_RESPONSE
|
|
|
|
|
|
class TestSeatGeekProvider:
|
|
def test_name(self):
|
|
provider = SeatGeekProvider(client_id="test-id")
|
|
assert provider.name == "seatgeek"
|
|
|
|
def test_fetch_skips_when_no_client_id(self):
|
|
provider = SeatGeekProvider(client_id="")
|
|
assert provider.fetch() == []
|
|
|
|
def test_fetch_filters_by_score_threshold(self, httpx_mock):
|
|
httpx_mock.add_response(json=SEATGEEK_RESPONSE)
|
|
provider = SeatGeekProvider(client_id="test-id")
|
|
events = provider.fetch()
|
|
|
|
assert len(events) == 2
|
|
names = {e.name for e in events}
|
|
assert "Local Open Mic" not in names
|
|
|
|
def test_fetch_normalizes_fields(self, httpx_mock):
|
|
httpx_mock.add_response(json=SEATGEEK_RESPONSE)
|
|
provider = SeatGeekProvider(client_id="test-id")
|
|
events = provider.fetch()
|
|
|
|
drake = next(e for e in events if "Drake" in e.name)
|
|
assert drake.event_date == date(2026, 5, 15)
|
|
assert drake.venue == "Budweiser Stage"
|
|
assert drake.source == "seatgeek"
|
|
assert "seatgeek.com" in drake.url
|
|
|
|
def test_fetch_handles_api_error(self, httpx_mock):
|
|
httpx_mock.add_response(status_code=500)
|
|
provider = SeatGeekProvider(client_id="test-id")
|
|
assert provider.fetch() == []
|
|
|
|
def test_fetch_handles_empty_events(self, httpx_mock):
|
|
httpx_mock.add_response(json={"events": []})
|
|
provider = SeatGeekProvider(client_id="test-id")
|
|
assert provider.fetch() == []
|
|
|
|
def test_fetch_handles_null_score(self, httpx_mock):
|
|
response = {
|
|
"events": [
|
|
{
|
|
"title": "Event with null score",
|
|
"datetime_local": "2026-05-10T19:00:00",
|
|
"venue": {"name": "Some Venue"},
|
|
"url": "https://example.com",
|
|
"score": None,
|
|
},
|
|
]
|
|
}
|
|
httpx_mock.add_response(json=response)
|
|
provider = SeatGeekProvider(client_id="test-id")
|
|
events = provider.fetch()
|
|
assert events == []
|
|
|
|
def test_extract_date_iso_format(self):
|
|
item = {"datetime_local": "2026-05-10T19:30:00"}
|
|
assert SeatGeekProvider._extract_date(item) == date(2026, 5, 10)
|
|
|
|
def test_extract_date_utc_fallback(self):
|
|
item = {"datetime_utc": "2026-05-10T23:30:00"}
|
|
assert SeatGeekProvider._extract_date(item) == date(2026, 5, 10)
|
|
|
|
def test_extract_date_missing(self):
|
|
assert SeatGeekProvider._extract_date({}) is None
|
|
|
|
def test_extract_date_invalid(self):
|
|
item = {"datetime_local": "not-a-date"}
|
|
assert SeatGeekProvider._extract_date(item) is None
|