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
74 lines
2.4 KiB
Python
74 lines
2.4 KiB
Python
"""Tests for the date-window filter in main.py."""
|
|
|
|
from datetime import date, timedelta
|
|
from unittest.mock import patch
|
|
|
|
from src.main import filter_by_window
|
|
from src.models import NormalizedEvent
|
|
|
|
|
|
def _make_event(event_date: date) -> NormalizedEvent:
|
|
return NormalizedEvent(
|
|
name="Test", event_date=event_date,
|
|
venue="Venue", source="test",
|
|
)
|
|
|
|
|
|
class TestFilterByWindow:
|
|
@patch("src.main.date")
|
|
def test_keeps_events_in_window(self, mock_date):
|
|
mock_date.today.return_value = date(2026, 5, 1)
|
|
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
|
|
|
|
events = [
|
|
_make_event(date(2026, 5, 5)),
|
|
_make_event(date(2026, 5, 15)),
|
|
_make_event(date(2026, 5, 30)),
|
|
]
|
|
result = filter_by_window(events, lookahead_days=30)
|
|
assert len(result) == 3
|
|
|
|
@patch("src.main.date")
|
|
def test_removes_past_events(self, mock_date):
|
|
mock_date.today.return_value = date(2026, 5, 10)
|
|
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
|
|
|
|
events = [
|
|
_make_event(date(2026, 5, 1)),
|
|
_make_event(date(2026, 5, 15)),
|
|
]
|
|
result = filter_by_window(events, lookahead_days=30)
|
|
assert len(result) == 1
|
|
assert result[0].event_date == date(2026, 5, 15)
|
|
|
|
@patch("src.main.date")
|
|
def test_removes_events_beyond_window(self, mock_date):
|
|
mock_date.today.return_value = date(2026, 5, 1)
|
|
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
|
|
|
|
events = [
|
|
_make_event(date(2026, 5, 10)),
|
|
_make_event(date(2026, 8, 1)),
|
|
]
|
|
result = filter_by_window(events, lookahead_days=30)
|
|
assert len(result) == 1
|
|
assert result[0].event_date == date(2026, 5, 10)
|
|
|
|
@patch("src.main.date")
|
|
def test_includes_boundary_dates(self, mock_date):
|
|
mock_date.today.return_value = date(2026, 5, 1)
|
|
mock_date.side_effect = lambda *args, **kwargs: date(*args, **kwargs)
|
|
|
|
today = date(2026, 5, 1)
|
|
cutoff = date(2026, 5, 31)
|
|
events = [
|
|
_make_event(today),
|
|
_make_event(cutoff),
|
|
]
|
|
result = filter_by_window(events, lookahead_days=30)
|
|
assert len(result) == 2
|
|
|
|
def test_empty_input(self):
|
|
result = filter_by_window([], lookahead_days=30)
|
|
assert result == []
|