summaryrefslogtreecommitdiffstats
path: root/tools/pharos-dashboard/booking/tests/test_models.py
blob: 612b35c0f0d9ce74c6e6396d76583a770a866dae (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
98
99
100
101
102
103
104
105
106
107
##############################################################################
# Copyright (c) 2016 Max Breitenfeldt 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 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))