17
17
from django import forms
18
18
from django.contrib.auth.models import User
19
from django.core.exceptions import (
19
from django.core.exceptions import PermissionDenied
20
from django.core.files.uploadedfile import SimpleUploadedFile
23
21
from django.http import QueryDict
24
22
from maasserver.enum import (
67
64
from maasserver.testing import reload_object
68
65
from maasserver.testing.factory import factory
69
66
from maasserver.testing.testcase import TestCase
67
from metadataserver.models import CommissioningScript
70
68
from netaddr import IPNetwork
71
69
from provisioningserver.enum import POWER_TYPE_CHOICES
72
70
from testtools.matchers import (
270
268
self.assertEqual(value, form.initial['field1'])
273
class FormWithHostname(forms.Form):
274
hostname = HostnameFormField()
277
271
class NodeEditForms(TestCase):
279
273
def test_NodeForm_contains_limited_set_of_fields(self):
508
class TestHostnameFormField(TestCase):
510
def test_validate_hostname_validates_valid_hostnames(self):
511
self.assertIsNone(validate_hostname('host.example.com'))
512
self.assertIsNone(validate_hostname('host.my-example.com'))
513
self.assertIsNone(validate_hostname('my-example.com'))
514
# No ValidationError.
516
def test_validate_hostname_does_not_validate_invalid_hostnames(self):
517
self.assertRaises(ValidationError, validate_hostname, 'invalid-host')
519
def test_validate_hostname_does_not_validate_too_long_hostnames(self):
520
self.assertRaises(ValidationError, validate_hostname, 'toolong' * 100)
522
def test_hostname_field_validation_cleaned_data_if_hostname_valid(self):
523
form = FormWithHostname({'hostname': 'host.example.com'})
525
self.assertTrue(form.is_valid())
526
self.assertEqual('host.example.com', form.cleaned_data['hostname'])
528
def test_hostname_field_validation_error_if_invalid_hostname(self):
529
form = FormWithHostname({'hostname': 'invalid-host'})
531
self.assertFalse(form.is_valid())
532
self.assertItemsEqual(['hostname'], list(form.errors))
534
["Enter a valid hostname (e.g. host.example.com)."],
535
form.errors['hostname'])
538
502
class TestUniqueEmailForms(TestCase):
540
504
def assertFormFailsValidationBecauseEmailNotUnique(self, form):
983
947
self.assertTrue(form.is_valid())
985
949
self.assertEqual(data['name'], reload_object(nodegroup).name)
952
class TestCommissioningScriptForm(TestCase):
954
def test_creates_commissioning_script(self):
955
content = factory.getRandomString()
956
name = factory.make_name('filename')
957
uploaded_file = SimpleUploadedFile(content=content, name=name)
958
form = CommissioningScriptForm(files={'content': uploaded_file})
959
self.assertTrue(form.is_valid(), form._errors)
961
new_script = CommissioningScript.objects.get(name=name)
964
MatchesStructure.byEquality(name=name, content=content))
966
def test_raises_if_duplicated_name(self):
967
content = factory.getRandomString()
968
name = factory.make_name('filename')
969
factory.make_commissioning_script(name=name)
970
uploaded_file = SimpleUploadedFile(content=content, name=name)
971
form = CommissioningScriptForm(files={'content': uploaded_file})
973
(False, {'content': ["A script with that name already exists."]}),
974
(form.is_valid(), form._errors))
976
def test_rejects_whitespace_in_name(self):
977
name = factory.make_name('with space')
978
uploaded_file = SimpleUploadedFile(
979
content=factory.getRandomString(), name=name)
980
form = CommissioningScriptForm(files={'content': uploaded_file})
981
self.assertFalse(form.is_valid())
983
["Name contains disallowed characters (e.g. space or quotes)."],
984
form._errors['content'])
986
def test_rejects_quotes_in_name(self):
987
name = factory.make_name("l'horreur")
988
uploaded_file = SimpleUploadedFile(
989
content=factory.getRandomString(), name=name)
990
form = CommissioningScriptForm(files={'content': uploaded_file})
991
self.assertFalse(form.is_valid())
993
["Name contains disallowed characters (e.g. space or quotes)."],
994
form._errors['content'])