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 | import json |
6 | import random |
7 | |
8 | -from django import forms |
9 | from django.conf import settings |
10 | -from django.contrib.auth.models import User |
11 | from django.core.exceptions import ValidationError |
12 | from django.core.files.uploadedfile import SimpleUploadedFile |
13 | from django.core.validators import validate_email |
14 | @@ -38,10 +36,8 @@ |
15 | BulkNodeActionForm, |
16 | CommissioningForm, |
17 | CommissioningScriptForm, |
18 | - ConfigForm, |
19 | DeployForm, |
20 | DownloadProgressForm, |
21 | - EditUserForm, |
22 | ERROR_MESSAGE_STATIC_IPS_OUTSIDE_RANGE, |
23 | ERROR_MESSAGE_STATIC_RANGE_IN_USE, |
24 | get_node_create_form, |
25 | @@ -53,7 +49,6 @@ |
26 | MACAddressForm, |
27 | MAX_MESSAGES, |
28 | merge_error_messages, |
29 | - NewUserCreationForm, |
30 | NO_ARCHITECTURES_AVAILABLE, |
31 | NodeForm, |
32 | NodeGroupDefineForm, |
33 | @@ -62,7 +57,6 @@ |
34 | NodeGroupInterfaceForm, |
35 | NodeWithMACAddressesForm, |
36 | pick_default_architecture, |
37 | - ProfileForm, |
38 | remove_None_values, |
39 | SetZoneBulkAction, |
40 | UnconstrainedMultipleChoiceField, |
41 | @@ -71,14 +65,12 @@ |
42 | ValidatorMultipleChoiceField, |
43 | ) |
44 | from maasserver.models import ( |
45 | - Config, |
46 | MACAddress, |
47 | Network, |
48 | Node, |
49 | NodeGroup, |
50 | NodeGroupInterface, |
51 | ) |
52 | -from maasserver.models.config import DEFAULT_CONFIG |
53 | from maasserver.models.network import get_name_and_vlan_from_cluster_interface |
54 | from maasserver.models.staticipaddress import StaticIPAddress |
55 | from maasserver.node_action import ( |
56 | @@ -235,62 +227,6 @@ |
57 | AdminNodeWithMACAddressesForm, get_node_create_form(admin)) |
58 | |
59 | |
60 | -class TestOptionForm(ConfigForm): |
61 | - field1 = forms.CharField(label="Field 1", max_length=10) |
62 | - field2 = forms.BooleanField(label="Field 2", required=False) |
63 | - |
64 | - |
65 | -class TestValidOptionForm(ConfigForm): |
66 | - maas_name = forms.CharField(label="Field 1", max_length=10) |
67 | - |
68 | - |
69 | -class ConfigFormTest(MAASServerTestCase): |
70 | - |
71 | - def test_form_valid_saves_into_db(self): |
72 | - value = factory.make_string(10) |
73 | - form = TestValidOptionForm({'maas_name': value}) |
74 | - result = form.save() |
75 | - |
76 | - self.assertTrue(result) |
77 | - self.assertEqual(value, Config.objects.get_config('maas_name')) |
78 | - |
79 | - def test_form_rejects_unknown_settings(self): |
80 | - value = factory.make_string(10) |
81 | - value2 = factory.make_string(10) |
82 | - form = TestOptionForm({'field1': value, 'field2': value2}) |
83 | - valid = form.is_valid() |
84 | - |
85 | - self.assertFalse(valid) |
86 | - self.assertIn('field1', form._errors) |
87 | - self.assertIn('field2', form._errors) |
88 | - |
89 | - def test_form_invalid_does_not_save_into_db(self): |
90 | - value_too_long = factory.make_string(20) |
91 | - form = TestOptionForm({'field1': value_too_long, 'field2': False}) |
92 | - result = form.save() |
93 | - |
94 | - self.assertFalse(result) |
95 | - self.assertIn('field1', form._errors) |
96 | - self.assertIsNone(Config.objects.get_config('field1')) |
97 | - self.assertIsNone(Config.objects.get_config('field2')) |
98 | - |
99 | - def test_form_loads_initial_values(self): |
100 | - value = factory.make_string() |
101 | - Config.objects.set_config('field1', value) |
102 | - form = TestOptionForm() |
103 | - |
104 | - self.assertItemsEqual(['field1'], form.initial) |
105 | - self.assertEqual(value, form.initial['field1']) |
106 | - |
107 | - def test_form_loads_initial_values_from_default_value(self): |
108 | - value = factory.make_string() |
109 | - DEFAULT_CONFIG['field1'] = value |
110 | - form = TestOptionForm() |
111 | - |
112 | - self.assertItemsEqual(['field1'], form.initial) |
113 | - self.assertEqual(value, form.initial['field1']) |
114 | - |
115 | - |
116 | class TestNodeForm(MAASServerTestCase): |
117 | |
118 | def test_contains_limited_set_of_fields(self): |
119 | @@ -603,116 +539,6 @@ |
120 | self.assertEqual(old_nodegroup, node.nodegroup) |
121 | |
122 | |
123 | -class TestUniqueEmailForms(MAASServerTestCase): |
124 | - |
125 | - def assertFormFailsValidationBecauseEmailNotUnique(self, form): |
126 | - self.assertFalse(form.is_valid()) |
127 | - self.assertIn('email', form._errors) |
128 | - self.assertEquals(1, len(form._errors['email'])) |
129 | - # Cope with 'Email' and 'E-mail' in error message. |
130 | - self.assertThat( |
131 | - form._errors['email'][0], |
132 | - MatchesRegex( |
133 | - r'User with this E-{0,1}mail address already exists.')) |
134 | - |
135 | - def test_ProfileForm_fails_validation_if_email_taken(self): |
136 | - another_email = '%s@example.com' % factory.make_string() |
137 | - factory.make_user(email=another_email) |
138 | - email = '%s@example.com' % factory.make_string() |
139 | - user = factory.make_user(email=email) |
140 | - form = ProfileForm(instance=user, data={'email': another_email}) |
141 | - self.assertFormFailsValidationBecauseEmailNotUnique(form) |
142 | - |
143 | - def test_ProfileForm_validates_if_email_unchanged(self): |
144 | - email = '%s@example.com' % factory.make_string() |
145 | - user = factory.make_user(email=email) |
146 | - form = ProfileForm(instance=user, data={'email': email}) |
147 | - self.assertTrue(form.is_valid()) |
148 | - |
149 | - def test_NewUserCreationForm_fails_validation_if_email_taken(self): |
150 | - email = '%s@example.com' % factory.make_string() |
151 | - username = factory.make_string() |
152 | - password = factory.make_string() |
153 | - factory.make_user(email=email) |
154 | - form = NewUserCreationForm( |
155 | - { |
156 | - 'email': email, |
157 | - 'username': username, |
158 | - 'password1': password, |
159 | - 'password2': password, |
160 | - }) |
161 | - self.assertFormFailsValidationBecauseEmailNotUnique(form) |
162 | - |
163 | - def test_EditUserForm_fails_validation_if_email_taken(self): |
164 | - another_email = '%s@example.com' % factory.make_string() |
165 | - factory.make_user(email=another_email) |
166 | - email = '%s@example.com' % factory.make_string() |
167 | - user = factory.make_user(email=email) |
168 | - form = EditUserForm(instance=user, data={'email': another_email}) |
169 | - self.assertFormFailsValidationBecauseEmailNotUnique(form) |
170 | - |
171 | - def test_EditUserForm_validates_if_email_unchanged(self): |
172 | - email = '%s@example.com' % factory.make_string() |
173 | - user = factory.make_user(email=email) |
174 | - form = EditUserForm( |
175 | - instance=user, |
176 | - data={ |
177 | - 'email': email, |
178 | - 'username': factory.make_string(), |
179 | - }) |
180 | - self.assertTrue(form.is_valid()) |
181 | - |
182 | - |
183 | -class TestNewUserCreationForm(MAASServerTestCase): |
184 | - |
185 | - def test_saves_to_db_by_default(self): |
186 | - password = factory.make_name('password') |
187 | - params = { |
188 | - 'email': '%s@example.com' % factory.make_string(), |
189 | - 'username': factory.make_name('user'), |
190 | - 'password1': password, |
191 | - 'password2': password, |
192 | - } |
193 | - form = NewUserCreationForm(params) |
194 | - form.save() |
195 | - self.assertIsNotNone(User.objects.get(username=params['username'])) |
196 | - |
197 | - def test_email_is_required(self): |
198 | - password = factory.make_name('password') |
199 | - params = { |
200 | - 'email': '', |
201 | - 'username': factory.make_name('user'), |
202 | - 'password1': password, |
203 | - 'password2': password, |
204 | - } |
205 | - form = NewUserCreationForm(params) |
206 | - self.assertFalse(form.is_valid()) |
207 | - self.assertEquals( |
208 | - {'email': ['This field is required.']}, |
209 | - form._errors) |
210 | - |
211 | - def test_does_not_save_to_db_if_commit_is_False(self): |
212 | - password = factory.make_name('password') |
213 | - params = { |
214 | - 'email': '%s@example.com' % factory.make_string(), |
215 | - 'username': factory.make_name('user'), |
216 | - 'password1': password, |
217 | - 'password2': password, |
218 | - } |
219 | - form = NewUserCreationForm(params) |
220 | - form.save(commit=False) |
221 | - self.assertItemsEqual( |
222 | - [], User.objects.filter(username=params['username'])) |
223 | - |
224 | - def test_fields_order(self): |
225 | - form = NewUserCreationForm() |
226 | - |
227 | - self.assertEqual( |
228 | - ['username', 'last_name', 'email', 'password1', 'password2', |
229 | - 'is_superuser'], |
230 | - list(form.fields)) |
231 | - |
232 | - |
233 | class TestMergeErrorMessages(MAASServerTestCase): |
234 | |
235 | def test_merge_error_messages_returns_summary_message(self): |
236 | |
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 | +# Copyright 2014 Canonical Ltd. This software is licensed under the |
242 | +# GNU Affero General Public License version 3 (see the file LICENSE). |
243 | + |
244 | +"""Tests for `ConfigForm`.""" |
245 | + |
246 | +from __future__ import ( |
247 | + absolute_import, |
248 | + print_function, |
249 | + unicode_literals, |
250 | + ) |
251 | + |
252 | +str = None |
253 | + |
254 | +__metaclass__ = type |
255 | +__all__ = [] |
256 | + |
257 | +from django import forms |
258 | +from maasserver.forms import ConfigForm |
259 | +from maasserver.models import Config |
260 | +from maasserver.models.config import DEFAULT_CONFIG |
261 | +from maasserver.testing.factory import factory |
262 | +from maasserver.testing.testcase import MAASServerTestCase |
263 | + |
264 | + |
265 | +class TestOptionForm(ConfigForm): |
266 | + field1 = forms.CharField(label="Field 1", max_length=10) |
267 | + field2 = forms.BooleanField(label="Field 2", required=False) |
268 | + |
269 | + |
270 | +class TestValidOptionForm(ConfigForm): |
271 | + maas_name = forms.CharField(label="Field 1", max_length=10) |
272 | + |
273 | + |
274 | +class ConfigFormTest(MAASServerTestCase): |
275 | + |
276 | + def test_form_valid_saves_into_db(self): |
277 | + value = factory.make_string(10) |
278 | + form = TestValidOptionForm({'maas_name': value}) |
279 | + result = form.save() |
280 | + |
281 | + self.assertTrue(result) |
282 | + self.assertEqual(value, Config.objects.get_config('maas_name')) |
283 | + |
284 | + def test_form_rejects_unknown_settings(self): |
285 | + value = factory.make_string(10) |
286 | + value2 = factory.make_string(10) |
287 | + form = TestOptionForm({'field1': value, 'field2': value2}) |
288 | + valid = form.is_valid() |
289 | + |
290 | + self.assertFalse(valid) |
291 | + self.assertIn('field1', form._errors) |
292 | + self.assertIn('field2', form._errors) |
293 | + |
294 | + def test_form_invalid_does_not_save_into_db(self): |
295 | + value_too_long = factory.make_string(20) |
296 | + form = TestOptionForm({'field1': value_too_long, 'field2': False}) |
297 | + result = form.save() |
298 | + |
299 | + self.assertFalse(result) |
300 | + self.assertIn('field1', form._errors) |
301 | + self.assertIsNone(Config.objects.get_config('field1')) |
302 | + self.assertIsNone(Config.objects.get_config('field2')) |
303 | + |
304 | + def test_form_loads_initial_values(self): |
305 | + value = factory.make_string() |
306 | + Config.objects.set_config('field1', value) |
307 | + form = TestOptionForm() |
308 | + |
309 | + self.assertItemsEqual(['field1'], form.initial) |
310 | + self.assertEqual(value, form.initial['field1']) |
311 | + |
312 | + def test_form_loads_initial_values_from_default_value(self): |
313 | + value = factory.make_string() |
314 | + DEFAULT_CONFIG['field1'] = value |
315 | + form = TestOptionForm() |
316 | + |
317 | + self.assertItemsEqual(['field1'], form.initial) |
318 | + self.assertEqual(value, form.initial['field1']) |
319 | |
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 | +# Copyright 2014 Canonical Ltd. This software is licensed under the |
325 | +# GNU Affero General Public License version 3 (see the file LICENSE). |
326 | + |
327 | +"""Tests for user-creation forms.""" |
328 | + |
329 | +from __future__ import ( |
330 | + absolute_import, |
331 | + print_function, |
332 | + unicode_literals, |
333 | + ) |
334 | + |
335 | +str = None |
336 | + |
337 | +__metaclass__ = type |
338 | +__all__ = [] |
339 | + |
340 | +from django.contrib.auth.models import User |
341 | +from maasserver.forms import ( |
342 | + EditUserForm, |
343 | + NewUserCreationForm, |
344 | + ProfileForm, |
345 | + ) |
346 | +from maasserver.testing.factory import factory |
347 | +from maasserver.testing.testcase import MAASServerTestCase |
348 | +from testtools.matchers import MatchesRegex |
349 | + |
350 | + |
351 | +class TestUniqueEmailForms(MAASServerTestCase): |
352 | + |
353 | + def assertFormFailsValidationBecauseEmailNotUnique(self, form): |
354 | + self.assertFalse(form.is_valid()) |
355 | + self.assertIn('email', form._errors) |
356 | + self.assertEquals(1, len(form._errors['email'])) |
357 | + # Cope with 'Email' and 'E-mail' in error message. |
358 | + self.assertThat( |
359 | + form._errors['email'][0], |
360 | + MatchesRegex( |
361 | + r'User with this E-{0,1}mail address already exists.')) |
362 | + |
363 | + def test_ProfileForm_fails_validation_if_email_taken(self): |
364 | + another_email = '%s@example.com' % factory.make_string() |
365 | + factory.make_user(email=another_email) |
366 | + email = '%s@example.com' % factory.make_string() |
367 | + user = factory.make_user(email=email) |
368 | + form = ProfileForm(instance=user, data={'email': another_email}) |
369 | + self.assertFormFailsValidationBecauseEmailNotUnique(form) |
370 | + |
371 | + def test_ProfileForm_validates_if_email_unchanged(self): |
372 | + email = '%s@example.com' % factory.make_string() |
373 | + user = factory.make_user(email=email) |
374 | + form = ProfileForm(instance=user, data={'email': email}) |
375 | + self.assertTrue(form.is_valid()) |
376 | + |
377 | + def test_NewUserCreationForm_fails_validation_if_email_taken(self): |
378 | + email = '%s@example.com' % factory.make_string() |
379 | + username = factory.make_string() |
380 | + password = factory.make_string() |
381 | + factory.make_user(email=email) |
382 | + form = NewUserCreationForm( |
383 | + { |
384 | + 'email': email, |
385 | + 'username': username, |
386 | + 'password1': password, |
387 | + 'password2': password, |
388 | + }) |
389 | + self.assertFormFailsValidationBecauseEmailNotUnique(form) |
390 | + |
391 | + def test_EditUserForm_fails_validation_if_email_taken(self): |
392 | + another_email = '%s@example.com' % factory.make_string() |
393 | + factory.make_user(email=another_email) |
394 | + email = '%s@example.com' % factory.make_string() |
395 | + user = factory.make_user(email=email) |
396 | + form = EditUserForm(instance=user, data={'email': another_email}) |
397 | + self.assertFormFailsValidationBecauseEmailNotUnique(form) |
398 | + |
399 | + def test_EditUserForm_validates_if_email_unchanged(self): |
400 | + email = '%s@example.com' % factory.make_string() |
401 | + user = factory.make_user(email=email) |
402 | + form = EditUserForm( |
403 | + instance=user, |
404 | + data={ |
405 | + 'email': email, |
406 | + 'username': factory.make_string(), |
407 | + }) |
408 | + self.assertTrue(form.is_valid()) |
409 | + |
410 | + |
411 | +class TestNewUserCreationForm(MAASServerTestCase): |
412 | + |
413 | + def test_saves_to_db_by_default(self): |
414 | + password = factory.make_name('password') |
415 | + params = { |
416 | + 'email': '%s@example.com' % factory.make_string(), |
417 | + 'username': factory.make_name('user'), |
418 | + 'password1': password, |
419 | + 'password2': password, |
420 | + } |
421 | + form = NewUserCreationForm(params) |
422 | + form.save() |
423 | + self.assertIsNotNone(User.objects.get(username=params['username'])) |
424 | + |
425 | + def test_email_is_required(self): |
426 | + password = factory.make_name('password') |
427 | + params = { |
428 | + 'email': '', |
429 | + 'username': factory.make_name('user'), |
430 | + 'password1': password, |
431 | + 'password2': password, |
432 | + } |
433 | + form = NewUserCreationForm(params) |
434 | + self.assertFalse(form.is_valid()) |
435 | + self.assertEquals( |
436 | + {'email': ['This field is required.']}, |
437 | + form._errors) |
438 | + |
439 | + def test_does_not_save_to_db_if_commit_is_False(self): |
440 | + password = factory.make_name('password') |
441 | + params = { |
442 | + 'email': '%s@example.com' % factory.make_string(), |
443 | + 'username': factory.make_name('user'), |
444 | + 'password1': password, |
445 | + 'password2': password, |
446 | + } |
447 | + form = NewUserCreationForm(params) |
448 | + form.save(commit=False) |
449 | + self.assertItemsEqual( |
450 | + [], User.objects.filter(username=params['username'])) |
451 | + |
452 | + def test_fields_order(self): |
453 | + form = NewUserCreationForm() |
454 | + |
455 | + self.assertEqual( |
456 | + ['username', 'last_name', 'email', 'password1', 'password2', |
457 | + 'is_superuser'], |
458 | + list(form.fields)) |
Looks OK. Self-approving.