Merge lp:~jtv/maas/extract-formtests-config-user into lp:~maas-committers/maas/trunk
- extract-formtests-config-user
- Merge into 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 |
Related bugs: |
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.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/maasserver/tests/test_forms.py' | |||
2 | --- src/maasserver/tests/test_forms.py 2014-08-25 14:08:13 +0000 | |||
3 | +++ src/maasserver/tests/test_forms.py 2014-08-26 03:54:20 +0000 | |||
4 | @@ -17,9 +17,7 @@ | |||
5 | 17 | import json | 17 | import json |
6 | 18 | import random | 18 | import random |
7 | 19 | 19 | ||
8 | 20 | from django import forms | ||
9 | 21 | from django.conf import settings | 20 | from django.conf import settings |
10 | 22 | from django.contrib.auth.models import User | ||
11 | 23 | from django.core.exceptions import ValidationError | 21 | from django.core.exceptions import ValidationError |
12 | 24 | from django.core.files.uploadedfile import SimpleUploadedFile | 22 | from django.core.files.uploadedfile import SimpleUploadedFile |
13 | 25 | from django.core.validators import validate_email | 23 | from django.core.validators import validate_email |
14 | @@ -38,10 +36,8 @@ | |||
15 | 38 | BulkNodeActionForm, | 36 | BulkNodeActionForm, |
16 | 39 | CommissioningForm, | 37 | CommissioningForm, |
17 | 40 | CommissioningScriptForm, | 38 | CommissioningScriptForm, |
18 | 41 | ConfigForm, | ||
19 | 42 | DeployForm, | 39 | DeployForm, |
20 | 43 | DownloadProgressForm, | 40 | DownloadProgressForm, |
21 | 44 | EditUserForm, | ||
22 | 45 | ERROR_MESSAGE_STATIC_IPS_OUTSIDE_RANGE, | 41 | ERROR_MESSAGE_STATIC_IPS_OUTSIDE_RANGE, |
23 | 46 | ERROR_MESSAGE_STATIC_RANGE_IN_USE, | 42 | ERROR_MESSAGE_STATIC_RANGE_IN_USE, |
24 | 47 | get_node_create_form, | 43 | get_node_create_form, |
25 | @@ -53,7 +49,6 @@ | |||
26 | 53 | MACAddressForm, | 49 | MACAddressForm, |
27 | 54 | MAX_MESSAGES, | 50 | MAX_MESSAGES, |
28 | 55 | merge_error_messages, | 51 | merge_error_messages, |
29 | 56 | NewUserCreationForm, | ||
30 | 57 | NO_ARCHITECTURES_AVAILABLE, | 52 | NO_ARCHITECTURES_AVAILABLE, |
31 | 58 | NodeForm, | 53 | NodeForm, |
32 | 59 | NodeGroupDefineForm, | 54 | NodeGroupDefineForm, |
33 | @@ -62,7 +57,6 @@ | |||
34 | 62 | NodeGroupInterfaceForm, | 57 | NodeGroupInterfaceForm, |
35 | 63 | NodeWithMACAddressesForm, | 58 | NodeWithMACAddressesForm, |
36 | 64 | pick_default_architecture, | 59 | pick_default_architecture, |
37 | 65 | ProfileForm, | ||
38 | 66 | remove_None_values, | 60 | remove_None_values, |
39 | 67 | SetZoneBulkAction, | 61 | SetZoneBulkAction, |
40 | 68 | UnconstrainedMultipleChoiceField, | 62 | UnconstrainedMultipleChoiceField, |
41 | @@ -71,14 +65,12 @@ | |||
42 | 71 | ValidatorMultipleChoiceField, | 65 | ValidatorMultipleChoiceField, |
43 | 72 | ) | 66 | ) |
44 | 73 | from maasserver.models import ( | 67 | from maasserver.models import ( |
45 | 74 | Config, | ||
46 | 75 | MACAddress, | 68 | MACAddress, |
47 | 76 | Network, | 69 | Network, |
48 | 77 | Node, | 70 | Node, |
49 | 78 | NodeGroup, | 71 | NodeGroup, |
50 | 79 | NodeGroupInterface, | 72 | NodeGroupInterface, |
51 | 80 | ) | 73 | ) |
52 | 81 | from maasserver.models.config import DEFAULT_CONFIG | ||
53 | 82 | from maasserver.models.network import get_name_and_vlan_from_cluster_interface | 74 | from maasserver.models.network import get_name_and_vlan_from_cluster_interface |
54 | 83 | from maasserver.models.staticipaddress import StaticIPAddress | 75 | from maasserver.models.staticipaddress import StaticIPAddress |
55 | 84 | from maasserver.node_action import ( | 76 | from maasserver.node_action import ( |
56 | @@ -235,62 +227,6 @@ | |||
57 | 235 | AdminNodeWithMACAddressesForm, get_node_create_form(admin)) | 227 | AdminNodeWithMACAddressesForm, get_node_create_form(admin)) |
58 | 236 | 228 | ||
59 | 237 | 229 | ||
60 | 238 | class TestOptionForm(ConfigForm): | ||
61 | 239 | field1 = forms.CharField(label="Field 1", max_length=10) | ||
62 | 240 | field2 = forms.BooleanField(label="Field 2", required=False) | ||
63 | 241 | |||
64 | 242 | |||
65 | 243 | class TestValidOptionForm(ConfigForm): | ||
66 | 244 | maas_name = forms.CharField(label="Field 1", max_length=10) | ||
67 | 245 | |||
68 | 246 | |||
69 | 247 | class ConfigFormTest(MAASServerTestCase): | ||
70 | 248 | |||
71 | 249 | def test_form_valid_saves_into_db(self): | ||
72 | 250 | value = factory.make_string(10) | ||
73 | 251 | form = TestValidOptionForm({'maas_name': value}) | ||
74 | 252 | result = form.save() | ||
75 | 253 | |||
76 | 254 | self.assertTrue(result) | ||
77 | 255 | self.assertEqual(value, Config.objects.get_config('maas_name')) | ||
78 | 256 | |||
79 | 257 | def test_form_rejects_unknown_settings(self): | ||
80 | 258 | value = factory.make_string(10) | ||
81 | 259 | value2 = factory.make_string(10) | ||
82 | 260 | form = TestOptionForm({'field1': value, 'field2': value2}) | ||
83 | 261 | valid = form.is_valid() | ||
84 | 262 | |||
85 | 263 | self.assertFalse(valid) | ||
86 | 264 | self.assertIn('field1', form._errors) | ||
87 | 265 | self.assertIn('field2', form._errors) | ||
88 | 266 | |||
89 | 267 | def test_form_invalid_does_not_save_into_db(self): | ||
90 | 268 | value_too_long = factory.make_string(20) | ||
91 | 269 | form = TestOptionForm({'field1': value_too_long, 'field2': False}) | ||
92 | 270 | result = form.save() | ||
93 | 271 | |||
94 | 272 | self.assertFalse(result) | ||
95 | 273 | self.assertIn('field1', form._errors) | ||
96 | 274 | self.assertIsNone(Config.objects.get_config('field1')) | ||
97 | 275 | self.assertIsNone(Config.objects.get_config('field2')) | ||
98 | 276 | |||
99 | 277 | def test_form_loads_initial_values(self): | ||
100 | 278 | value = factory.make_string() | ||
101 | 279 | Config.objects.set_config('field1', value) | ||
102 | 280 | form = TestOptionForm() | ||
103 | 281 | |||
104 | 282 | self.assertItemsEqual(['field1'], form.initial) | ||
105 | 283 | self.assertEqual(value, form.initial['field1']) | ||
106 | 284 | |||
107 | 285 | def test_form_loads_initial_values_from_default_value(self): | ||
108 | 286 | value = factory.make_string() | ||
109 | 287 | DEFAULT_CONFIG['field1'] = value | ||
110 | 288 | form = TestOptionForm() | ||
111 | 289 | |||
112 | 290 | self.assertItemsEqual(['field1'], form.initial) | ||
113 | 291 | self.assertEqual(value, form.initial['field1']) | ||
114 | 292 | |||
115 | 293 | |||
116 | 294 | class TestNodeForm(MAASServerTestCase): | 230 | class TestNodeForm(MAASServerTestCase): |
117 | 295 | 231 | ||
118 | 296 | def test_contains_limited_set_of_fields(self): | 232 | def test_contains_limited_set_of_fields(self): |
119 | @@ -603,116 +539,6 @@ | |||
120 | 603 | self.assertEqual(old_nodegroup, node.nodegroup) | 539 | self.assertEqual(old_nodegroup, node.nodegroup) |
121 | 604 | 540 | ||
122 | 605 | 541 | ||
123 | 606 | class TestUniqueEmailForms(MAASServerTestCase): | ||
124 | 607 | |||
125 | 608 | def assertFormFailsValidationBecauseEmailNotUnique(self, form): | ||
126 | 609 | self.assertFalse(form.is_valid()) | ||
127 | 610 | self.assertIn('email', form._errors) | ||
128 | 611 | self.assertEquals(1, len(form._errors['email'])) | ||
129 | 612 | # Cope with 'Email' and 'E-mail' in error message. | ||
130 | 613 | self.assertThat( | ||
131 | 614 | form._errors['email'][0], | ||
132 | 615 | MatchesRegex( | ||
133 | 616 | r'User with this E-{0,1}mail address already exists.')) | ||
134 | 617 | |||
135 | 618 | def test_ProfileForm_fails_validation_if_email_taken(self): | ||
136 | 619 | another_email = '%s@example.com' % factory.make_string() | ||
137 | 620 | factory.make_user(email=another_email) | ||
138 | 621 | email = '%s@example.com' % factory.make_string() | ||
139 | 622 | user = factory.make_user(email=email) | ||
140 | 623 | form = ProfileForm(instance=user, data={'email': another_email}) | ||
141 | 624 | self.assertFormFailsValidationBecauseEmailNotUnique(form) | ||
142 | 625 | |||
143 | 626 | def test_ProfileForm_validates_if_email_unchanged(self): | ||
144 | 627 | email = '%s@example.com' % factory.make_string() | ||
145 | 628 | user = factory.make_user(email=email) | ||
146 | 629 | form = ProfileForm(instance=user, data={'email': email}) | ||
147 | 630 | self.assertTrue(form.is_valid()) | ||
148 | 631 | |||
149 | 632 | def test_NewUserCreationForm_fails_validation_if_email_taken(self): | ||
150 | 633 | email = '%s@example.com' % factory.make_string() | ||
151 | 634 | username = factory.make_string() | ||
152 | 635 | password = factory.make_string() | ||
153 | 636 | factory.make_user(email=email) | ||
154 | 637 | form = NewUserCreationForm( | ||
155 | 638 | { | ||
156 | 639 | 'email': email, | ||
157 | 640 | 'username': username, | ||
158 | 641 | 'password1': password, | ||
159 | 642 | 'password2': password, | ||
160 | 643 | }) | ||
161 | 644 | self.assertFormFailsValidationBecauseEmailNotUnique(form) | ||
162 | 645 | |||
163 | 646 | def test_EditUserForm_fails_validation_if_email_taken(self): | ||
164 | 647 | another_email = '%s@example.com' % factory.make_string() | ||
165 | 648 | factory.make_user(email=another_email) | ||
166 | 649 | email = '%s@example.com' % factory.make_string() | ||
167 | 650 | user = factory.make_user(email=email) | ||
168 | 651 | form = EditUserForm(instance=user, data={'email': another_email}) | ||
169 | 652 | self.assertFormFailsValidationBecauseEmailNotUnique(form) | ||
170 | 653 | |||
171 | 654 | def test_EditUserForm_validates_if_email_unchanged(self): | ||
172 | 655 | email = '%s@example.com' % factory.make_string() | ||
173 | 656 | user = factory.make_user(email=email) | ||
174 | 657 | form = EditUserForm( | ||
175 | 658 | instance=user, | ||
176 | 659 | data={ | ||
177 | 660 | 'email': email, | ||
178 | 661 | 'username': factory.make_string(), | ||
179 | 662 | }) | ||
180 | 663 | self.assertTrue(form.is_valid()) | ||
181 | 664 | |||
182 | 665 | |||
183 | 666 | class TestNewUserCreationForm(MAASServerTestCase): | ||
184 | 667 | |||
185 | 668 | def test_saves_to_db_by_default(self): | ||
186 | 669 | password = factory.make_name('password') | ||
187 | 670 | params = { | ||
188 | 671 | 'email': '%s@example.com' % factory.make_string(), | ||
189 | 672 | 'username': factory.make_name('user'), | ||
190 | 673 | 'password1': password, | ||
191 | 674 | 'password2': password, | ||
192 | 675 | } | ||
193 | 676 | form = NewUserCreationForm(params) | ||
194 | 677 | form.save() | ||
195 | 678 | self.assertIsNotNone(User.objects.get(username=params['username'])) | ||
196 | 679 | |||
197 | 680 | def test_email_is_required(self): | ||
198 | 681 | password = factory.make_name('password') | ||
199 | 682 | params = { | ||
200 | 683 | 'email': '', | ||
201 | 684 | 'username': factory.make_name('user'), | ||
202 | 685 | 'password1': password, | ||
203 | 686 | 'password2': password, | ||
204 | 687 | } | ||
205 | 688 | form = NewUserCreationForm(params) | ||
206 | 689 | self.assertFalse(form.is_valid()) | ||
207 | 690 | self.assertEquals( | ||
208 | 691 | {'email': ['This field is required.']}, | ||
209 | 692 | form._errors) | ||
210 | 693 | |||
211 | 694 | def test_does_not_save_to_db_if_commit_is_False(self): | ||
212 | 695 | password = factory.make_name('password') | ||
213 | 696 | params = { | ||
214 | 697 | 'email': '%s@example.com' % factory.make_string(), | ||
215 | 698 | 'username': factory.make_name('user'), | ||
216 | 699 | 'password1': password, | ||
217 | 700 | 'password2': password, | ||
218 | 701 | } | ||
219 | 702 | form = NewUserCreationForm(params) | ||
220 | 703 | form.save(commit=False) | ||
221 | 704 | self.assertItemsEqual( | ||
222 | 705 | [], User.objects.filter(username=params['username'])) | ||
223 | 706 | |||
224 | 707 | def test_fields_order(self): | ||
225 | 708 | form = NewUserCreationForm() | ||
226 | 709 | |||
227 | 710 | self.assertEqual( | ||
228 | 711 | ['username', 'last_name', 'email', 'password1', 'password2', | ||
229 | 712 | 'is_superuser'], | ||
230 | 713 | list(form.fields)) | ||
231 | 714 | |||
232 | 715 | |||
233 | 716 | class TestMergeErrorMessages(MAASServerTestCase): | 542 | class TestMergeErrorMessages(MAASServerTestCase): |
234 | 717 | 543 | ||
235 | 718 | def test_merge_error_messages_returns_summary_message(self): | 544 | def test_merge_error_messages_returns_summary_message(self): |
236 | 719 | 545 | ||
237 | === added file 'src/maasserver/tests/test_forms_config.py' | |||
238 | --- src/maasserver/tests/test_forms_config.py 1970-01-01 00:00:00 +0000 | |||
239 | +++ src/maasserver/tests/test_forms_config.py 2014-08-26 03:54:20 +0000 | |||
240 | @@ -0,0 +1,78 @@ | |||
241 | 1 | # Copyright 2014 Canonical Ltd. This software is licensed under the | ||
242 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
243 | 3 | |||
244 | 4 | """Tests for `ConfigForm`.""" | ||
245 | 5 | |||
246 | 6 | from __future__ import ( | ||
247 | 7 | absolute_import, | ||
248 | 8 | print_function, | ||
249 | 9 | unicode_literals, | ||
250 | 10 | ) | ||
251 | 11 | |||
252 | 12 | str = None | ||
253 | 13 | |||
254 | 14 | __metaclass__ = type | ||
255 | 15 | __all__ = [] | ||
256 | 16 | |||
257 | 17 | from django import forms | ||
258 | 18 | from maasserver.forms import ConfigForm | ||
259 | 19 | from maasserver.models import Config | ||
260 | 20 | from maasserver.models.config import DEFAULT_CONFIG | ||
261 | 21 | from maasserver.testing.factory import factory | ||
262 | 22 | from maasserver.testing.testcase import MAASServerTestCase | ||
263 | 23 | |||
264 | 24 | |||
265 | 25 | class TestOptionForm(ConfigForm): | ||
266 | 26 | field1 = forms.CharField(label="Field 1", max_length=10) | ||
267 | 27 | field2 = forms.BooleanField(label="Field 2", required=False) | ||
268 | 28 | |||
269 | 29 | |||
270 | 30 | class TestValidOptionForm(ConfigForm): | ||
271 | 31 | maas_name = forms.CharField(label="Field 1", max_length=10) | ||
272 | 32 | |||
273 | 33 | |||
274 | 34 | class ConfigFormTest(MAASServerTestCase): | ||
275 | 35 | |||
276 | 36 | def test_form_valid_saves_into_db(self): | ||
277 | 37 | value = factory.make_string(10) | ||
278 | 38 | form = TestValidOptionForm({'maas_name': value}) | ||
279 | 39 | result = form.save() | ||
280 | 40 | |||
281 | 41 | self.assertTrue(result) | ||
282 | 42 | self.assertEqual(value, Config.objects.get_config('maas_name')) | ||
283 | 43 | |||
284 | 44 | def test_form_rejects_unknown_settings(self): | ||
285 | 45 | value = factory.make_string(10) | ||
286 | 46 | value2 = factory.make_string(10) | ||
287 | 47 | form = TestOptionForm({'field1': value, 'field2': value2}) | ||
288 | 48 | valid = form.is_valid() | ||
289 | 49 | |||
290 | 50 | self.assertFalse(valid) | ||
291 | 51 | self.assertIn('field1', form._errors) | ||
292 | 52 | self.assertIn('field2', form._errors) | ||
293 | 53 | |||
294 | 54 | def test_form_invalid_does_not_save_into_db(self): | ||
295 | 55 | value_too_long = factory.make_string(20) | ||
296 | 56 | form = TestOptionForm({'field1': value_too_long, 'field2': False}) | ||
297 | 57 | result = form.save() | ||
298 | 58 | |||
299 | 59 | self.assertFalse(result) | ||
300 | 60 | self.assertIn('field1', form._errors) | ||
301 | 61 | self.assertIsNone(Config.objects.get_config('field1')) | ||
302 | 62 | self.assertIsNone(Config.objects.get_config('field2')) | ||
303 | 63 | |||
304 | 64 | def test_form_loads_initial_values(self): | ||
305 | 65 | value = factory.make_string() | ||
306 | 66 | Config.objects.set_config('field1', value) | ||
307 | 67 | form = TestOptionForm() | ||
308 | 68 | |||
309 | 69 | self.assertItemsEqual(['field1'], form.initial) | ||
310 | 70 | self.assertEqual(value, form.initial['field1']) | ||
311 | 71 | |||
312 | 72 | def test_form_loads_initial_values_from_default_value(self): | ||
313 | 73 | value = factory.make_string() | ||
314 | 74 | DEFAULT_CONFIG['field1'] = value | ||
315 | 75 | form = TestOptionForm() | ||
316 | 76 | |||
317 | 77 | self.assertItemsEqual(['field1'], form.initial) | ||
318 | 78 | self.assertEqual(value, form.initial['field1']) | ||
319 | 0 | 79 | ||
320 | === added file 'src/maasserver/tests/test_forms_user.py' | |||
321 | --- src/maasserver/tests/test_forms_user.py 1970-01-01 00:00:00 +0000 | |||
322 | +++ src/maasserver/tests/test_forms_user.py 2014-08-26 03:54:20 +0000 | |||
323 | @@ -0,0 +1,135 @@ | |||
324 | 1 | # Copyright 2014 Canonical Ltd. This software is licensed under the | ||
325 | 2 | # GNU Affero General Public License version 3 (see the file LICENSE). | ||
326 | 3 | |||
327 | 4 | """Tests for user-creation forms.""" | ||
328 | 5 | |||
329 | 6 | from __future__ import ( | ||
330 | 7 | absolute_import, | ||
331 | 8 | print_function, | ||
332 | 9 | unicode_literals, | ||
333 | 10 | ) | ||
334 | 11 | |||
335 | 12 | str = None | ||
336 | 13 | |||
337 | 14 | __metaclass__ = type | ||
338 | 15 | __all__ = [] | ||
339 | 16 | |||
340 | 17 | from django.contrib.auth.models import User | ||
341 | 18 | from maasserver.forms import ( | ||
342 | 19 | EditUserForm, | ||
343 | 20 | NewUserCreationForm, | ||
344 | 21 | ProfileForm, | ||
345 | 22 | ) | ||
346 | 23 | from maasserver.testing.factory import factory | ||
347 | 24 | from maasserver.testing.testcase import MAASServerTestCase | ||
348 | 25 | from testtools.matchers import MatchesRegex | ||
349 | 26 | |||
350 | 27 | |||
351 | 28 | class TestUniqueEmailForms(MAASServerTestCase): | ||
352 | 29 | |||
353 | 30 | def assertFormFailsValidationBecauseEmailNotUnique(self, form): | ||
354 | 31 | self.assertFalse(form.is_valid()) | ||
355 | 32 | self.assertIn('email', form._errors) | ||
356 | 33 | self.assertEquals(1, len(form._errors['email'])) | ||
357 | 34 | # Cope with 'Email' and 'E-mail' in error message. | ||
358 | 35 | self.assertThat( | ||
359 | 36 | form._errors['email'][0], | ||
360 | 37 | MatchesRegex( | ||
361 | 38 | r'User with this E-{0,1}mail address already exists.')) | ||
362 | 39 | |||
363 | 40 | def test_ProfileForm_fails_validation_if_email_taken(self): | ||
364 | 41 | another_email = '%s@example.com' % factory.make_string() | ||
365 | 42 | factory.make_user(email=another_email) | ||
366 | 43 | email = '%s@example.com' % factory.make_string() | ||
367 | 44 | user = factory.make_user(email=email) | ||
368 | 45 | form = ProfileForm(instance=user, data={'email': another_email}) | ||
369 | 46 | self.assertFormFailsValidationBecauseEmailNotUnique(form) | ||
370 | 47 | |||
371 | 48 | def test_ProfileForm_validates_if_email_unchanged(self): | ||
372 | 49 | email = '%s@example.com' % factory.make_string() | ||
373 | 50 | user = factory.make_user(email=email) | ||
374 | 51 | form = ProfileForm(instance=user, data={'email': email}) | ||
375 | 52 | self.assertTrue(form.is_valid()) | ||
376 | 53 | |||
377 | 54 | def test_NewUserCreationForm_fails_validation_if_email_taken(self): | ||
378 | 55 | email = '%s@example.com' % factory.make_string() | ||
379 | 56 | username = factory.make_string() | ||
380 | 57 | password = factory.make_string() | ||
381 | 58 | factory.make_user(email=email) | ||
382 | 59 | form = NewUserCreationForm( | ||
383 | 60 | { | ||
384 | 61 | 'email': email, | ||
385 | 62 | 'username': username, | ||
386 | 63 | 'password1': password, | ||
387 | 64 | 'password2': password, | ||
388 | 65 | }) | ||
389 | 66 | self.assertFormFailsValidationBecauseEmailNotUnique(form) | ||
390 | 67 | |||
391 | 68 | def test_EditUserForm_fails_validation_if_email_taken(self): | ||
392 | 69 | another_email = '%s@example.com' % factory.make_string() | ||
393 | 70 | factory.make_user(email=another_email) | ||
394 | 71 | email = '%s@example.com' % factory.make_string() | ||
395 | 72 | user = factory.make_user(email=email) | ||
396 | 73 | form = EditUserForm(instance=user, data={'email': another_email}) | ||
397 | 74 | self.assertFormFailsValidationBecauseEmailNotUnique(form) | ||
398 | 75 | |||
399 | 76 | def test_EditUserForm_validates_if_email_unchanged(self): | ||
400 | 77 | email = '%s@example.com' % factory.make_string() | ||
401 | 78 | user = factory.make_user(email=email) | ||
402 | 79 | form = EditUserForm( | ||
403 | 80 | instance=user, | ||
404 | 81 | data={ | ||
405 | 82 | 'email': email, | ||
406 | 83 | 'username': factory.make_string(), | ||
407 | 84 | }) | ||
408 | 85 | self.assertTrue(form.is_valid()) | ||
409 | 86 | |||
410 | 87 | |||
411 | 88 | class TestNewUserCreationForm(MAASServerTestCase): | ||
412 | 89 | |||
413 | 90 | def test_saves_to_db_by_default(self): | ||
414 | 91 | password = factory.make_name('password') | ||
415 | 92 | params = { | ||
416 | 93 | 'email': '%s@example.com' % factory.make_string(), | ||
417 | 94 | 'username': factory.make_name('user'), | ||
418 | 95 | 'password1': password, | ||
419 | 96 | 'password2': password, | ||
420 | 97 | } | ||
421 | 98 | form = NewUserCreationForm(params) | ||
422 | 99 | form.save() | ||
423 | 100 | self.assertIsNotNone(User.objects.get(username=params['username'])) | ||
424 | 101 | |||
425 | 102 | def test_email_is_required(self): | ||
426 | 103 | password = factory.make_name('password') | ||
427 | 104 | params = { | ||
428 | 105 | 'email': '', | ||
429 | 106 | 'username': factory.make_name('user'), | ||
430 | 107 | 'password1': password, | ||
431 | 108 | 'password2': password, | ||
432 | 109 | } | ||
433 | 110 | form = NewUserCreationForm(params) | ||
434 | 111 | self.assertFalse(form.is_valid()) | ||
435 | 112 | self.assertEquals( | ||
436 | 113 | {'email': ['This field is required.']}, | ||
437 | 114 | form._errors) | ||
438 | 115 | |||
439 | 116 | def test_does_not_save_to_db_if_commit_is_False(self): | ||
440 | 117 | password = factory.make_name('password') | ||
441 | 118 | params = { | ||
442 | 119 | 'email': '%s@example.com' % factory.make_string(), | ||
443 | 120 | 'username': factory.make_name('user'), | ||
444 | 121 | 'password1': password, | ||
445 | 122 | 'password2': password, | ||
446 | 123 | } | ||
447 | 124 | form = NewUserCreationForm(params) | ||
448 | 125 | form.save(commit=False) | ||
449 | 126 | self.assertItemsEqual( | ||
450 | 127 | [], User.objects.filter(username=params['username'])) | ||
451 | 128 | |||
452 | 129 | def test_fields_order(self): | ||
453 | 130 | form = NewUserCreationForm() | ||
454 | 131 | |||
455 | 132 | self.assertEqual( | ||
456 | 133 | ['username', 'last_name', 'email', 'password1', 'password2', | ||
457 | 134 | 'is_superuser'], | ||
458 | 135 | list(form.fields)) |
Looks OK. Self-approving.