Add license headers
[pharos.git] / tools / pharos-dashboard / booking / tests / test_models.py
1 ##############################################################################
2 # Copyright (c) 2016 Max Breitenfeldt and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10
11 from datetime import timedelta
12
13 from django.contrib.auth.models import User, Permission
14 from django.test import TestCase
15 from django.utils import timezone
16
17 from account.models import UserProfile
18 from booking.models import Booking
19 from dashboard.models import Resource
20 from jenkins.models import JenkinsSlave
21
22
23 class BookingModelTestCase(TestCase):
24     def setUp(self):
25         self.slave = JenkinsSlave.objects.create(name='test', url='test')
26         self.owner = User.objects.create(username='owner')
27
28         self.res1 = Resource.objects.create(name='res1', slave=self.slave, description='x',
29                                             url='x',owner=self.owner)
30         self.res2 = Resource.objects.create(name='res2', slave=self.slave, description='x',
31                                             url='x',owner=self.owner)
32
33         self.user1 = User.objects.create(username='user1')
34
35         self.add_booking_perm = Permission.objects.get(codename='add_booking')
36         self.user1.user_permissions.add(self.add_booking_perm)
37
38         self.user1 = User.objects.get(pk=self.user1.id)
39
40     def test_start__end(self):
41         """
42         if the start of a booking is greater or equal then the end, saving should raise a
43         ValueException
44         """
45         start = timezone.now()
46         end = start - timedelta(weeks=1)
47         self.assertRaises(ValueError, Booking.objects.create, start=start, end=end,
48                           resource=self.res1, user=self.user1)
49         end = start
50         self.assertRaises(ValueError, Booking.objects.create, start=start, end=end,
51                           resource=self.res1, user=self.user1)
52
53     def test_conflicts(self):
54         """
55         saving an overlapping booking on the same resource should raise a ValueException
56         saving for different resources should succeed
57         """
58         start = timezone.now()
59         end = start + timedelta(weeks=1)
60         self.assertTrue(
61             Booking.objects.create(start=start, end=end, user=self.user1, resource=self.res1))
62
63         self.assertRaises(ValueError, Booking.objects.create, start=start,
64                           end=end, resource=self.res1, user=self.user1)
65         self.assertRaises(ValueError, Booking.objects.create, start=start + timedelta(days=1),
66                           end=end - timedelta(days=1), resource=self.res1, user=self.user1)
67
68         self.assertRaises(ValueError, Booking.objects.create, start=start - timedelta(days=1),
69                           end=end, resource=self.res1, user=self.user1)
70         self.assertRaises(ValueError, Booking.objects.create, start=start - timedelta(days=1),
71                           end=end - timedelta(days=1), resource=self.res1, user=self.user1)
72
73         self.assertRaises(ValueError, Booking.objects.create, start=start,
74                           end=end + timedelta(days=1), resource=self.res1, user=self.user1)
75         self.assertRaises(ValueError, Booking.objects.create, start=start + timedelta(days=1),
76                           end=end + timedelta(days=1), resource=self.res1, user=self.user1)
77
78         self.assertTrue(Booking.objects.create(start=start - timedelta(days=1), end=start,
79                                                user=self.user1, resource=self.res1))
80         self.assertTrue(Booking.objects.create(start=end, end=end + timedelta(days=1),
81                                                user=self.user1, resource=self.res1))
82
83         self.assertTrue(
84             Booking.objects.create(start=start - timedelta(days=2), end=start - timedelta(days=1),
85                                    user=self.user1, resource=self.res1))
86         self.assertTrue(
87             Booking.objects.create(start=end + timedelta(days=1), end=end + timedelta(days=2),
88                                    user=self.user1, resource=self.res1))
89         self.assertTrue(
90             Booking.objects.create(start=start, end=end,
91                                    user=self.user1, resource=self.res2))
92
93     def test_authorization(self):
94         user = User.objects.create(username='user')
95         user.userprofile = UserProfile.objects.create(user=user)
96         self.assertRaises(PermissionError, Booking.objects.create, start=timezone.now(),
97                           end=timezone.now() + timedelta(days=1), resource=self.res1, user=user)
98         self.res1.owner = user
99         self.assertTrue(
100             Booking.objects.create(start=timezone.now(), end=timezone.now() + timedelta(days=1),
101                                    resource=self.res1, user=user))
102         self.res1.owner = self.owner
103         user.user_permissions.add(self.add_booking_perm)
104         user = User.objects.get(pk=user.id)
105         self.assertTrue(
106             Booking.objects.create(start=timezone.now(), end=timezone.now() + timedelta(days=1),
107                                    resource=self.res2, user=user))