"""Tests for carnival functionality.""" from datetime import date from agenda.carnival import rio_carnival_events from agenda.event import Event class TestRioCarnivalEvents: """Test the rio_carnival_events function.""" def test_carnival_events_single_year(self) -> None: """Test getting carnival events for a single year.""" # 2024 Easter is March 31, so carnival should be around Feb 9-14 start_date = date(2024, 1, 1) end_date = date(2024, 12, 31) events = rio_carnival_events(start_date, end_date) assert len(events) == 1 event = events[0] assert event.name == "carnival" assert event.title == "Rio Carnival" assert event.url == "https://en.wikipedia.org/wiki/Rio_Carnival" assert event.date.year == 2024 assert event.end_date is not None assert event.end_date.year == 2024 # Should be about 51 days before Easter (around early-mid February) assert event.date.month == 2 assert event.end_date.month == 2 def test_carnival_events_multiple_years(self) -> None: """Test getting carnival events for multiple years.""" start_date = date(2023, 1, 1) end_date = date(2025, 12, 31) events = rio_carnival_events(start_date, end_date) # Should have carnival for 2023, 2024, and 2025 assert len(events) == 3 years = [event.date.year for event in events] assert sorted(years) == [2023, 2024, 2025] # All events should be carnival events for event in events: assert event.name == "carnival" assert event.title == "Rio Carnival" assert event.url == "https://en.wikipedia.org/wiki/Rio_Carnival" def test_carnival_events_no_overlap(self) -> None: """Test when date range doesn't overlap with carnival.""" # Choose a range that's unlikely to include carnival (summer) start_date = date(2024, 6, 1) end_date = date(2024, 8, 31) events = rio_carnival_events(start_date, end_date) assert events == [] def test_carnival_events_partial_overlap_start(self) -> None: """Test when carnival start overlaps with date range.""" # 2024 carnival should be around Feb 9-14 start_date = date(2024, 2, 10) # Might overlap with carnival start end_date = date(2024, 2, 15) events = rio_carnival_events(start_date, end_date) # Should include carnival if there's any overlap if events: assert len(events) == 1 assert events[0].name == "carnival" def test_carnival_events_partial_overlap_end(self) -> None: """Test when carnival end overlaps with date range.""" # 2024 carnival should be around Feb 9-14 start_date = date(2024, 2, 12) end_date = date(2024, 2, 20) # Might overlap with carnival end events = rio_carnival_events(start_date, end_date) # Should include carnival if there's any overlap if events: assert len(events) == 1 assert events[0].name == "carnival" def test_carnival_dates_relative_to_easter(self) -> None: """Test that carnival dates are correctly calculated relative to Easter.""" start_date = date(2024, 1, 1) end_date = date(2024, 12, 31) events = rio_carnival_events(start_date, end_date) assert len(events) == 1 event = events[0] # Carnival should be 5 days long duration = (event.end_date - event.date).days + 1 assert duration == 6 # 51 days before to 46 days before Easter (6 days total) # Both dates should be in February for 2024 assert event.date.month == 2 assert event.end_date.month == 2 # End date should be after start date assert event.end_date > event.date def test_carnival_events_empty_date_range(self) -> None: """Test with empty date range.""" start_date = date(2024, 6, 15) end_date = date(2024, 6, 10) # End before start events = rio_carnival_events(start_date, end_date) # Should return empty list for invalid range assert events == [] def test_carnival_events_same_start_end_date(self) -> None: """Test with same start and end date.""" # Pick a date that's definitely not carnival test_date = date(2024, 7, 15) events = rio_carnival_events(test_date, test_date) assert events == []