from datetime import timedelta import pytest from django.core.exceptions import ValidationError from django.utils import timezone from events.models import ( EventOccurrence, EventOrganizer, EventOrganizerLink, EventPage, ) from tests.conftest import EventPageFactory def test_eventpage_clean_unsets_specific_pricing_when_free(): page = EventPage( title="Free event", slug="free-event", free=True, price_regular="100", price_student="50", price_member="25", ) page.clean() assert page.price_regular == "" assert page.price_student == "" assert page.price_member == "" def test_eventoccurrence_clean_rejects_both_venue_and_venue_custom(event_index, venue): event = EventPageFactory(parent=event_index) occurrence = EventOccurrence( event=event, start=timezone.now(), venue=venue, venue_custom="Frederikkeplassen", ) with pytest.raises(ValidationError) as exc: occurrence.clean() assert "venue_custom" in exc.value.message_dict def test_eventoccurrence_clean_requires_venue_or_venue_custom(event_index): event = EventPageFactory(parent=event_index) occurrence = EventOccurrence(event=event, start=timezone.now()) with pytest.raises(ValidationError) as exc: occurrence.clean() assert "venue" in exc.value.message_dict def test_eventpage_manager_future_filters_past_and_annotates(event_index): now = timezone.now() past = EventPageFactory(parent=event_index, title="Past") EventOccurrence.objects.create( event=past, start=now - timedelta(days=7), venue_custom="Old" ) future = EventPageFactory(parent=event_index, title="Future") EventOccurrence.objects.create( event=future, start=now + timedelta(days=7), venue_custom="New" ) results = list(EventPage.objects.live().future().order_by("next_occurrence")) assert [p.pk for p in results] == [future.pk] assert results[0].next_occurrence is not None def test_eventpage_clean_dedupes_organizers_by_name(event_index): org_a = EventOrganizer.objects.create(name="DNS", slug="dns-a") org_b = EventOrganizer.objects.create(name="DNS", slug="dns-b") event = EventPageFactory(parent=event_index) EventOrganizerLink.objects.create(event=event, organizer=org_a) EventOrganizerLink.objects.create(event=event, organizer=org_b) event = EventPage.objects.get(pk=event.pk) assert event.organizer_links.count() == 2 event.clean() assert event.organizer_links.count() == 1