|
@@ -862,6 +862,10 @@ class PrefixTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
self.assertEqual(self.filterset({'present_in_vrf': vrf1.rd}, self.queryset).qs.count(), 6)
|
|
self.assertEqual(self.filterset({'present_in_vrf': vrf1.rd}, self.queryset).qs.count(), 6)
|
|
|
self.assertEqual(self.filterset({'present_in_vrf': vrf2.rd}, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset({'present_in_vrf': vrf2.rd}, self.queryset).qs.count(), 2)
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ for params in ({'present_in_vrf_id': 'null'}, {'present_in_vrf': 'null'}):
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid(), msg=params)
|
|
|
|
|
+
|
|
|
def test_region(self):
|
|
def test_region(self):
|
|
|
regions = Region.objects.all()[:2]
|
|
regions = Region.objects.all()[:2]
|
|
|
params = {'region_id': [regions[0].pk, regions[1].pk]}
|
|
params = {'region_id': [regions[0].pk, regions[1].pk]}
|
|
@@ -1448,6 +1452,22 @@ class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'vrf': [vrfs[0].rd, vrfs[1].rd]}
|
|
params = {'vrf': [vrfs[0].rd, vrfs[1].rd]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4)
|
|
|
|
|
|
|
|
|
|
+ def test_present_in_vrf(self):
|
|
|
|
|
+ """Match addresses in the VRF or in a VRF exporting one of its import targets."""
|
|
|
|
|
+ vrf1 = VRF.objects.get(name='VRF 1')
|
|
|
|
|
+ vrf2 = VRF.objects.get(name='VRF 2')
|
|
|
|
|
+ route_target = RouteTarget.objects.create(name='65000:200')
|
|
|
|
|
+ vrf1.import_targets.add(route_target)
|
|
|
|
|
+ vrf2.export_targets.add(route_target)
|
|
|
|
|
+ self.assertEqual(self.filterset({'present_in_vrf_id': vrf1.pk}, self.queryset).qs.count(), 4)
|
|
|
|
|
+ self.assertEqual(self.filterset({'present_in_vrf_id': vrf2.pk}, self.queryset).qs.count(), 2)
|
|
|
|
|
+ self.assertEqual(self.filterset({'present_in_vrf': vrf1.rd}, self.queryset).qs.count(), 4)
|
|
|
|
|
+ self.assertEqual(self.filterset({'present_in_vrf': vrf2.rd}, self.queryset).qs.count(), 2)
|
|
|
|
|
+
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ for params in ({'present_in_vrf_id': 'null'}, {'present_in_vrf': 'null'}):
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid(), msg=params)
|
|
|
|
|
+
|
|
|
def test_device(self):
|
|
def test_device(self):
|
|
|
devices = Device.objects.all()[:2]
|
|
devices = Device.objects.all()[:2]
|
|
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
|
params = {'device_id': [devices[0].pk, devices[1].pk]}
|
|
@@ -1620,6 +1640,10 @@ class FHRPGroupTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'related_ip': [ipaddresses[0].pk, ipaddresses[1].pk]}
|
|
params = {'related_ip': [ipaddresses[0].pk, ipaddresses[1].pk]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2)
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ for params in ({'related_ip': ['null']}, {'related_ip': [ipaddresses[0].pk, 'null']}):
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid(), msg=params)
|
|
|
|
|
+
|
|
|
|
|
|
|
|
class FHRPGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
class FHRPGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
queryset = FHRPGroupAssignment.objects.all()
|
|
queryset = FHRPGroupAssignment.objects.all()
|
|
@@ -2296,6 +2320,10 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
[2001, 2002, 2003, 3001, 3002, 3003]
|
|
[2001, 2002, 2003, 3001, 3002, 3003]
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ for params in ({'related_to_site': ['null']}, {'related_to_site': [site.pk, 'null']}):
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid(), msg=params)
|
|
|
|
|
+
|
|
|
def test_related_to_site_matches_any_of_several_sites(self):
|
|
def test_related_to_site_matches_any_of_several_sites(self):
|
|
|
"""Several sites spanning two site groups are ORed together, and a shared VLAN comes back once."""
|
|
"""Several sites spanning two site groups are ORed together, and a shared VLAN comes back once."""
|
|
|
sites = (
|
|
sites = (
|
|
@@ -2365,6 +2393,10 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'related_to_site__n': [site.pk]}
|
|
params = {'related_to_site__n': [site.pk]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), self.queryset.count() - 2)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), self.queryset.count() - 2)
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ for params in ({'related_to_site__n': ['null']}, {'related_to_site__n': [site.pk, 'null']}):
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid(), msg=params)
|
|
|
|
|
+
|
|
|
def test_related_to_site_resolves_site_groups_in_constant_queries(self):
|
|
def test_related_to_site_resolves_site_groups_in_constant_queries(self):
|
|
|
"""The query count is constant in the number of sites, and drops to one without groups."""
|
|
"""The query count is constant in the number of sites, and drops to one without groups."""
|
|
|
sites = list(Site.objects.filter(slug__in=('site-1', 'site-2', 'site-3')))
|
|
sites = list(Site.objects.filter(slug__in=('site-1', 'site-2', 'site-3')))
|
|
@@ -2459,6 +2491,10 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'available_on_device': device_id}
|
|
params = {'available_on_device': device_id}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) # 5 scoped + 1 global group + 1 global
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) # 5 scoped + 1 global group + 1 global
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ params = {'available_on_device': 'null'}
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid())
|
|
|
|
|
+
|
|
|
def test_available_on_device_cluster_scopes(self):
|
|
def test_available_on_device_cluster_scopes(self):
|
|
|
device = Device.objects.get(name='Device 1')
|
|
device = Device.objects.get(name='Device 1')
|
|
|
device.cluster = Cluster.objects.get(name='Cluster 1')
|
|
device.cluster = Cluster.objects.get(name='Cluster 1')
|
|
@@ -2487,16 +2523,28 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
params = {'available_on_virtualmachine': vm_id}
|
|
params = {'available_on_virtualmachine': vm_id}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8) # 6 scoped + 1 global group + 1 global
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8) # 6 scoped + 1 global group + 1 global
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ params = {'available_on_virtualmachine': 'null'}
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid())
|
|
|
|
|
+
|
|
|
def test_available_at_site(self):
|
|
def test_available_at_site(self):
|
|
|
site_id = Site.objects.first().pk
|
|
site_id = Site.objects.first().pk
|
|
|
params = {'available_at_site': site_id}
|
|
params = {'available_at_site': site_id}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5) # 4 scoped + 1 global group + 1 global
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5) # 4 scoped + 1 global group + 1 global
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ params = {'available_at_site': 'null'}
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid())
|
|
|
|
|
+
|
|
|
def test_available_at_site_group(self):
|
|
def test_available_at_site_group(self):
|
|
|
site_group = SiteGroup.objects.get(name='Site Group 1')
|
|
site_group = SiteGroup.objects.get(name='Site Group 1')
|
|
|
params = {'available_at_site_group': site_group.pk}
|
|
params = {'available_at_site_group': site_group.pk}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) # 1 scoped + 1 global group + 1 global
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) # 1 scoped + 1 global group + 1 global
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ params = {'available_at_site_group': 'null'}
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid())
|
|
|
|
|
+
|
|
|
def test_interface(self):
|
|
def test_interface(self):
|
|
|
interface_id = Interface.objects.first().pk
|
|
interface_id = Interface.objects.first().pk
|
|
|
params = {'interface_id': interface_id}
|
|
params = {'interface_id': interface_id}
|
|
@@ -2522,6 +2570,10 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
self.assertEqual(qs.count(), 2)
|
|
self.assertEqual(qs.count(), 2)
|
|
|
self.assertEqual(len(qs), len(set(qs.values_list('pk', flat=True))))
|
|
self.assertEqual(len(qs), len(set(qs.values_list('pk', flat=True))))
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ params = {'interface_id': 'null'}
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid())
|
|
|
|
|
+
|
|
|
def test_vminterface(self):
|
|
def test_vminterface(self):
|
|
|
vminterface_id = VMInterface.objects.first().pk
|
|
vminterface_id = VMInterface.objects.first().pk
|
|
|
params = {'vminterface_id': vminterface_id}
|
|
params = {'vminterface_id': vminterface_id}
|
|
@@ -2546,6 +2598,10 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTestMixin):
|
|
|
self.assertEqual(qs.count(), 2)
|
|
self.assertEqual(qs.count(), 2)
|
|
|
self.assertEqual(len(qs), len(set(qs.values_list('pk', flat=True))))
|
|
self.assertEqual(len(qs), len(set(qs.values_list('pk', flat=True))))
|
|
|
|
|
|
|
|
|
|
+ # Reject invalid filter values
|
|
|
|
|
+ params = {'vminterface_id': 'null'}
|
|
|
|
|
+ self.assertFalse(self.filterset(params, self.queryset).is_valid())
|
|
|
|
|
+
|
|
|
def test_qinq_role(self):
|
|
def test_qinq_role(self):
|
|
|
params = {'qinq_role': [VLANQinQRoleChoices.ROLE_SERVICE, VLANQinQRoleChoices.ROLE_CUSTOMER]}
|
|
params = {'qinq_role': [VLANQinQRoleChoices.ROLE_SERVICE, VLANQinQRoleChoices.ROLE_CUSTOMER]}
|
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
|
|
self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6)
|