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
106 lines
3.9 KiB
Python
106 lines
3.9 KiB
Python
"""Tests for the Ticketmaster provider."""
|
|
|
|
from datetime import date
|
|
|
|
import pytest
|
|
|
|
from src.providers.ticketmaster import TicketmasterProvider, MAJOR_VENUES
|
|
from tests.conftest import TICKETMASTER_RESPONSE
|
|
|
|
|
|
class TestTicketmasterProvider:
|
|
def test_name(self):
|
|
provider = TicketmasterProvider(api_key="test-key")
|
|
assert provider.name == "ticketmaster"
|
|
|
|
def test_fetch_skips_when_no_api_key(self):
|
|
provider = TicketmasterProvider(api_key="")
|
|
assert provider.fetch() == []
|
|
|
|
def test_fetch_returns_only_major_venue_events(self, httpx_mock):
|
|
httpx_mock.add_response(json=TICKETMASTER_RESPONSE)
|
|
provider = TicketmasterProvider(api_key="test-key", lookahead_days=30)
|
|
events = provider.fetch()
|
|
|
|
venue_names = {e.venue.lower().strip() for e in events}
|
|
assert venue_names <= MAJOR_VENUES
|
|
assert len(events) == 2
|
|
|
|
def test_fetch_normalizes_fields(self, httpx_mock):
|
|
httpx_mock.add_response(json=TICKETMASTER_RESPONSE)
|
|
provider = TicketmasterProvider(api_key="test-key")
|
|
events = provider.fetch()
|
|
|
|
raptors = next(e for e in events if "Raptors" in e.name)
|
|
assert raptors.event_date == date(2026, 5, 10)
|
|
assert raptors.venue == "Scotiabank Arena"
|
|
assert raptors.source == "ticketmaster"
|
|
assert "ticketmaster.ca" in raptors.url
|
|
|
|
def test_fetch_handles_missing_venue(self, httpx_mock):
|
|
response = {
|
|
"_embedded": {
|
|
"events": [
|
|
{
|
|
"name": "Mystery Event",
|
|
"dates": {"start": {"localDate": "2026-05-10"}},
|
|
"url": "https://example.com",
|
|
"_embedded": {"venues": []},
|
|
}
|
|
]
|
|
}
|
|
}
|
|
httpx_mock.add_response(json=response)
|
|
provider = TicketmasterProvider(api_key="test-key")
|
|
events = provider.fetch()
|
|
assert events == []
|
|
|
|
def test_fetch_handles_missing_date(self, httpx_mock):
|
|
response = {
|
|
"_embedded": {
|
|
"events": [
|
|
{
|
|
"name": "Raptors Game",
|
|
"dates": {"start": {}},
|
|
"_embedded": {
|
|
"venues": [{"name": "Scotiabank Arena"}]
|
|
},
|
|
}
|
|
]
|
|
}
|
|
}
|
|
httpx_mock.add_response(json=response)
|
|
provider = TicketmasterProvider(api_key="test-key")
|
|
events = provider.fetch()
|
|
assert events == []
|
|
|
|
def test_fetch_handles_api_error(self, httpx_mock):
|
|
httpx_mock.add_response(status_code=500)
|
|
provider = TicketmasterProvider(api_key="test-key")
|
|
events = provider.fetch()
|
|
assert events == []
|
|
|
|
def test_fetch_handles_empty_response(self, httpx_mock):
|
|
httpx_mock.add_response(json={})
|
|
provider = TicketmasterProvider(api_key="test-key")
|
|
events = provider.fetch()
|
|
assert events == []
|
|
|
|
def test_is_major_venue_case_insensitive(self):
|
|
assert TicketmasterProvider._is_major_venue("SCOTIABANK ARENA")
|
|
assert TicketmasterProvider._is_major_venue("scotiabank arena")
|
|
assert TicketmasterProvider._is_major_venue(" Rogers Centre ")
|
|
assert not TicketmasterProvider._is_major_venue("Horseshoe Tavern")
|
|
|
|
def test_extract_date_valid(self):
|
|
item = {"dates": {"start": {"localDate": "2026-05-10"}}}
|
|
assert TicketmasterProvider._extract_date(item) == date(2026, 5, 10)
|
|
|
|
def test_extract_date_invalid_format(self):
|
|
item = {"dates": {"start": {"localDate": "not-a-date"}}}
|
|
assert TicketmasterProvider._extract_date(item) is None
|
|
|
|
def test_extract_date_missing(self):
|
|
assert TicketmasterProvider._extract_date({}) is None
|
|
assert TicketmasterProvider._extract_date({"dates": {}}) is None
|