def test_different_day_events_rejected(self): """ Test that events with start and end time in different days are rejected """ # Event longer than 24 hours with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 17, 0), end=default_datetime(2016, 5, 4, 19, 0), creator=self.user ) event.clean() # Event shorter than 24 hours with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 1, 23, 0), end=default_datetime(2016, 5, 2, 1, 0), creator=self.user ) event.clean()
def setUp(self): self.user = User.objects.create_user(username="******") self.room = Room.objects.create(name="Room 1", description="", creator=self.user) self.room2 = Room.objects.create(name="Room 2", description="", creator=self.user) self.activity = Activity.objects.create( title="Activity 1", description="", creator=self.user ) Event.objects.create( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 14, 0), end=default_datetime(2016, 5, 3, 16, 0), creator=self.user ) Event.objects.create( room=self.room, activity=self.activity, status=Event.REJECTED, start=default_datetime(2016, 5, 2, 14, 0), end=default_datetime(2016, 5, 2, 16, 0), creator=self.user )
def test_start_after_end_events_rejected(self): """ Test that events with start time greater than end time are rejected """ with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 19, 0), end=default_datetime(2016, 5, 3, 17, 0), creator=self.user ) event.clean()
def test_waiting_overlapping_events_rejected(self): """ Test that waiting overlapping events are rejected """ with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.WAITING, start=default_datetime(2016, 5, 3, 12, 00), end=default_datetime(2016, 5, 3, 16, 00), creator=self.user ) event.clean()
def test_approved_overlapping_events_rejected(self): """ Test that approved overlapping events are rejected """ # Overlapping by 1 minute at the end with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 12, 0), end=default_datetime(2016, 5, 3, 14, 1), creator=self.user ) event.clean() # Overlapping by 1 minute at the beginning with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 15, 59), end=default_datetime(2016, 5, 3, 17, 0), creator=self.user ) event.clean() # Completely overlapping, "contained" in another event with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 15, 00), end=default_datetime(2016, 5, 3, 15, 30), creator=self.user ) event.clean() # Completely overlapping, "containing" another event with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 12, 00), end=default_datetime(2016, 5, 3, 18, 00), creator=self.user ) event.clean()
def test_none_date_rejected(self): """ Test that none dates are rejected """ # Start date is none with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.REJECTED, start=None, end=default_datetime(2016, 5, 3, 12, 0), creator=self.user ) event.clean() # End date is none with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.REJECTED, start=default_datetime(2016, 5, 3, 16, 0), end=None, creator=self.user ) event.clean() # Both dates are none with self.assertRaises(ValidationError): event = Event( room=self.room, activity=self.activity, status=Event.REJECTED, start=None, end=None, creator=self.user ) event.clean()
def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # If a date is defined if "year" in kwargs and "month" in kwargs and "day" in kwargs: try: year = int(kwargs["year"]) month = int(kwargs["month"]) day = int(kwargs["day"]) except: raise Http404 # If the year or the month are not valid the function monthrange is not invoked # due to shot-circuit evaluation if not ((year in range(1, 9999)) and (month in range(1, 12 + 1)) and (day in range(1, monthrange(year, month)[1] + 1))): raise Http404 date = default_datetime(year, month, day) else: date = localnow().replace(hour=0, minute=0, second=0, microsecond=0) context["date"] = date context["events"] = Event.objects.filter( start__range=(date, date + timedelta(1)), status=Event.APPROVED ) return context
def test_valid_events_accepted(self): """ Test that valid events are not rejected """ # A rejected overlapping event is ok try: event = Event( room=self.room, activity=self.activity, status=Event.REJECTED, start=default_datetime(2016, 5, 3, 14, 0), end=default_datetime(2016, 5, 3, 16, 0), creator=self.user ) event.clean() except ValidationError: self.fail("ValidationError exception raised with rejected overlapping event") # Overlapping with an event in a different room and with the same activity try: event = Event( room=self.room2, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 14, 0), end=default_datetime(2016, 5, 3, 16, 0), creator=self.user ) event.clean() except ValidationError: self.fail("ValidationError exception raised with overlapping event in different room") # An approved event overlapping with a rejected event try: event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 2, 14, 0), end=default_datetime(2016, 5, 2, 16, 0), creator=self.user ) event.clean() except ValidationError: self.fail( "ValidationError exception raised with event overlapping with a rejected event" ) # Not overlapping, but immediately before another event try: event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 12, 0), end=default_datetime(2016, 5, 3, 14, 0), creator=self.user ) event.clean() except ValidationError: self.fail("ValidationError exception raised with not overlapping event") # Not overlapping, but immediately after another event try: event = Event( room=self.room, activity=self.activity, status=Event.APPROVED, start=default_datetime(2016, 5, 3, 16, 0), end=default_datetime(2016, 5, 3, 18, 0), creator=self.user ) event.clean() except ValidationError: self.fail("ValidationError exception raised with not overlapping event")