1 ##############################################################################
2 # Copyright (c) 2018 Parker Berberian, Sawyer Bergeron, and others.
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 ##############################################################################
13 from django.test import TestCase, Client
15 from booking.models import Booking
16 from dashboard.testing_utils import (
24 make_resource_template,
29 class QuickBookingValidFormTestCase(TestCase):
31 def setUpTestData(cls):
32 cls.user = make_user(False, username="newtestuser")
33 cls.user.set_password("testpassword")
35 make_user_profile(cls.user, True)
39 cls.res_template = make_resource_template(owner=cls.user, lab=cls.lab)
40 cls.res_profile = cls.res_template.getConfigs()[0].profile
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)
47 cls.post_data = cls.build_post_data()
51 def build_post_data(cls):
53 'filter_field': json.dumps({
55 "resource_" + str(cls.res_profile.id): {
57 "id": cls.res_template.id
61 "lab_" + str(cls.lab.lab_user.id): {
63 "id": cls.lab.lab_user.id
67 'purpose': 'my_purpose',
68 'project': 'my_project',
72 'hostname': 'my_host',
73 'image': str(cls.image.id),
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)
83 self.client.login(username="newtestuser", password="testpassword")
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))
93 resource_bundle = booking.resource
95 host = resource_bundle.get_resources()[0]
96 self.assertEqual(host.profile, self.res_profile)
97 self.assertEqual(host.name, 'my_host')
99 def test_with_too_long_length(self):
100 response = self.post({'length': '22'})
102 self.assertEqual(response.status_code, 200)
103 self.assertIsNone(Booking.objects.first())
105 def test_with_negative_length(self):
106 response = self.post({'length': '-1'})
108 self.assertEqual(response.status_code, 200)
109 self.assertIsNone(Booking.objects.first())
111 def test_with_invalid_installer(self):
112 response = self.post({'installer': str(self.installer.id + 100)})
114 self.assertEqual(response.status_code, 200)
115 self.assertIsNone(Booking.objects.first())
117 def test_with_invalid_scenario(self):
118 response = self.post({'scenario': str(self.scenario.id + 100)})
120 self.assertEqual(response.status_code, 200)
121 self.assertIsNone(Booking.objects.first())
123 def test_with_invalid_host_id(self):
124 response = self.post({'filter_field': json.dumps({
126 "resource_" + str(self.res_profile.id + 100): {
128 "id": self.res_profile.id + 100
132 "lab_" + str(self.lab.lab_user.id): {
134 "id": self.lab.lab_user.id
139 self.assertEqual(response.status_code, 200)
140 self.assertIsNone(Booking.objects.first())
142 def test_with_invalid_lab_id(self):
143 response = self.post({'filter_field': json.dumps({
145 "resource_" + str(self.res_profile.id): {
147 "id": self.res_profile.id
151 "lab_" + str(self.lab.lab_user.id + 100): {
153 "id": self.lab.lab_user.id + 100
158 self.assertEqual(response.status_code, 200)
159 self.assertIsNone(Booking.objects.first())
161 def test_with_invalid_empty_filter_field(self):
162 response = self.post({'filter_field': ''})
164 self.assertEqual(response.status_code, 200)
165 self.assertIsNone(Booking.objects.first())
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
170 self.assertEqual(response.status_code, 200)
171 booking = Booking.objects.first()
172 self.assertIsNone(booking)
174 def test_with_valid_form(self):
175 response = self.post()
177 self.assertEqual(response.status_code, 302) # success should redirect
178 booking = Booking.objects.first()
179 self.assertIsNotNone(booking)
180 self.assertValidBooking(booking)