20
20
from django.contrib.auth.models import User
21
21
from django.core.urlresolvers import reverse
22
22
from lxml.html import fromstring
23
from maasserver.clusterrpc.testing.osystems import (
23
27
from maasserver.models import (
27
from maasserver.models.config import DEFAULT_OS
28
32
from maasserver.testing import (
30
34
get_prefixed_form_data,
32
36
from maasserver.testing.factory import factory
33
37
from maasserver.testing.orm import reload_object
34
from maasserver.testing.osystems import make_usable_osystem
38
from maasserver.testing.osystems import (
40
patch_usable_osystems,
35
42
from maasserver.testing.testcase import MAASServerTestCase
43
from maasserver.views import settings as settings_view
38
46
class SettingsTest(MAASServerTestCase):
42
50
# delete or edit each user. Note that the link to delete the the
43
51
# logged-in user is not display.
44
52
self.client_log_in(as_admin=True)
45
[factory.make_user() for i in range(3)]
53
[factory.make_User() for _ in range(3)]
46
54
users = UserProfile.objects.all_users()
47
55
response = self.client.get(reverse('settings'))
48
56
doc = fromstring(response.content)
110
118
def test_settings_commissioning_POST(self):
111
119
self.client_log_in(as_admin=True)
120
release = make_rpc_release(can_commission=True)
121
osystem = make_rpc_osystem('ubuntu', releases=[release])
122
patch_usable_osystems(self, [osystem])
112
124
new_check_compatibility = factory.pick_bool()
113
new_commissioning = factory.pick_commissioning_release(DEFAULT_OS)
125
new_commissioning = release['name']
114
126
response = self.client.post(
115
127
reverse('settings'),
116
128
get_prefixed_form_data(
132
144
Config.objects.get_config('commissioning_distro_series'),
147
def test_settings_hides_license_keys_if_no_OS_supporting_keys(self):
148
self.client_log_in(as_admin=True)
149
response = self.client.get(reverse('settings'))
150
doc = fromstring(response.content)
151
license_keys = doc.cssselect('#license_keys')
153
0, len(license_keys), "Didn't hide the license key section.")
155
def test_settings_shows_license_keys_if_OS_supporting_keys(self):
156
self.client_log_in(as_admin=True)
157
release = make_rpc_release(requires_license_key=True)
158
osystem = make_rpc_osystem(releases=[release])
161
'gen_all_known_operating_systems').return_value = [osystem]
162
response = self.client.get(reverse('settings'))
163
doc = fromstring(response.content)
164
license_keys = doc.cssselect('#license_keys')
166
1, len(license_keys), "Didn't show the license key section.")
135
168
def test_settings_third_party_drivers_POST(self):
136
169
self.client_log_in(as_admin=True)
137
170
new_enable_third_party_drivers = factory.pick_bool()
153
186
Config.objects.get_config('enable_third_party_drivers'),
189
def test_settings_disk_erasing_on_release_POST(self):
190
self.client_log_in(as_admin=True)
191
new_enable_disk_erasing_on_release = factory.pick_bool()
192
response = self.client.post(
194
get_prefixed_form_data(
195
prefix='disk_erasing_on_release',
197
'enable_disk_erasing_on_release': (
198
new_enable_disk_erasing_on_release),
201
self.assertEqual(httplib.FOUND, response.status_code)
204
new_enable_disk_erasing_on_release,
207
Config.objects.get_config('enable_disk_erasing_on_release'),
156
210
def test_settings_deploy_POST(self):
157
211
self.client_log_in(as_admin=True)
158
212
osystem = make_usable_osystem(self)
159
osystem_name = osystem.name
160
release_name = factory.pick_release(osystem)
213
osystem_name = osystem['name']
214
release_name = osystem['default_release']
161
215
response = self.client.post(
162
216
reverse('settings'),
163
217
get_prefixed_form_data(
222
276
Config.objects.get_config('kernel_opts'))
278
def test_settings_boot_source_is_shown(self):
279
self.client_log_in(as_admin=True)
280
response = self.client.get(reverse('settings'))
281
doc = fromstring(response.content)
282
boot_source = doc.cssselect('#boot_source')
284
1, len(boot_source), "Didn't show boot image settings section.")
286
def test_settings_boot_source_is_not_shown(self):
287
self.client_log_in(as_admin=True)
289
factory.make_BootSource()
290
response = self.client.get(reverse('settings'))
291
doc = fromstring(response.content)
292
boot_source = doc.cssselect('#boot_source')
294
0, len(boot_source), "Didn't hide boot image settings section.")
296
def test_settings_boot_source_POST_creates_new_source(self):
297
self.client_log_in(as_admin=True)
298
url = "http://test.example.com/archive"
299
keyring = "/usr/local/testing/path.gpg"
300
response = self.client.post(
302
get_prefixed_form_data(
303
prefix='boot_source',
305
'boot_source_url': url,
306
'boot_source_keyring': keyring,
309
self.assertEqual(httplib.FOUND, response.status_code, response.content)
311
boot_source = BootSource.objects.first()
312
self.assertIsNotNone(boot_source)
315
(boot_source.url, boot_source.keyring_filename))
317
def test_settings_boot_source_POST_updates_source(self):
318
self.client_log_in(as_admin=True)
319
boot_source = factory.make_BootSource()
320
url = "http://test.example.com/archive"
321
keyring = "/usr/local/testing/path.gpg"
322
response = self.client.post(
324
get_prefixed_form_data(
325
prefix='boot_source',
327
'boot_source_url': url,
328
'boot_source_keyring': keyring,
331
self.assertEqual(httplib.FOUND, response.status_code, response.content)
332
boot_source = reload_object(boot_source)
335
(boot_source.url, boot_source.keyring_filename))
225
338
class NonAdminSettingsTest(MAASServerTestCase):
290
403
def test_edit_user_POST_profile_updates_attributes(self):
291
404
self.client_log_in(as_admin=True)
292
user = factory.make_user()
405
user = factory.make_User()
293
406
params = make_user_attribute_params(user)
295
408
'last_name': factory.make_name('Newname'),
309
422
def test_edit_user_POST_updates_password(self):
310
423
self.client_log_in(as_admin=True)
311
user = factory.make_user()
424
user = factory.make_User()
312
425
new_password = factory.make_string()
313
426
params = make_password_params(new_password)
314
427
response = self.client.post(
320
433
def test_delete_user_GET(self):
321
434
# The user delete page displays a confirmation page with a form.
322
435
self.client_log_in(as_admin=True)
323
user = factory.make_user()
436
user = factory.make_User()
324
437
del_link = reverse('accounts-del', args=[user.username])
325
438
response = self.client.get(del_link)
326
439
doc = fromstring(response.content)
339
452
def test_delete_user_POST(self):
340
453
# A POST request to the user delete finally deletes the user.
341
454
self.client_log_in(as_admin=True)
342
user = factory.make_user()
455
user = factory.make_User()
343
456
user_id = user.id
344
457
del_link = reverse('accounts-del', args=[user.username])
345
458
response = self.client.post(del_link, {'post': 'yes'})
349
462
def test_view_user(self):
350
463
# The user page feature the basic information about the user.
351
464
self.client_log_in(as_admin=True)
352
user = factory.make_user()
465
user = factory.make_User()
353
466
del_link = reverse('accounts-view', args=[user.username])
354
467
response = self.client.get(del_link)
355
468
doc = fromstring(response.content)
360
473
def test_account_views_are_routable_for_full_range_of_usernames(self):
361
474
# Usernames can include characters in the regex [\w.@+-].
362
475
self.client_log_in(as_admin=True)
363
user = factory.make_user(username="abc-123@example.com")
476
user = factory.make_User(username="abc-123@example.com")
364
477
for view in "edit", "view", "del":
365
478
path = reverse("accounts-%s" % view, args=[user.username])
366
479
self.assertIsInstance(path, (bytes, unicode))