add nick
[laas.git] / src / booking / tests / test_quick_booking.py
1 ##############################################################################
2 # Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, 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 import datetime
11 import json
12
13 from django.test import TestCase, Client
14
15 from booking.models import Booking
16 from dashboard.testing_utils import (
17     make_user,
18     make_user_profile,
19     make_lab,
20     make_image,
21     make_os,
22     make_opnfv_role,
23     make_public_net,
24     make_resource_template,
25     make_server
26 )
27
28
29 class QuickBookingValidFormTestCase(TestCase):
30     @classmethod
31     def setUpTestData(cls):
32         cls.user = make_user(False, username="newtestuser")
33         cls.user.set_password("testpassword")
34         cls.user.save()
35         make_user_profile(cls.user, True)
36
37         cls.lab = make_lab()
38
39         cls.res_template = make_resource_template(owner=cls.user, lab=cls.lab)
40         cls.res_profile = cls.res_template.getConfigs()[0].profile
41         os = make_os()
42         cls.image = make_image(cls.res_profile, lab=cls.lab, owner=cls.user, os=os)
43         cls.server = make_server(cls.res_profile, cls.lab)
44         cls.role = make_opnfv_role()
45         cls.pubnet = make_public_net(10, cls.lab)
46
47         cls.post_data = cls.build_post_data()
48         cls.client = Client()
49
50     @classmethod
51     def build_post_data(cls):
52         return {
53             'filter_field': json.dumps({
54                 "resource": {
55                     "resource_" + str(cls.res_profile.id): {
56                         "selected": True,
57                         "id": cls.res_template.id
58                     }
59                 },
60                 "lab": {
61                     "lab_" + str(cls.lab.lab_user.id): {
62                         "selected": True,
63                         "id": cls.lab.lab_user.id
64                     }
65                 }
66             }),
67             'purpose': 'my_purpose',
68             'project': 'my_project',
69             'length': '3',
70             'ignore_this': 1,
71             'users': '',
72             'hostname': 'my_host',
73             'image': str(cls.image.id),
74         }
75
76     def post(self, changed_fields={}):
77         payload = self.post_data.copy()
78         payload.update(changed_fields)
79         response = self.client.post('/booking/quick/', payload)
80         return response
81
82     def setUp(self):
83         self.client.login(username="newtestuser", password="testpassword")
84
85     def assertValidBooking(self, booking):
86         self.assertEqual(booking.owner, self.user)
87         self.assertEqual(booking.purpose, 'my_purpose')
88         self.assertEqual(booking.project, 'my_project')
89         delta = booking.end - booking.start
90         delta -= datetime.timedelta(days=3)
91         self.assertLess(delta, datetime.timedelta(minutes=1))
92
93         resource_bundle = booking.resource
94
95         host = resource_bundle.get_resources()[0]
96         self.assertEqual(host.profile, self.res_profile)
97         self.assertEqual(host.name, 'my_host')
98
99     def test_with_too_long_length(self):
100         response = self.post({'length': '22'})
101
102         self.assertEqual(response.status_code, 200)
103         self.assertIsNone(Booking.objects.first())
104
105     def test_with_negative_length(self):
106         response = self.post({'length': '-1'})
107
108         self.assertEqual(response.status_code, 200)
109         self.assertIsNone(Booking.objects.first())
110
111     def test_with_invalid_installer(self):
112         response = self.post({'installer': str(self.installer.id + 100)})
113
114         self.assertEqual(response.status_code, 200)
115         self.assertIsNone(Booking.objects.first())
116
117     def test_with_invalid_scenario(self):
118         response = self.post({'scenario': str(self.scenario.id + 100)})
119
120         self.assertEqual(response.status_code, 200)
121         self.assertIsNone(Booking.objects.first())
122
123     def test_with_invalid_host_id(self):
124         response = self.post({'filter_field': json.dumps({
125             "resource": {
126                 "resource_" + str(self.res_profile.id + 100): {
127                     "selected": True,
128                     "id": self.res_profile.id + 100
129                 }
130             },
131             "lab": {
132                 "lab_" + str(self.lab.lab_user.id): {
133                     "selected": True,
134                     "id": self.lab.lab_user.id
135                 }
136             }
137         })})
138
139         self.assertEqual(response.status_code, 200)
140         self.assertIsNone(Booking.objects.first())
141
142     def test_with_invalid_lab_id(self):
143         response = self.post({'filter_field': json.dumps({
144             "resource": {
145                 "resource_" + str(self.res_profile.id): {
146                     "selected": True,
147                     "id": self.res_profile.id
148                 }
149             },
150             "lab": {
151                 "lab_" + str(self.lab.lab_user.id + 100): {
152                     "selected": True,
153                     "id": self.lab.lab_user.id + 100
154                 }
155             }
156         })})
157
158         self.assertEqual(response.status_code, 200)
159         self.assertIsNone(Booking.objects.first())
160
161     def test_with_invalid_empty_filter_field(self):
162         response = self.post({'filter_field': ''})
163
164         self.assertEqual(response.status_code, 200)
165         self.assertIsNone(Booking.objects.first())
166
167     def test_with_garbage_users_field(self):  # expected behavior: treat as though field is empty if it has garbage data
168         response = self.post({'users': ['X�]QP�槰DP�+m���h�U�_�yJA:.rDi��QN|.��C��n�P��F!��D�����5ȅj�9�LV��']})  # output from /dev/urandom
169
170         self.assertEqual(response.status_code, 200)
171         booking = Booking.objects.first()
172         self.assertIsNone(booking)
173
174     def test_with_valid_form(self):
175         response = self.post()
176
177         self.assertEqual(response.status_code, 302)  # success should redirect
178         booking = Booking.objects.first()
179         self.assertIsNotNone(booking)
180         self.assertValidBooking(booking)