summaryrefslogtreecommitdiffstats
path: root/tools/pharos-dashboard/booking/tests/test_models.py
blob: 7a572c5f03dd625c11ef0bae75c639640dc10a01 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
from datetime import timedelta

from django.contrib.auth.models import User, Permission
from django.test import TestCase
from django.utils import timezone

from account.models import UserProfile
from booking.models import Booking
from dashboard.models import Resource
from jenkins.models import JenkinsSlave


class BookingModelTestCase(TestCase):
    def setUp(self):
        self.slave = JenkinsSlave.objects.create(name='test', url='test')
        self.owner = User.objects.create(username='owner')

        self.res1 = Resource.objects.create(name='res1', slave=self.slave, description='x',
                                            url='x',owner=self.owner)
        self.res2 = Resource.objects.create(name='res2', slave=self.slave, description='x',
                                            url='x',owner=self.owner)

        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)

    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, user=self.user1)
        end = start
        self.assertRaises(ValueError, Booking.objects.create, start=start, end=end,
                          resource=self.res1, user=self.user1)

    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, user=self.user1, resource=self.res1))

        self.assertRaises(ValueError, Booking.objects.create, start=start,
                          end=end, resource=self.res1, user=self.user1)
        self.assertRaises(ValueError, Booking.objects.create, start=start + timedelta(days=1),
                          end=end - timedelta(days=1), resource=self.res1, user=self.user1)

        self.assertRaises(ValueError, Booking.objects.create, start=start - timedelta(days=1),
                          end=end, resource=self.res1, user=self.user1)
        self.assertRaises(ValueError, Booking.objects.create, start=start - timedelta(days=1),
                          end=end - timedelta(days=1), resource=self.res1, user=self.user1)

        self.assertRaises(ValueError, Booking.objects.create, start=start,
                          end=end + timedelta(days=1), resource=self.res1, user=self.user1)
        self.assertRaises(ValueError, Booking.objects.create, start=start + timedelta(days=1),
                          end=end + timedelta(days=1), resource=self.res1, user=self.user1)

        self.assertTrue(Booking.objects.create(start=start - timedelta(days=1), end=start,
                                               user=self.user1, resource=self.res1))
        self.assertTrue(Booking.objects.create(start=end, end=end + timedelta(days=1),
                                               user=self.user1, resource=self.res1))

        self.assertTrue(
            Booking.objects.create(start=start - timedelta(days=2), end=start - timedelta(days=1),
                                   user=self.user1, resource=self.res1))
        self.assertTrue(
            Booking.objects.create(start=end + timedelta(days=1), end=end + timedelta(days=2),
                                   user=self.user1, resource=self.res1))
        self.assertTrue(
            Booking.objects.create(start=start, end=end,
                                   user=self.user1, resource=self.res2))

    def test_authorization(self):
        user = User.objects.create(username='user')
        user.userprofile = UserProfile.objects.create(user=user)
        self.assertRaises(PermissionError, Booking.objects.create, start=timezone.now(),
                          end=timezone.now() + timedelta(days=1), resource=self.res1, user=user)
        self.res1.owner = user
        self.assertTrue(
            Booking.objects.create(start=timezone.now(), end=timezone.now() + timedelta(days=1),
                                   resource=self.res1, user=user))
        self.res1.owner = self.owner
        user.user_permissions.add(self.add_booking_perm)
        user = User.objects.get(pk=user.id)
        self.assertTrue(
            Booking.objects.create(start=timezone.now(), end=timezone.now() + timedelta(days=1),
                                   resource=self.res2, user=user))