############################################################################## # Copyright (c) 2016 Max Breitenfeldt and others. # Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## from datetime import timedelta from django.contrib.auth.models import Permission, User from django.test import TestCase from django.utils import timezone # from booking.models import * from booking.models import Booking from resource_inventory.models import ResourceBundle, GenericResourceBundle, ConfigBundle class BookingModelTestCase(TestCase): count = 0 def setUp(self): self.owner = User.objects.create(username='owner') self.res1 = ResourceBundle.objects.create( template=GenericResourceBundle.objects.create( name="gbundle" + str(self.count) ) ) self.count += 1 self.res2 = ResourceBundle.objects.create( template=GenericResourceBundle.objects.create( name="gbundle2" + str(self.count) ) ) self.count += 1 self.user1 = User.objects.create(username='user1') self.add_booking_perm = Permission.objects.get(codename='add_booking') self.user1.user_permissions.add(self.add_booking_perm) self.user1 = User.objects.get(pk=self.user1.id) self.config_bundle = ConfigBundle.objects.create( owner=self.user1, name="test config" ) def test_start_end(self): """ if the start of a booking is greater or equal then the end, saving should raise a ValueException """ start = timezone.now() end = start - timedelta(weeks=1) self.assertRaises( ValueError, Booking.objects.create, start=start, end=end, resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) end = start self.assertRaises( ValueError, Booking.objects.create, start=start, end=end, resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) def test_conflicts(self): """ saving an overlapping booking on the same resource should raise a ValueException saving for different resources should succeed """ start = timezone.now() end = start + timedelta(weeks=1) self.assertTrue( Booking.objects.create( start=start, end=end, owner=self.user1, resource=self.res1, config_bundle=self.config_bundle ) ) self.assertRaises( ValueError, Booking.objects.create, start=start, end=end, resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) self.assertRaises( ValueError, Booking.objects.create, start=start + timedelta(days=1), end=end - timedelta(days=1), resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) self.assertRaises( ValueError, Booking.objects.create, start=start - timedelta(days=1), end=end, resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) self.assertRaises( ValueError, Booking.objects.create, start=start - timedelta(days=1), end=end - timedelta(days=1), resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) self.assertRaises( ValueError, Booking.objects.create, start=start, end=end + timedelta(days=1), resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) self.assertRaises( ValueError, Booking.objects.create, start=start + timedelta(days=1), end=end + timedelta(days=1), resource=self.res1, owner=self.user1, config_bundle=self.config_bundle ) self.assertTrue( Booking.objects.create( start=start - timedelta(days=1), end=start, owner=self.user1, resource=self.res1, config_bundle=self.config_bundle ) ) self.assertTrue( Booking.objects.create( start=end, end=end + timedelta(days=1), owner=self.user1, resource=self.res1, config_bundle=self.config_bundle ) ) self.assertTrue( Booking.objects.create( start=start - timedelta(days=2), end=start - timedelta(days=1), owner=self.user1, resource=self.res1, config_bundle=self.config_bundle ) ) self.assertTrue( Booking.objects.create( start=end + timedelta(days=1), end=end + timedelta(days=2), owner=self.user1, resource=self.res1, config_bundle=self.config_bundle ) ) self.assertTrue( Booking.objects.create( start=start, end=end, owner=self.user1, resource=self.res2, config_bundle=self.config_bundle ) ) def test_extensions(self): """ saving a booking with an extended end time is allows to happen twice, and each extension must be a maximum of one week long """ start = timezone.now() end = start + timedelta(weeks=1) self.assertTrue( Booking.objects.create( start=start, end=end, owner=self.user1, resource=self.res1, config_bundle=self.config_bundle ) ) booking = Booking.objects.all().first() # should be only thing in db self.assertEquals(booking.ext_count, 2) booking.end = booking.end + timedelta(days=3) try: booking.save() except Exception: self.fail("save() threw an exception") booking.end = booking.end + timedelta(weeks=2) self.assertRaises(ValueError, booking.save) booking.end = booking.end - timedelta(days=8) try: self.assertTrue(booking.save()) except Exception: self.fail("save() threw an exception")