474
517
[NO_ARCHITECTURES_AVAILABLE],
475
518
form.errors['architecture'])
520
def test_accepts_osystem(self):
521
osystem = make_usable_osystem(self)
522
form = NodeForm(data={
523
'hostname': factory.make_name('host'),
524
'architecture': make_usable_architecture(self),
525
'osystem': osystem.name,
527
self.assertTrue(form.is_valid(), form._errors)
529
def test_rejects_invalid_osystem(self):
530
patch_usable_osystems(self)
531
form = NodeForm(data={
532
'hostname': factory.make_name('host'),
533
'architecture': make_usable_architecture(self),
534
'osystem': factory.make_name('os'),
536
self.assertFalse(form.is_valid())
537
self.assertItemsEqual(['osystem'], form._errors.keys())
539
def test_starts_with_default_osystem(self):
540
osystems = [make_osystem_with_releases(self) for _ in range(5)]
541
patch_usable_osystems(self, osystems)
545
form.fields['osystem'].initial)
547
def test_accepts_osystem_distro_series(self):
548
osystem = make_usable_osystem(self)
549
release = osystem.get_default_release()
550
form = NodeForm(data={
551
'hostname': factory.make_name('host'),
552
'architecture': make_usable_architecture(self),
553
'osystem': osystem.name,
554
'distro_series': '%s/%s' % (osystem.name, release),
556
self.assertTrue(form.is_valid(), form._errors)
558
def test_rejects_invalid_osystem_distro_series(self):
559
osystem = make_usable_osystem(self)
560
release = factory.make_name('release')
561
form = NodeForm(data={
562
'hostname': factory.make_name('host'),
563
'architecture': make_usable_architecture(self),
564
'osystem': osystem.name,
565
'distro_series': '%s/%s' % (osystem.name, release),
567
self.assertFalse(form.is_valid())
568
self.assertItemsEqual(['distro_series'], form._errors.keys())
570
def test_starts_with_default_distro_series(self):
571
osystems = [make_osystem_with_releases(self) for _ in range(5)]
572
patch_usable_osystems(self, osystems)
576
form.fields['distro_series'].initial)
578
def test_rejects_mismatch_osystem_distro_series(self):
579
osystem = make_usable_osystem(self)
580
release = osystem.get_default_release()
581
invalid = factory.make_name('invalid_os')
582
form = NodeForm(data={
583
'hostname': factory.make_name('host'),
584
'architecture': make_usable_architecture(self),
585
'osystem': osystem.name,
586
'distro_series': '%s/%s' % (invalid, release),
588
self.assertFalse(form.is_valid())
589
self.assertItemsEqual(['distro_series'], form._errors.keys())
591
def test_rejects_missing_license_key(self):
592
osystem = make_usable_osystem(self)
593
release = osystem.get_default_release()
594
self.patch(osystem, 'requires_license_key').return_value = True
595
mock_validate = self.patch(osystem, 'validate_license_key')
596
mock_validate.return_value = True
597
form = NodeForm(data={
598
'hostname': factory.make_name('host'),
599
'architecture': make_usable_architecture(self),
600
'osystem': osystem.name,
601
'distro_series': '%s/%s*' % (osystem.name, release),
603
self.assertFalse(form.is_valid())
604
self.assertItemsEqual(['license_key'], form._errors.keys())
606
def test_calls_validate_license_key(self):
607
osystem = make_usable_osystem(self)
608
release = osystem.get_default_release()
609
self.patch(osystem, 'requires_license_key').return_value = True
610
mock_validate = self.patch(osystem, 'validate_license_key')
611
mock_validate.return_value = True
612
form = NodeForm(data={
613
'hostname': factory.make_name('host'),
614
'architecture': make_usable_architecture(self),
615
'osystem': osystem.name,
616
'distro_series': '%s/%s*' % (osystem.name, release),
617
'license_key': factory.getRandomString(),
619
self.assertTrue(form.is_valid())
620
mock_validate.assert_called_once()
478
623
class TestAdminNodeForm(MAASServerTestCase):
827
1022
if management is None:
828
1023
management = factory.getRandomEnum(NODEGROUPINTERFACE_MANAGEMENT)
829
1024
# Pick upper and lower boundaries of IP range, with upper > lower.
830
ip_range_low, ip_range_high = factory.make_ip_range(network)
1025
managed_ip_range = IPRange(*factory.make_ip_range(network))
1026
if len(managed_ip_range) > 2:
1027
dynamic_range = IPRange(
1028
IPAddress(managed_ip_range.first),
1029
IPAddress(managed_ip_range[len(managed_ip_range) // 2]))
1030
static_range = IPRange(
1031
IPAddress(managed_ip_range[(len(managed_ip_range) // 2) + 1]),
1032
IPAddress(managed_ip_range.last))
1033
static_low = unicode(IPAddress(static_range.first))
1034
static_high = unicode(IPAddress(static_range.last))
1036
dynamic_range = managed_ip_range
832
1040
'ip': factory.getRandomIPInNetwork(network),
833
1041
'interface': factory.make_name('interface'),
834
1042
'subnet_mask': unicode(network.netmask),
835
1043
'broadcast_ip': unicode(network.broadcast),
836
1044
'router_ip': factory.getRandomIPInNetwork(network),
837
'ip_range_low': unicode(ip_range_low),
838
'ip_range_high': unicode(ip_range_high),
1045
'ip_range_low': unicode(IPAddress(dynamic_range.first)),
1046
'ip_range_high': unicode(IPAddress(dynamic_range.last)),
1047
'static_ip_range_low': static_low,
1048
'static_ip_range_high': static_high,
839
1049
'management': management,
843
1053
nullable_fields = [
844
1054
'subnet_mask', 'broadcast_ip', 'router_ip', 'ip_range_low',
1055
'ip_range_high', 'static_ip_range_low', 'static_ip_range_high',
1059
def make_ngi_instance(nodegroup=None):
1060
"""Create a `NodeGroupInterface` with nothing set but `nodegroup`.
1062
This is used by tests to instantiate the cluster interface form for
1063
a given cluster. We create an initial cluster interface object just
1064
to tell it which cluster that is.
1066
if nodegroup is None:
1067
nodegroup = factory.make_node_group()
1068
return NodeGroupInterface(nodegroup=nodegroup)
848
1071
class TestNodeGroupInterfaceForm(MAASServerTestCase):
850
1073
def test_NodeGroupInterfaceForm_validates_parameters(self):
851
form = NodeGroupInterfaceForm(data={'ip': factory.getRandomString()})
1074
form = NodeGroupInterfaceForm(
1075
data={'ip': factory.getRandomString()},
1076
instance=make_ngi_instance())
852
1077
self.assertFalse(form.is_valid())
853
1078
self.assertEquals(
854
1079
{'ip': ['Enter a valid IPv4 or IPv6 address.']}, form._errors)
860
1085
del int_settings[field_name]
861
1086
nodegroup = factory.make_node_group()
862
1087
form = NodeGroupInterfaceForm(
864
instance=NodeGroupInterface(nodegroup=nodegroup))
1088
data=int_settings, instance=make_ngi_instance(nodegroup))
865
1089
interface = form.save()
866
1090
field_values = [
867
1091
getattr(interface, field_name) for field_name in nullable_fields]
868
1092
self.assertThat(field_values, AllMatch(Equals('')))
1094
def test_validates_new_static_ip_ranges(self):
1095
network = IPNetwork("10.1.0.0/24")
1096
nodegroup = factory.make_node_group(
1097
status=NODEGROUP_STATUS.ACCEPTED,
1098
management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1100
[interface] = nodegroup.get_managed_interfaces()
1101
StaticIPAddress.objects.allocate_new(
1102
interface.static_ip_range_low, interface.static_ip_range_high)
1103
form = NodeGroupInterfaceForm(
1104
data={'static_ip_range_low': '', 'static_ip_range_high': ''},
1106
self.assertFalse(form.is_valid())
1108
[ERROR_MESSAGE_STATIC_RANGE_IN_USE],
1109
form._errors['static_ip_range_low'])
1111
[ERROR_MESSAGE_STATIC_RANGE_IN_USE],
1112
form._errors['static_ip_range_high'])
1115
class TestNodeGroupInterfaceFormNetworkCreation(MAASServerTestCase):
1116
"""Tests for when NodeGroupInterfaceForm creates a Network."""
1118
def test_creates_network_name(self):
1119
int_settings = factory.get_interface_fields()
1120
int_settings['interface'] = 'eth0:1'
1121
interface = make_ngi_instance()
1122
form = NodeGroupInterfaceForm(data=int_settings, instance=interface)
1124
[network] = Network.objects.all()
1125
expected, _ = get_name_and_vlan_from_cluster_interface(interface)
1126
self.assertEqual(expected, network.name)
1128
def test_sets_vlan_tag(self):
1129
int_settings = factory.get_interface_fields()
1130
vlan_tag = random.randint(1, 10)
1131
int_settings['interface'] = 'eth0.%s' % vlan_tag
1132
interface = make_ngi_instance()
1133
form = NodeGroupInterfaceForm(data=int_settings, instance=interface)
1135
[network] = Network.objects.all()
1136
self.assertEqual(vlan_tag, network.vlan_tag)
1138
def test_vlan_tag_is_None_if_no_vlan(self):
1139
int_settings = factory.get_interface_fields()
1140
int_settings['interface'] = 'eth0:1'
1141
interface = make_ngi_instance()
1142
form = NodeGroupInterfaceForm(data=int_settings, instance=interface)
1144
[network] = Network.objects.all()
1145
self.assertIs(None, network.vlan_tag)
1147
def test_sets_network_values(self):
1148
int_settings = factory.get_interface_fields()
1149
interface = make_ngi_instance()
1150
form = NodeGroupInterfaceForm(data=int_settings, instance=interface)
1152
[network] = Network.objects.all()
1153
expected_net_address = unicode(interface.network.network)
1154
expected_netmask = unicode(interface.network.netmask)
1156
network, MatchesStructure.byEquality(
1157
ip=expected_net_address,
1158
netmask=expected_netmask))
1160
def test_does_not_create_new_network_if_already_exists(self):
1161
int_settings = factory.get_interface_fields()
1162
interface = make_ngi_instance()
1163
form = NodeGroupInterfaceForm(data=int_settings, instance=interface)
1164
# The easiest way to pre-create the same network is just to save
1167
[existing_network] = Network.objects.all()
1169
self.assertItemsEqual([existing_network], Network.objects.all())
1171
def test_creates_many_unique_networks(self):
1172
names = ('eth0', 'eth0:1', 'eth0.1', 'eth0:1.2')
1174
int_settings = factory.get_interface_fields()
1175
int_settings['interface'] = name
1176
interface = make_ngi_instance()
1177
form = NodeGroupInterfaceForm(
1178
data=int_settings, instance=interface)
1181
self.assertEqual(len(names), len(Network.objects.all()))
1184
class TestValidateNewStaticIPRanges(MAASServerTestCase):
1185
"""Tests for `validate_new_static_ip_ranges`()."""
1187
def make_interface(self):
1188
network = IPNetwork("10.1.0.0/24")
1189
nodegroup = factory.make_node_group(
1190
status=NODEGROUP_STATUS.ACCEPTED,
1191
management=NODEGROUPINTERFACE_MANAGEMENT.DHCP_AND_DNS,
1193
[interface] = nodegroup.get_managed_interfaces()
1194
interface.ip_range_low = '10.1.0.1'
1195
interface.ip_range_high = '10.1.0.10'
1196
interface.static_ip_range_low = '10.1.0.50'
1197
interface.static_ip_range_high = '10.1.0.60'
1201
def test_raises_error_when_allocated_ips_fall_outside_new_range(self):
1202
interface = self.make_interface()
1203
StaticIPAddress.objects.allocate_new('10.1.0.56', '10.1.0.60')
1204
error = self.assertRaises(
1206
validate_new_static_ip_ranges,
1208
static_ip_range_low='10.1.0.50',
1209
static_ip_range_high='10.1.0.55')
1211
ERROR_MESSAGE_STATIC_IPS_OUTSIDE_RANGE,
1214
def test_removing_static_range_raises_error_if_ips_allocated(self):
1215
interface = self.make_interface()
1216
StaticIPAddress.objects.allocate_new('10.1.0.56', '10.1.0.60')
1217
error = self.assertRaises(
1219
validate_new_static_ip_ranges,
1221
static_ip_range_low='',
1222
static_ip_range_high='')
1224
ERROR_MESSAGE_STATIC_RANGE_IN_USE,
1227
def test_allows_range_expansion(self):
1228
interface = self.make_interface()
1229
StaticIPAddress.objects.allocate_new('10.1.0.56', '10.1.0.60')
1230
is_valid = validate_new_static_ip_ranges(
1231
interface, static_ip_range_low='10.1.0.40',
1232
static_ip_range_high='10.1.0.100')
1233
self.assertTrue(is_valid)
1235
def test_allows_allocated_ip_as_upper_bound(self):
1236
interface = self.make_interface()
1237
StaticIPAddress.objects.allocate_new('10.1.0.55', '10.1.0.55')
1238
is_valid = validate_new_static_ip_ranges(
1240
static_ip_range_low=interface.static_ip_range_low,
1241
static_ip_range_high='10.1.0.55')
1242
self.assertTrue(is_valid)
1244
def test_allows_allocated_ip_as_lower_bound(self):
1245
interface = self.make_interface()
1246
StaticIPAddress.objects.allocate_new('10.1.0.55', '10.1.0.55')
1247
is_valid = validate_new_static_ip_ranges(
1248
interface, static_ip_range_low='10.1.0.55',
1249
static_ip_range_high=interface.static_ip_range_high)
1250
self.assertTrue(is_valid)
1252
def test_ignores_unmanaged_interfaces(self):
1253
interface = self.make_interface()
1254
interface.management = NODEGROUPINTERFACE_MANAGEMENT.UNMANAGED
1256
StaticIPAddress.objects.allocate_new(
1257
interface.static_ip_range_low, interface.static_ip_range_high)
1258
is_valid = validate_new_static_ip_ranges(
1259
interface, static_ip_range_low='10.1.0.57',
1260
static_ip_range_high='10.1.0.58')
1261
self.assertTrue(is_valid)
1263
def test_ignores_interfaces_with_no_static_range(self):
1264
interface = self.make_interface()
1265
interface.static_ip_range_low = None
1266
interface.static_ip_range_high = None
1268
StaticIPAddress.objects.allocate_new('10.1.0.56', '10.1.0.60')
1269
is_valid = validate_new_static_ip_ranges(
1270
interface, static_ip_range_low='10.1.0.57',
1271
static_ip_range_high='10.1.0.58')
1272
self.assertTrue(is_valid)
1274
def test_ignores_unchanged_static_range(self):
1275
interface = self.make_interface()
1276
StaticIPAddress.objects.allocate_new(
1277
interface.static_ip_range_low, interface.static_ip_range_high)
1278
is_valid = validate_new_static_ip_ranges(
1280
static_ip_range_low=interface.static_ip_range_low,
1281
static_ip_range_high=interface.static_ip_range_high)
1282
self.assertTrue(is_valid)
871
1285
class TestNodeGroupInterfaceForeignDHCPForm(MAASServerTestCase):
873
1287
def test_forms_saves_foreign_dhcp_ip(self):
874
1288
nodegroup = factory.make_node_group()
875
[interface] = nodegroup.get_managed_interfaces()
1289
interface = factory.make_node_group_interface(nodegroup)
876
1290
foreign_dhcp_ip = factory.getRandomIPAddress()
877
1291
form = NodeGroupInterfaceForeignDHCPForm(
878
1292
data={'foreign_dhcp_ip': foreign_dhcp_ip},
1798
2259
ValidationError,
1799
2260
field.clean, [node.system_id for node in nodes] + ['unknown'])
1800
2261
self.assertEquals(['Unknown node(s): unknown.'], error.messages)
2264
class TestBootSourceForm(MAASServerTestCase):
2265
"""Tests for `BootSourceForm`."""
2267
def test_edits_boot_source_object(self):
2268
boot_source = factory.make_boot_source()
2270
'url': 'http://example.com/',
2271
'keyring_filename': factory.make_name('keyring_filename'),
2273
form = BootSourceForm(instance=boot_source, data=params)
2274
self.assertTrue(form.is_valid(), form._errors)
2276
boot_source = reload_object(boot_source)
2277
self.assertAttributes(boot_source, params)
2279
def test_creates_boot_source_object_with_keyring_filename(self):
2280
nodegroup = factory.make_node_group()
2282
'url': 'http://example.com/',
2283
'keyring_filename': factory.make_name('keyring_filename'),
2285
form = BootSourceForm(nodegroup=nodegroup, data=params)
2286
self.assertTrue(form.is_valid(), form._errors)
2287
boot_source = form.save()
2288
self.assertAttributes(boot_source, params)
2290
def test_creates_boot_source_object_with_keyring_data(self):
2291
nodegroup = factory.make_node_group()
2292
in_mem_file = InMemoryUploadedFile(
2293
StringIO(sample_binary_data), name=factory.make_name('name'),
2294
field_name=factory.make_name('field-name'),
2295
content_type='application/octet-stream',
2296
size=len(sample_binary_data),
2298
params = {'url': 'http://example.com/'}
2299
form = BootSourceForm(
2300
nodegroup=nodegroup, data=params,
2301
files={'keyring_data': in_mem_file})
2302
self.assertTrue(form.is_valid(), form._errors)
2303
boot_source = form.save()
2304
self.assertEqual(sample_binary_data, bytes(boot_source.keyring_data))
2305
self.assertAttributes(boot_source, params)
2308
class TestBootSourceSelectionForm(MAASServerTestCase):
2309
"""Tests for `BootSourceSelectionForm`."""
2311
def test_edits_boot_source_selection_object(self):
2312
boot_source_selection = factory.make_boot_source_selection()
2313
ubuntu_os = UbuntuOS()
2314
new_release = factory.getRandomRelease(ubuntu_os)
2316
'release': new_release,
2317
'arches': [factory.make_name('arch'), factory.make_name('arch')],
2319
factory.make_name('subarch'), factory.make_name('subarch')],
2320
'labels': [factory.make_name('label'), factory.make_name('label')],
2322
form = BootSourceSelectionForm(
2323
instance=boot_source_selection, data=params)
2324
self.assertTrue(form.is_valid(), form._errors)
2326
boot_source_selection = reload_object(boot_source_selection)
2327
self.assertAttributes(boot_source_selection, params)
2329
def test_creates_boot_source_selection_object(self):
2330
boot_source = factory.make_boot_source()
2331
ubuntu_os = UbuntuOS()
2332
new_release = factory.getRandomRelease(ubuntu_os)
2334
'release': new_release,
2335
'arches': [factory.make_name('arch'), factory.make_name('arch')],
2337
factory.make_name('subarch'), factory.make_name('subarch')],
2338
'labels': [factory.make_name('label'), factory.make_name('label')],
2340
form = BootSourceSelectionForm(boot_source=boot_source, data=params)
2341
self.assertTrue(form.is_valid(), form._errors)
2342
boot_source_selection = form.save()
2343
self.assertAttributes(boot_source_selection, params)
2346
class TestDeployForm(MAASServerTestCase):
2347
"""Tests for `DeployForm`."""
2349
def test_uses_live_data(self):
2350
# The DeployForm uses the database rather than just relying on
2352
osystem = make_usable_osystem(self)
2353
os_name = osystem.name
2354
release_name = factory.getRandomRelease(osystem)
2355
release_name = "%s/%s" % (os_name, release_name)
2356
deploy_form = DeployForm()
2357
os_choices = deploy_form.fields['default_osystem'].choices
2358
os_names = [name for name, title in os_choices]
2359
release_choices = deploy_form.fields['default_distro_series'].choices
2360
release_names = [name for name, title in release_choices]
2361
self.assertIn(os_name, os_names)
2362
self.assertIn(release_name, release_names)
2364
def test_accepts_new_values(self):
2365
osystem = make_usable_osystem(self)
2366
os_name = osystem.name
2367
release_name = factory.getRandomRelease(osystem)
2369
'default_osystem': os_name,
2370
'default_distro_series': "%s/%s" % (os_name, release_name),
2372
form = DeployForm(data=params)
2373
self.assertTrue(form.is_valid())
2376
class TestLicenseKeyForm(MAASServerTestCase):
2377
"""Tests for `LicenseKeyForm`."""
2379
def make_os_with_license_key(self, osystem=None, has_key=True,
2380
key_is_valid=True, patch_registry=True):
2381
"""Makes a fake operating system that requires a license key, and
2382
validates to key_is_valid."""
2384
osystem = make_usable_osystem(self)
2385
self.patch(osystem, 'requires_license_key').return_value = has_key
2386
self.patch(osystem, 'validate_license_key').return_value = key_is_valid
2389
OperatingSystemRegistry, 'get_item').return_value = osystem
2392
def make_all_osystems_require_key(self, key_is_valid=True):
2393
"""Patches all operating systems in the registry, to require a key."""
2394
for _, osystem in OperatingSystemRegistry:
2396
osystem, 'requires_license_key').return_value = True
2398
osystem, 'validate_license_key').return_value = key_is_valid
2400
def make_only_one_osystem_require_key(self, key_is_valid=True):
2401
"""Patches a random operating system from the registry, to require a
2402
key. Patches the remaining operating systems to not require a key."""
2403
osystem = factory.getRandomOS()
2405
osystem, 'requires_license_key').return_value = True
2407
osystem, 'validate_license_key').return_value = key_is_valid
2408
for _, other_osystem in OperatingSystemRegistry:
2409
if osystem == other_osystem:
2412
other_osystem, 'requires_license_key').return_value = False
2415
def test_creates_license_key(self):
2416
osystem = self.make_os_with_license_key()
2417
series = factory.getRandomRelease(osystem)
2418
key = factory.make_name('key')
2420
'osystem': osystem.name,
2421
'distro_series': series,
2424
data = definition.copy()
2425
data['distro_series'] = '%s/%s' % (osystem.name, series)
2426
form = LicenseKeyForm(data=data)
2428
license_key_obj = LicenseKey.objects.get(
2429
osystem=osystem.name, distro_series=series)
2430
self.assertAttributes(license_key_obj, definition)
2432
def test_updates_license_key(self):
2433
osystem = self.make_os_with_license_key()
2434
series = factory.getRandomRelease(osystem)
2435
license_key = factory.make_license_key(
2436
osystem=osystem.name, distro_series=series,
2437
license_key=factory.make_name('key'))
2438
new_key = factory.make_name('key')
2439
form = LicenseKeyForm(
2440
data={'license_key': new_key}, instance=license_key)
2442
license_key = reload_object(license_key)
2443
self.assertEqual(new_key, license_key.license_key)
2445
def test_validates_license_key(self):
2446
osystem = self.make_os_with_license_key(key_is_valid=False)
2447
series = factory.getRandomRelease(osystem)
2448
license_key = factory.make_license_key(
2449
osystem=osystem.name, distro_series=series,
2450
license_key=factory.make_name('key'))
2451
new_key = factory.make_name('key')
2452
form = LicenseKeyForm(
2453
data={'license_key': new_key}, instance=license_key)
2454
self.assertFalse(form.is_valid(), form.errors)
2456
{'__all__': ['Invalid license key.']},
2459
def test_handles_missing_osystem_in_distro_series(self):
2460
osystem = self.make_os_with_license_key()
2461
series = factory.getRandomRelease(osystem)
2462
key = factory.make_name('key')
2464
'osystem': osystem.name,
2465
'distro_series': series,
2468
form = LicenseKeyForm(data=definition.copy())
2470
license_key_obj = LicenseKey.objects.get(
2471
osystem=osystem.name, distro_series=series)
2472
self.assertAttributes(license_key_obj, definition)
2474
def test_requires_all_fields(self):
2475
form = LicenseKeyForm(data={})
2476
self.assertFalse(form.is_valid(), form.errors)
2477
self.assertItemsEqual(
2478
['osystem', 'distro_series', 'license_key'],
2481
def test_errors_on_not_unique(self):
2482
osystem = self.make_os_with_license_key()
2483
series = factory.getRandomRelease(osystem)
2484
key = factory.make_name('key')
2485
factory.make_license_key(
2486
osystem=osystem.name, distro_series=series, license_key=key)
2488
'osystem': osystem.name,
2489
'distro_series': series,
2492
form = LicenseKeyForm(data=definition)
2493
self.assertFalse(form.is_valid(), form.errors)
2495
'__all__': ['%s %s' % (
2496
"License key with this operating system and distro series",
2497
"already exists.")]},
2500
def test_doesnt_include_default_osystem(self):
2501
form = LicenseKeyForm()
2502
self.assertNotIn(('', 'Default OS'), form.fields['osystem'].choices)
2504
def test_includes_all_osystems(self):
2505
self.make_all_osystems_require_key()
2506
osystems = [osystem for _, osystem in OperatingSystemRegistry]
2508
(osystem.name, osystem.title)
2509
for osystem in osystems
2511
form = LicenseKeyForm()
2512
self.assertItemsEqual(expected, form.fields['osystem'].choices)
2514
def test_includes_all_osystems_sorted(self):
2515
self.make_all_osystems_require_key()
2516
osystems = [osystem for _, osystem in OperatingSystemRegistry]
2517
osystems = sorted(osystems, key=lambda osystem: osystem.title)
2519
(osystem.name, osystem.title)
2520
for osystem in osystems
2522
form = LicenseKeyForm()
2523
self.assertEqual(expected, form.fields['osystem'].choices)
2525
def test_includes_only_osystems_that_require_license_keys(self):
2526
osystem = self.make_only_one_osystem_require_key()
2527
expected = [(osystem.name, osystem.title)]
2528
form = LicenseKeyForm()
2529
self.assertEquals(expected, form.fields['osystem'].choices)
2531
def test_doesnt_include_default_distro_series(self):
2532
form = LicenseKeyForm()
2534
('', 'Default OS Release'), form.fields['distro_series'].choices)
2536
def test_includes_all_distro_series(self):
2537
self.make_all_osystems_require_key()
2538
osystems = [osystem for _, osystem in OperatingSystemRegistry]
2540
for osystem in osystems:
2541
releases = osystem.get_supported_releases()
2542
for name, title in osystem.format_release_choices(releases):
2544
'%s/%s' % (osystem.name, name),
2547
form = LicenseKeyForm()
2548
self.assertItemsEqual(expected, form.fields['distro_series'].choices)
2550
def test_includes_only_distro_series_that_require_license_keys(self):
2551
osystem = self.make_only_one_osystem_require_key()
2552
releases = osystem.get_supported_releases()
2554
('%s/%s' % (osystem.name, name), title)
2555
for name, title in osystem.format_release_choices(releases)
2557
form = LicenseKeyForm()
2558
self.assertEquals(expected, form.fields['distro_series'].choices)