Merge "Implement periodic tasks"
[pharos.git] / tools / pharos-dashboard / booking / tests / test_models.py
1 from datetime import timedelta
2
3 from django.contrib.auth.models import User, Permission
4 from django.test import TestCase
5 from django.utils import timezone
6
7 from booking.models import Booking
8 from dashboard.models import Resource
9 from jenkins.models import JenkinsSlave
10
11
12 class BookingModelTestCase(TestCase):
13     def setUp(self):
14         self.slave = JenkinsSlave.objects.create(name='test', url='test')
15
16         self.res1 = Resource.objects.create(name='res1', slave=self.slave, description='x', url='x')
17         self.res2 = Resource.objects.create(name='res2', slave=self.slave, description='x', url='x')
18
19         self.user1 = User.objects.create(username='user1')
20
21         self.add_booking_perm = Permission.objects.get(codename='add_booking')
22         self.user1.user_permissions.add(self.add_booking_perm)
23
24         self.user1 = User.objects.get(pk=self.user1.id)
25
26     def test_start__end(self):
27         """
28         if the start of a booking is greater or equal then the end, saving should raise a
29         ValueException
30         """
31         start = timezone.now()
32         end = start - timedelta(weeks=1)
33         self.assertRaises(ValueError, Booking.objects.create, start=start, end=end,
34                           resource=self.res1, user=self.user1)
35         end = start
36         self.assertRaises(ValueError, Booking.objects.create, start=start, end=end,
37                           resource=self.res1, user=self.user1)
38
39     def test_conflicts(self):
40         """
41         saving an overlapping booking on the same resource should raise a ValueException
42         saving for different resources should succeed
43         """
44         start = timezone.now()
45         end = start + timedelta(weeks=1)
46         self.assertTrue(
47             Booking.objects.create(start=start, end=end, user=self.user1, resource=self.res1))
48
49         self.assertRaises(ValueError, Booking.objects.create, start=start,
50                           end=end, resource=self.res1, user=self.user1)
51         self.assertRaises(ValueError, Booking.objects.create, start=start + timedelta(days=1),
52                           end=end - timedelta(days=1), resource=self.res1, user=self.user1)
53
54         self.assertRaises(ValueError, Booking.objects.create, start=start - timedelta(days=1),
55                           end=end, resource=self.res1, user=self.user1)
56         self.assertRaises(ValueError, Booking.objects.create, start=start - timedelta(days=1),
57                           end=end - timedelta(days=1), resource=self.res1, user=self.user1)
58
59         self.assertRaises(ValueError, Booking.objects.create, start=start,
60                           end=end + timedelta(days=1), resource=self.res1, user=self.user1)
61         self.assertRaises(ValueError, Booking.objects.create, start=start + timedelta(days=1),
62                           end=end + timedelta(days=1), resource=self.res1, user=self.user1)
63
64         self.assertTrue(Booking.objects.create(start=start - timedelta(days=1), end=start,
65                                                user=self.user1, resource=self.res1))
66         self.assertTrue(Booking.objects.create(start=end, end=end + timedelta(days=1),
67                                                user=self.user1, resource=self.res1))
68
69         self.assertTrue(
70             Booking.objects.create(start=start - timedelta(days=2), end=start - timedelta(days=1),
71                                    user=self.user1, resource=self.res1))
72         self.assertTrue(
73             Booking.objects.create(start=end + timedelta(days=1), end=end + timedelta(days=2),
74                                    user=self.user1, resource=self.res1))
75         self.assertTrue(
76             Booking.objects.create(start=start, end=end,
77                                    user=self.user1, resource=self.res2))
78
79     def test_authorization(self):
80         user = User.objects.create(username='user')
81         self.assertRaises(PermissionError, Booking.objects.create, start=timezone.now(),
82                           end=timezone.now() + timedelta(days=1), resource=self.res1, user=user)
83         self.res1.owners.add(user)
84         self.assertTrue(
85             Booking.objects.create(start=timezone.now(), end=timezone.now() + timedelta(days=1),
86                                    resource=self.res1, user=user))
87         user.user_permissions.add(self.add_booking_perm)
88         user = User.objects.get(pk=user.id)
89         self.assertTrue(
90             Booking.objects.create(start=timezone.now(), end=timezone.now() + timedelta(days=1),
91                                    resource=self.res2, user=user))