Merge lp:~jtv/maas/extract-formtests-config-user into lp:~maas-committers/maas/trunk

Proposed by Jeroen T. Vermeulen
Status: Merged
Approved by: Jeroen T. Vermeulen
Approved revision: no longer in the source branch.
Merged at revision: 2810
Proposed branch: lp:~jtv/maas/extract-formtests-config-user
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 458 lines (+213/-174)
3 files modified
src/maasserver/tests/test_forms.py (+0/-174)
src/maasserver/tests/test_forms_config.py (+78/-0)
src/maasserver/tests/test_forms_user.py (+135/-0)
To merge this branch: bzr merge lp:~jtv/maas/extract-formtests-config-user
Reviewer Review Type Date Requested Status
Jeroen T. Vermeulen (community) Approve
Review via email: mp+232159@code.launchpad.net

Commit message

Extract ConfigForm tests, and the form tests for managing users, into their own test modules.

Description of the change

Ongoing background task; for self-approval. This pushes test_forms.py down our list of largest files, from #2 to #3. Experience suggests that it's best for source files to stay below 1,000 lines.

Jeroen

To post a comment you must log in.
Revision history for this message
Jeroen T. Vermeulen (jtv) wrote :

Looks OK. Self-approving.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/maasserver/tests/test_forms.py'
--- src/maasserver/tests/test_forms.py 2014-08-25 14:08:13 +0000
+++ src/maasserver/tests/test_forms.py 2014-08-26 03:54:20 +0000
@@ -17,9 +17,7 @@
17import json17import json
18import random18import random
1919
20from django import forms
21from django.conf import settings20from django.conf import settings
22from django.contrib.auth.models import User
23from django.core.exceptions import ValidationError21from django.core.exceptions import ValidationError
24from django.core.files.uploadedfile import SimpleUploadedFile22from django.core.files.uploadedfile import SimpleUploadedFile
25from django.core.validators import validate_email23from django.core.validators import validate_email
@@ -38,10 +36,8 @@
38 BulkNodeActionForm,36 BulkNodeActionForm,
39 CommissioningForm,37 CommissioningForm,
40 CommissioningScriptForm,38 CommissioningScriptForm,
41 ConfigForm,
42 DeployForm,39 DeployForm,
43 DownloadProgressForm,40 DownloadProgressForm,
44 EditUserForm,
45 ERROR_MESSAGE_STATIC_IPS_OUTSIDE_RANGE,41 ERROR_MESSAGE_STATIC_IPS_OUTSIDE_RANGE,
46 ERROR_MESSAGE_STATIC_RANGE_IN_USE,42 ERROR_MESSAGE_STATIC_RANGE_IN_USE,
47 get_node_create_form,43 get_node_create_form,
@@ -53,7 +49,6 @@
53 MACAddressForm,49 MACAddressForm,
54 MAX_MESSAGES,50 MAX_MESSAGES,
55 merge_error_messages,51 merge_error_messages,
56 NewUserCreationForm,
57 NO_ARCHITECTURES_AVAILABLE,52 NO_ARCHITECTURES_AVAILABLE,
58 NodeForm,53 NodeForm,
59 NodeGroupDefineForm,54 NodeGroupDefineForm,
@@ -62,7 +57,6 @@
62 NodeGroupInterfaceForm,57 NodeGroupInterfaceForm,
63 NodeWithMACAddressesForm,58 NodeWithMACAddressesForm,
64 pick_default_architecture,59 pick_default_architecture,
65 ProfileForm,
66 remove_None_values,60 remove_None_values,
67 SetZoneBulkAction,61 SetZoneBulkAction,
68 UnconstrainedMultipleChoiceField,62 UnconstrainedMultipleChoiceField,
@@ -71,14 +65,12 @@
71 ValidatorMultipleChoiceField,65 ValidatorMultipleChoiceField,
72 )66 )
73from maasserver.models import (67from maasserver.models import (
74 Config,
75 MACAddress,68 MACAddress,
76 Network,69 Network,
77 Node,70 Node,
78 NodeGroup,71 NodeGroup,
79 NodeGroupInterface,72 NodeGroupInterface,
80 )73 )
81from maasserver.models.config import DEFAULT_CONFIG
82from maasserver.models.network import get_name_and_vlan_from_cluster_interface74from maasserver.models.network import get_name_and_vlan_from_cluster_interface
83from maasserver.models.staticipaddress import StaticIPAddress75from maasserver.models.staticipaddress import StaticIPAddress
84from maasserver.node_action import (76from maasserver.node_action import (
@@ -235,62 +227,6 @@
235 AdminNodeWithMACAddressesForm, get_node_create_form(admin))227 AdminNodeWithMACAddressesForm, get_node_create_form(admin))
236228
237229
238class TestOptionForm(ConfigForm):
239 field1 = forms.CharField(label="Field 1", max_length=10)
240 field2 = forms.BooleanField(label="Field 2", required=False)
241
242
243class TestValidOptionForm(ConfigForm):
244 maas_name = forms.CharField(label="Field 1", max_length=10)
245
246
247class ConfigFormTest(MAASServerTestCase):
248
249 def test_form_valid_saves_into_db(self):
250 value = factory.make_string(10)
251 form = TestValidOptionForm({'maas_name': value})
252 result = form.save()
253
254 self.assertTrue(result)
255 self.assertEqual(value, Config.objects.get_config('maas_name'))
256
257 def test_form_rejects_unknown_settings(self):
258 value = factory.make_string(10)
259 value2 = factory.make_string(10)
260 form = TestOptionForm({'field1': value, 'field2': value2})
261 valid = form.is_valid()
262
263 self.assertFalse(valid)
264 self.assertIn('field1', form._errors)
265 self.assertIn('field2', form._errors)
266
267 def test_form_invalid_does_not_save_into_db(self):
268 value_too_long = factory.make_string(20)
269 form = TestOptionForm({'field1': value_too_long, 'field2': False})
270 result = form.save()
271
272 self.assertFalse(result)
273 self.assertIn('field1', form._errors)
274 self.assertIsNone(Config.objects.get_config('field1'))
275 self.assertIsNone(Config.objects.get_config('field2'))
276
277 def test_form_loads_initial_values(self):
278 value = factory.make_string()
279 Config.objects.set_config('field1', value)
280 form = TestOptionForm()
281
282 self.assertItemsEqual(['field1'], form.initial)
283 self.assertEqual(value, form.initial['field1'])
284
285 def test_form_loads_initial_values_from_default_value(self):
286 value = factory.make_string()
287 DEFAULT_CONFIG['field1'] = value
288 form = TestOptionForm()
289
290 self.assertItemsEqual(['field1'], form.initial)
291 self.assertEqual(value, form.initial['field1'])
292
293
294class TestNodeForm(MAASServerTestCase):230class TestNodeForm(MAASServerTestCase):
295231
296 def test_contains_limited_set_of_fields(self):232 def test_contains_limited_set_of_fields(self):
@@ -603,116 +539,6 @@
603 self.assertEqual(old_nodegroup, node.nodegroup)539 self.assertEqual(old_nodegroup, node.nodegroup)
604540
605541
606class TestUniqueEmailForms(MAASServerTestCase):
607
608 def assertFormFailsValidationBecauseEmailNotUnique(self, form):
609 self.assertFalse(form.is_valid())
610 self.assertIn('email', form._errors)
611 self.assertEquals(1, len(form._errors['email']))
612 # Cope with 'Email' and 'E-mail' in error message.
613 self.assertThat(
614 form._errors['email'][0],
615 MatchesRegex(
616 r'User with this E-{0,1}mail address already exists.'))
617
618 def test_ProfileForm_fails_validation_if_email_taken(self):
619 another_email = '%s@example.com' % factory.make_string()
620 factory.make_user(email=another_email)
621 email = '%s@example.com' % factory.make_string()
622 user = factory.make_user(email=email)
623 form = ProfileForm(instance=user, data={'email': another_email})
624 self.assertFormFailsValidationBecauseEmailNotUnique(form)
625
626 def test_ProfileForm_validates_if_email_unchanged(self):
627 email = '%s@example.com' % factory.make_string()
628 user = factory.make_user(email=email)
629 form = ProfileForm(instance=user, data={'email': email})
630 self.assertTrue(form.is_valid())
631
632 def test_NewUserCreationForm_fails_validation_if_email_taken(self):
633 email = '%s@example.com' % factory.make_string()
634 username = factory.make_string()
635 password = factory.make_string()
636 factory.make_user(email=email)
637 form = NewUserCreationForm(
638 {
639 'email': email,
640 'username': username,
641 'password1': password,
642 'password2': password,
643 })
644 self.assertFormFailsValidationBecauseEmailNotUnique(form)
645
646 def test_EditUserForm_fails_validation_if_email_taken(self):
647 another_email = '%s@example.com' % factory.make_string()
648 factory.make_user(email=another_email)
649 email = '%s@example.com' % factory.make_string()
650 user = factory.make_user(email=email)
651 form = EditUserForm(instance=user, data={'email': another_email})
652 self.assertFormFailsValidationBecauseEmailNotUnique(form)
653
654 def test_EditUserForm_validates_if_email_unchanged(self):
655 email = '%s@example.com' % factory.make_string()
656 user = factory.make_user(email=email)
657 form = EditUserForm(
658 instance=user,
659 data={
660 'email': email,
661 'username': factory.make_string(),
662 })
663 self.assertTrue(form.is_valid())
664
665
666class TestNewUserCreationForm(MAASServerTestCase):
667
668 def test_saves_to_db_by_default(self):
669 password = factory.make_name('password')
670 params = {
671 'email': '%s@example.com' % factory.make_string(),
672 'username': factory.make_name('user'),
673 'password1': password,
674 'password2': password,
675 }
676 form = NewUserCreationForm(params)
677 form.save()
678 self.assertIsNotNone(User.objects.get(username=params['username']))
679
680 def test_email_is_required(self):
681 password = factory.make_name('password')
682 params = {
683 'email': '',
684 'username': factory.make_name('user'),
685 'password1': password,
686 'password2': password,
687 }
688 form = NewUserCreationForm(params)
689 self.assertFalse(form.is_valid())
690 self.assertEquals(
691 {'email': ['This field is required.']},
692 form._errors)
693
694 def test_does_not_save_to_db_if_commit_is_False(self):
695 password = factory.make_name('password')
696 params = {
697 'email': '%s@example.com' % factory.make_string(),
698 'username': factory.make_name('user'),
699 'password1': password,
700 'password2': password,
701 }
702 form = NewUserCreationForm(params)
703 form.save(commit=False)
704 self.assertItemsEqual(
705 [], User.objects.filter(username=params['username']))
706
707 def test_fields_order(self):
708 form = NewUserCreationForm()
709
710 self.assertEqual(
711 ['username', 'last_name', 'email', 'password1', 'password2',
712 'is_superuser'],
713 list(form.fields))
714
715
716class TestMergeErrorMessages(MAASServerTestCase):542class TestMergeErrorMessages(MAASServerTestCase):
717543
718 def test_merge_error_messages_returns_summary_message(self):544 def test_merge_error_messages_returns_summary_message(self):
719545
=== added file 'src/maasserver/tests/test_forms_config.py'
--- src/maasserver/tests/test_forms_config.py 1970-01-01 00:00:00 +0000
+++ src/maasserver/tests/test_forms_config.py 2014-08-26 03:54:20 +0000
@@ -0,0 +1,78 @@
1# Copyright 2014 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4"""Tests for `ConfigForm`."""
5
6from __future__ import (
7 absolute_import,
8 print_function,
9 unicode_literals,
10 )
11
12str = None
13
14__metaclass__ = type
15__all__ = []
16
17from django import forms
18from maasserver.forms import ConfigForm
19from maasserver.models import Config
20from maasserver.models.config import DEFAULT_CONFIG
21from maasserver.testing.factory import factory
22from maasserver.testing.testcase import MAASServerTestCase
23
24
25class TestOptionForm(ConfigForm):
26 field1 = forms.CharField(label="Field 1", max_length=10)
27 field2 = forms.BooleanField(label="Field 2", required=False)
28
29
30class TestValidOptionForm(ConfigForm):
31 maas_name = forms.CharField(label="Field 1", max_length=10)
32
33
34class ConfigFormTest(MAASServerTestCase):
35
36 def test_form_valid_saves_into_db(self):
37 value = factory.make_string(10)
38 form = TestValidOptionForm({'maas_name': value})
39 result = form.save()
40
41 self.assertTrue(result)
42 self.assertEqual(value, Config.objects.get_config('maas_name'))
43
44 def test_form_rejects_unknown_settings(self):
45 value = factory.make_string(10)
46 value2 = factory.make_string(10)
47 form = TestOptionForm({'field1': value, 'field2': value2})
48 valid = form.is_valid()
49
50 self.assertFalse(valid)
51 self.assertIn('field1', form._errors)
52 self.assertIn('field2', form._errors)
53
54 def test_form_invalid_does_not_save_into_db(self):
55 value_too_long = factory.make_string(20)
56 form = TestOptionForm({'field1': value_too_long, 'field2': False})
57 result = form.save()
58
59 self.assertFalse(result)
60 self.assertIn('field1', form._errors)
61 self.assertIsNone(Config.objects.get_config('field1'))
62 self.assertIsNone(Config.objects.get_config('field2'))
63
64 def test_form_loads_initial_values(self):
65 value = factory.make_string()
66 Config.objects.set_config('field1', value)
67 form = TestOptionForm()
68
69 self.assertItemsEqual(['field1'], form.initial)
70 self.assertEqual(value, form.initial['field1'])
71
72 def test_form_loads_initial_values_from_default_value(self):
73 value = factory.make_string()
74 DEFAULT_CONFIG['field1'] = value
75 form = TestOptionForm()
76
77 self.assertItemsEqual(['field1'], form.initial)
78 self.assertEqual(value, form.initial['field1'])
079
=== added file 'src/maasserver/tests/test_forms_user.py'
--- src/maasserver/tests/test_forms_user.py 1970-01-01 00:00:00 +0000
+++ src/maasserver/tests/test_forms_user.py 2014-08-26 03:54:20 +0000
@@ -0,0 +1,135 @@
1# Copyright 2014 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4"""Tests for user-creation forms."""
5
6from __future__ import (
7 absolute_import,
8 print_function,
9 unicode_literals,
10 )
11
12str = None
13
14__metaclass__ = type
15__all__ = []
16
17from django.contrib.auth.models import User
18from maasserver.forms import (
19 EditUserForm,
20 NewUserCreationForm,
21 ProfileForm,
22 )
23from maasserver.testing.factory import factory
24from maasserver.testing.testcase import MAASServerTestCase
25from testtools.matchers import MatchesRegex
26
27
28class TestUniqueEmailForms(MAASServerTestCase):
29
30 def assertFormFailsValidationBecauseEmailNotUnique(self, form):
31 self.assertFalse(form.is_valid())
32 self.assertIn('email', form._errors)
33 self.assertEquals(1, len(form._errors['email']))
34 # Cope with 'Email' and 'E-mail' in error message.
35 self.assertThat(
36 form._errors['email'][0],
37 MatchesRegex(
38 r'User with this E-{0,1}mail address already exists.'))
39
40 def test_ProfileForm_fails_validation_if_email_taken(self):
41 another_email = '%s@example.com' % factory.make_string()
42 factory.make_user(email=another_email)
43 email = '%s@example.com' % factory.make_string()
44 user = factory.make_user(email=email)
45 form = ProfileForm(instance=user, data={'email': another_email})
46 self.assertFormFailsValidationBecauseEmailNotUnique(form)
47
48 def test_ProfileForm_validates_if_email_unchanged(self):
49 email = '%s@example.com' % factory.make_string()
50 user = factory.make_user(email=email)
51 form = ProfileForm(instance=user, data={'email': email})
52 self.assertTrue(form.is_valid())
53
54 def test_NewUserCreationForm_fails_validation_if_email_taken(self):
55 email = '%s@example.com' % factory.make_string()
56 username = factory.make_string()
57 password = factory.make_string()
58 factory.make_user(email=email)
59 form = NewUserCreationForm(
60 {
61 'email': email,
62 'username': username,
63 'password1': password,
64 'password2': password,
65 })
66 self.assertFormFailsValidationBecauseEmailNotUnique(form)
67
68 def test_EditUserForm_fails_validation_if_email_taken(self):
69 another_email = '%s@example.com' % factory.make_string()
70 factory.make_user(email=another_email)
71 email = '%s@example.com' % factory.make_string()
72 user = factory.make_user(email=email)
73 form = EditUserForm(instance=user, data={'email': another_email})
74 self.assertFormFailsValidationBecauseEmailNotUnique(form)
75
76 def test_EditUserForm_validates_if_email_unchanged(self):
77 email = '%s@example.com' % factory.make_string()
78 user = factory.make_user(email=email)
79 form = EditUserForm(
80 instance=user,
81 data={
82 'email': email,
83 'username': factory.make_string(),
84 })
85 self.assertTrue(form.is_valid())
86
87
88class TestNewUserCreationForm(MAASServerTestCase):
89
90 def test_saves_to_db_by_default(self):
91 password = factory.make_name('password')
92 params = {
93 'email': '%s@example.com' % factory.make_string(),
94 'username': factory.make_name('user'),
95 'password1': password,
96 'password2': password,
97 }
98 form = NewUserCreationForm(params)
99 form.save()
100 self.assertIsNotNone(User.objects.get(username=params['username']))
101
102 def test_email_is_required(self):
103 password = factory.make_name('password')
104 params = {
105 'email': '',
106 'username': factory.make_name('user'),
107 'password1': password,
108 'password2': password,
109 }
110 form = NewUserCreationForm(params)
111 self.assertFalse(form.is_valid())
112 self.assertEquals(
113 {'email': ['This field is required.']},
114 form._errors)
115
116 def test_does_not_save_to_db_if_commit_is_False(self):
117 password = factory.make_name('password')
118 params = {
119 'email': '%s@example.com' % factory.make_string(),
120 'username': factory.make_name('user'),
121 'password1': password,
122 'password2': password,
123 }
124 form = NewUserCreationForm(params)
125 form.save(commit=False)
126 self.assertItemsEqual(
127 [], User.objects.filter(username=params['username']))
128
129 def test_fields_order(self):
130 form = NewUserCreationForm()
131
132 self.assertEqual(
133 ['username', 'last_name', 'email', 'password1', 'password2',
134 'is_superuser'],
135 list(form.fields))