Merge lp:~jtv/maas/extract-formtest-network 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: 2762
Proposed branch: lp:~jtv/maas/extract-formtest-network
Merge into: lp:~maas-committers/maas/trunk
Diff against target: 282 lines (+142/-118)
2 files modified
src/maasserver/tests/test_forms.py (+0/-118)
src/maasserver/tests/test_forms_network.py (+142/-0)
To merge this branch: bzr merge lp:~jtv/maas/extract-formtest-network
Reviewer Review Type Date Requested Status
Jeroen T. Vermeulen (community) Approve
Review via email: mp+231397@code.launchpad.net

Commit message

Extract NetworkForm tests into their own module.

Description of the change

Well, api.py no longer exists and its remnants are acceptably sized. The whole API has been kicked out of the top-5 of largest files. That's great.

But the next largest file, test_forms.py, is still much larger than it should be. Experience with api.py suggests to me that a thousand lines is about the maximum a module should be. And so I'm taking a few easy bites out of that test module. I'm sure my naming schemes are not great and I can't promise that I'll always cut along the right lines — but these are the things we can improve once we can see the forest as well as the trees.

Once test_forms.py has been broken up a bit, we can worry about breaking up the next largest file after that, not much smaller: forms.py itself ought to become a package, like the models, views, and API before it.

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-16 05:50:44 +0000
3+++ src/maasserver/tests/test_forms.py 2014-08-19 15:27:34 +0000
4@@ -63,7 +63,6 @@
5 MACAddressForm,
6 MAX_MESSAGES,
7 merge_error_messages,
8- NetworkForm,
9 NewUserCreationForm,
10 NO_ARCHITECTURES_AVAILABLE,
11 NodeActionForm,
12@@ -2209,123 +2208,6 @@
13 form.errors)
14
15
16-class TestNetworkForm(MAASServerTestCase):
17- """Tests for `NetworkForm`."""
18-
19- def test_creates_network(self):
20- network = factory.getRandomNetwork()
21- name = factory.make_name('network')
22- definition = {
23- 'name': name,
24- 'description': factory.make_string(),
25- 'ip': "%s" % network.cidr.ip,
26- 'netmask': "%s" % network.netmask,
27- 'vlan_tag': factory.make_vlan_tag(),
28- }
29- form = NetworkForm(data=definition)
30- form.save()
31- network_obj = Network.objects.get(name=name)
32- self.assertAttributes(network_obj, definition)
33-
34- def test_updates_network(self):
35- network = factory.make_network()
36- new_description = factory.make_string()
37- form = NetworkForm(
38- data={'description': new_description}, instance=network)
39- form.save()
40- network = reload_object(network)
41- self.assertEqual(new_description, network.description)
42-
43- def test_populates_initial_macaddresses(self):
44- network = factory.make_network()
45- macs = [
46- factory.make_mac_address(networks=[network])
47- for _ in range(3)]
48- # Create other MAC addresses.
49- for _ in range(2):
50- factory.make_mac_address(networks=[factory.make_network()])
51- new_description = factory.make_string()
52- form = NetworkForm(
53- data={'description': new_description}, instance=network)
54- self.assertItemsEqual(
55- [mac.mac_address.get_raw() for mac in macs],
56- form.initial['mac_addresses'])
57-
58- def test_macaddresses_are_sorted(self):
59- network1, network2 = factory.make_networks(2)
60- macs = [
61- factory.make_mac_address(networks=[network1])
62- for _ in range(3)]
63- # Create macs connected to the same node.
64- macs = macs + [
65- factory.make_mac_address(networks=[network1], node=macs[0].node)
66- for _ in range(3)]
67- # Create other MAC addresses.
68- for _ in range(2):
69- factory.make_mac_address(networks=[network2])
70- form = NetworkForm(data={}, instance=network1)
71- self.assertEqual(
72- list(MACAddress.objects.all().order_by(
73- 'node__hostname', 'mac_address')),
74- list(form.fields['mac_addresses'].queryset))
75-
76- def test_macaddresses_widget_displays_MAC_and_node_hostname(self):
77- networks = factory.make_networks(3)
78- same_network = networks[0]
79- misc_networks = networks[1:]
80- for _ in range(3):
81- factory.make_mac_address(networks=[same_network])
82- # Create other MAC addresses.
83- for network in misc_networks:
84- factory.make_mac_address(networks=[network])
85- form = NetworkForm(data={}, instance=same_network)
86- self.assertItemsEqual(
87- [(mac.mac_address, "%s (%s)" % (
88- mac.mac_address, mac.node.hostname))
89- for mac in MACAddress.objects.all()],
90- form.fields['mac_addresses'].widget.choices)
91-
92- def test_updates_macaddresses(self):
93- network = factory.make_network()
94- # Attach a couple of MAC addresses to the network.
95- [factory.make_mac_address(networks=[network]) for _ in range(3)]
96- new_macs = [
97- factory.make_mac_address()
98- for _ in range(3)]
99- form = NetworkForm(
100- data={
101- 'mac_addresses': [
102- mac.mac_address.get_raw() for mac in new_macs],
103- },
104- instance=network)
105- form.save()
106- network = reload_object(network)
107- self.assertItemsEqual(new_macs, network.macaddress_set.all())
108-
109- def test_reports_clashes(self):
110- # The uniqueness test on the Network model raises a ValidationError
111- # when it finds a clash, but Django is prone to crashing when the
112- # exception doesn't take the expected form (bug 1299114).
113- big_network = IPNetwork('10.9.0.0/16')
114- nested_network = IPNetwork('10.9.9.0/24')
115-
116- existing_network = factory.make_network(network=big_network)
117- form = NetworkForm(data={
118- 'name': factory.make_name('clashing-network'),
119- 'ip': "%s" % nested_network.cidr.ip,
120- 'netmask': "%s" % nested_network.netmask,
121- 'vlan_tag': factory.make_vlan_tag(),
122- })
123- self.assertFalse(form.is_valid())
124- message = "IP range clashes with network '%s'." % existing_network.name
125- self.assertEqual(
126- {
127- 'ip': [message],
128- 'netmask': [message],
129- },
130- form.errors)
131-
132-
133 class TestInstanceListField(MAASServerTestCase):
134 """Tests for `InstanceListingField`."""
135
136
137=== added file 'src/maasserver/tests/test_forms_network.py'
138--- src/maasserver/tests/test_forms_network.py 1970-01-01 00:00:00 +0000
139+++ src/maasserver/tests/test_forms_network.py 2014-08-19 15:27:34 +0000
140@@ -0,0 +1,142 @@
141+# Copyright 2014 Canonical Ltd. This software is licensed under the
142+# GNU Affero General Public License version 3 (see the file LICENSE).
143+
144+"""Tests for `NetworkForm`."""
145+
146+from __future__ import (
147+ absolute_import,
148+ print_function,
149+ unicode_literals,
150+ )
151+
152+str = None
153+
154+__metaclass__ = type
155+__all__ = []
156+
157+from maasserver.forms import NetworkForm
158+from maasserver.models import (
159+ MACAddress,
160+ Network,
161+ )
162+from maasserver.testing.factory import factory
163+from maasserver.testing.orm import reload_object
164+from maasserver.testing.testcase import MAASServerTestCase
165+from netaddr import IPNetwork
166+
167+
168+class TestNetworkForm(MAASServerTestCase):
169+ """Tests for `NetworkForm`."""
170+
171+ def test_creates_network(self):
172+ network = factory.getRandomNetwork()
173+ name = factory.make_name('network')
174+ definition = {
175+ 'name': name,
176+ 'description': factory.make_string(),
177+ 'ip': "%s" % network.cidr.ip,
178+ 'netmask': "%s" % network.netmask,
179+ 'vlan_tag': factory.make_vlan_tag(),
180+ }
181+ form = NetworkForm(data=definition)
182+ form.save()
183+ network_obj = Network.objects.get(name=name)
184+ self.assertAttributes(network_obj, definition)
185+
186+ def test_updates_network(self):
187+ network = factory.make_network()
188+ new_description = factory.make_string()
189+ form = NetworkForm(
190+ data={'description': new_description}, instance=network)
191+ form.save()
192+ network = reload_object(network)
193+ self.assertEqual(new_description, network.description)
194+
195+ def test_populates_initial_macaddresses(self):
196+ network = factory.make_network()
197+ macs = [
198+ factory.make_mac_address(networks=[network])
199+ for _ in range(3)]
200+ # Create other MAC addresses.
201+ for _ in range(2):
202+ factory.make_mac_address(networks=[factory.make_network()])
203+ new_description = factory.make_string()
204+ form = NetworkForm(
205+ data={'description': new_description}, instance=network)
206+ self.assertItemsEqual(
207+ [mac.mac_address.get_raw() for mac in macs],
208+ form.initial['mac_addresses'])
209+
210+ def test_macaddresses_are_sorted(self):
211+ network1, network2 = factory.make_networks(2)
212+ macs = [
213+ factory.make_mac_address(networks=[network1])
214+ for _ in range(3)]
215+ # Create macs connected to the same node.
216+ macs = macs + [
217+ factory.make_mac_address(networks=[network1], node=macs[0].node)
218+ for _ in range(3)]
219+ # Create other MAC addresses.
220+ for _ in range(2):
221+ factory.make_mac_address(networks=[network2])
222+ form = NetworkForm(data={}, instance=network1)
223+ self.assertEqual(
224+ list(MACAddress.objects.all().order_by(
225+ 'node__hostname', 'mac_address')),
226+ list(form.fields['mac_addresses'].queryset))
227+
228+ def test_macaddresses_widget_displays_MAC_and_node_hostname(self):
229+ networks = factory.make_networks(3)
230+ same_network = networks[0]
231+ misc_networks = networks[1:]
232+ for _ in range(3):
233+ factory.make_mac_address(networks=[same_network])
234+ # Create other MAC addresses.
235+ for network in misc_networks:
236+ factory.make_mac_address(networks=[network])
237+ form = NetworkForm(data={}, instance=same_network)
238+ self.assertItemsEqual(
239+ [(mac.mac_address, "%s (%s)" % (
240+ mac.mac_address, mac.node.hostname))
241+ for mac in MACAddress.objects.all()],
242+ form.fields['mac_addresses'].widget.choices)
243+
244+ def test_updates_macaddresses(self):
245+ network = factory.make_network()
246+ # Attach a couple of MAC addresses to the network.
247+ [factory.make_mac_address(networks=[network]) for _ in range(3)]
248+ new_macs = [
249+ factory.make_mac_address()
250+ for _ in range(3)]
251+ form = NetworkForm(
252+ data={
253+ 'mac_addresses': [
254+ mac.mac_address.get_raw() for mac in new_macs],
255+ },
256+ instance=network)
257+ form.save()
258+ network = reload_object(network)
259+ self.assertItemsEqual(new_macs, network.macaddress_set.all())
260+
261+ def test_reports_clashes(self):
262+ # The uniqueness test on the Network model raises a ValidationError
263+ # when it finds a clash, but Django is prone to crashing when the
264+ # exception doesn't take the expected form (bug 1299114).
265+ big_network = IPNetwork('10.9.0.0/16')
266+ nested_network = IPNetwork('10.9.9.0/24')
267+
268+ existing_network = factory.make_network(network=big_network)
269+ form = NetworkForm(data={
270+ 'name': factory.make_name('clashing-network'),
271+ 'ip': "%s" % nested_network.cidr.ip,
272+ 'netmask': "%s" % nested_network.netmask,
273+ 'vlan_tag': factory.make_vlan_tag(),
274+ })
275+ self.assertFalse(form.is_valid())
276+ message = "IP range clashes with network '%s'." % existing_network.name
277+ self.assertEqual(
278+ {
279+ 'ip': [message],
280+ 'netmask': [message],
281+ },
282+ form.errors)