89 lines
2.5 KiB
Python
89 lines
2.5 KiB
Python
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
|