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
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))