from django.test import TestCase from django.utils import timezone from datetime import timedelta from django.core.exceptions import ValidationError from booking.models import Square, Event from .models import Product, EventProduct class EventProductDateComparisonTests(TestCase): def setUp(self): self.square = Square.objects.create( name="Test Square", street="Test Street", city="Test City", psc=12345, width=10, height=10, grid_rows=10, grid_cols=10, cellsize=10, ) today = timezone.now().date() self.event = Event.objects.create( name="Test Event", square=self.square, start=today, end=today + timedelta(days=2), price_per_m2=10, ) self.product = Product.objects.create(name="Prod 1") def test_event_product_inside_event_range_passes(self): now = timezone.now() ep = EventProduct( product=self.product, event=self.event, start_selling_date=now, end_selling_date=now + timedelta(hours=2), ) # Should not raise (specifically regression for datetime.date vs datetime comparison) ep.full_clean() # Will call clean() ep.save() self.assertIsNotNone(ep.id) def test_event_product_outside_event_range_fails(self): now = timezone.now() ep = EventProduct( product=self.product, event=self.event, start_selling_date=now - timedelta(days=1), # before event start end_selling_date=now, ) with self.assertRaises(ValidationError): ep.full_clean() def test_event_product_end_after_event_range_fails(self): now = timezone.now() ep = EventProduct( product=self.product, event=self.event, start_selling_date=now, end_selling_date=now + timedelta(days=5), # after event end ) with self.assertRaises(ValidationError): ep.full_clean()