diff --git a/netbox/dcim/api/serializers_/roles.py b/netbox/dcim/api/serializers_/roles.py index 38084e03b..a066b69df 100644 --- a/netbox/dcim/api/serializers_/roles.py +++ b/netbox/dcim/api/serializers_/roles.py @@ -15,7 +15,7 @@ __all__ = ( class DeviceRoleGroupSerializer(NestedGroupModelSerializer): parent = NestedDeviceRoleGroupSerializer(required=False, allow_null=True) - tenant_count = serializers.IntegerField(read_only=True, default=0) + role_count = serializers.IntegerField(read_only=True, default=0) class Meta: model = DeviceRoleGroup diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 807ac77d4..8dfb90482 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1147,6 +1147,66 @@ class InventoryItemTemplateTest(APIViewTestCases.APIViewTestCase): ] +class DeviceRoleGroupTest(APIViewTestCases.APIViewTestCase): + model = DeviceRoleGroup + brief_fields = ['_depth', 'description', 'display', 'id', 'name', 'slug', 'role_count', 'url'] + bulk_update_data = { + 'description': 'New description', + 'comments': 'New Comment', + } + + @classmethod + def setUpTestData(cls): + + parent_device_role_groups = ( + DeviceRoleGroup.objects.create( + name='Parent Device Role Group 1', + slug='parent-device-role-group-1' + ), + DeviceRoleGroup.objects.create( + name='Parent Device Role Group 2', + slug='parent-device-role-group-2', + comments='Parent Group 2 comment', + ), + ) + + DeviceRoleGroup.objects.create( + name='Device Role Group 1', + slug='device-role-group-1', + parent=parent_device_role_groups[0] + ) + DeviceRoleGroup.objects.create( + name='Device Role Group 2', + slug='device_role-group-2', + parent=parent_device_role_groups[0] + ) + DeviceRoleGroup.objects.create( + name='Device Role Group 3', + slug='device-role-group-3', + parent=parent_device_role_groups[0], + comments='Device Role Group 3 comment' + ) + + cls.create_data = [ + { + 'name': 'Device Role Group 4', + 'slug': 'device-role-group-4', + 'parent': parent_device_role_groups[1].pk, + }, + { + 'name': 'Device Role Group 5', + 'slug': 'device-role-group-5', + 'parent': parent_device_role_groups[1].pk, + }, + { + 'name': 'Device Role Group 6', + 'slug': 'device-role-group-6', + 'parent': parent_device_role_groups[1].pk, + 'comments': 'Device Role Group 6 comment', + }, + ] + + class DeviceRoleTest(APIViewTestCases.APIViewTestCase): model = DeviceRole brief_fields = ['description', 'device_count', 'display', 'id', 'name', 'slug', 'url', 'virtualmachine_count'] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 0c4bbbaff..e3b9108f5 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -2168,6 +2168,100 @@ class InventoryItemTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTe self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class DeviceRoleGroupTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = DeviceRoleGroup.objects.all() + filterset = DeviceRoleGroupFilterSet + + @classmethod + def setUpTestData(cls): + + parent_device_role_groups = ( + DeviceRoleGroup(name='Device Role Group 1', slug='device-role-group-1'), + DeviceRoleGroup( + name='Device Role Group 2', + slug='device-role-group-2', + comments='Parent group 2 comment' + ), + DeviceRoleGroup(name='Device Role Group 3', slug='device-role-group-3'), + ) + for device_role_group in parent_device_role_groups: + device_role_group.save() + + device_role_groups = ( + DeviceRoleGroup( + name='Device Role Group 1A', + slug='device-role-group-1a', + parent=parent_device_role_groups[0], + description='foobar1', + comments='Device Role Group 1A comment', + ), + DeviceRoleGroup( + name='Device Role Group 2A', + slug='device-role-group-2a', + parent=parent_device_role_groups[1], + description='foobar2' + ), + DeviceRoleGroup( + name='Device Role Group 3A', + slug='device-role-group-3a', + parent=parent_device_role_groups[2], + description='foobar3' + ), + ) + for device_role_group in device_role_groups: + device_role_group.save() + + child_device_role_groups = ( + DeviceRoleGroup(name='Device Role Group 1A1', slug='device-role-group-1a1', parent=device_role_groups[0]), + DeviceRoleGroup(name='Device Role Group 2A1', slug='device-role-group-2a1', parent=device_role_groups[1]), + DeviceRoleGroup( + name='Device Role Group 3A1', + slug='device-role-group-3a1', + parent=device_role_groups[2], + comments='Device Role Group 3A1 comment', + ), + ) + for device_role_group in child_device_role_groups: + device_role_group.save() + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_q_comments(self): + params = {'q': 'parent'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + params = {'q': 'comment'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_name(self): + params = {'name': ['Tenant Group 1', 'Tenant Group 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_slug(self): + params = {'slug': ['tenant-group-1', 'tenant-group-2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_parent(self): + tenant_groups = TenantGroup.objects.filter(parent__isnull=True)[:2] + params = {'parent_id': [tenant_groups[0].pk, tenant_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'parent': [tenant_groups[0].slug, tenant_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_ancestor(self): + tenant_groups = TenantGroup.objects.filter(parent__isnull=True)[:2] + params = {'ancestor_id': [tenant_groups[0].pk, tenant_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + params = {'ancestor': [tenant_groups[0].slug, tenant_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + class DeviceRoleTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = DeviceRole.objects.all() filterset = DeviceRoleFilterSet diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 83effa188..2339ffe9d 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -1688,6 +1688,57 @@ class InventoryItemTemplateTestCase(ViewTestCases.DeviceComponentTemplateViewTes } +class DeviceRoleGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): + model = DeviceRoleGroup + + @classmethod + def setUpTestData(cls): + + device_role_groups = ( + DeviceRoleGroup(name='Device Role Group 1', slug='device-role-group-1'), + DeviceRoleGroup( + name='Device Role Group 2', + slug='device-role-group-2', + comments='Device Role Group 2 comment' + ), + DeviceRoleGroup( + name='Device Role Group 3', + slug='device-role-group-3', + ), + ) + for device_role_group in device_role_groups: + device_role_group.save() + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Device Role Group X', + 'slug': 'device-role-group-x', + 'description': 'A new device role group', + 'tags': [t.pk for t in tags], + 'comments': 'Device Role Group X comment', + } + + cls.csv_data = ( + "name,slug,description,comments", + "Device Role Group 4,device-role-group-4,Fourth device role group,", + "Device Role Group 5,device-role-group-5,Fifth device role group,", + "Device Role Group 6,device-role-group-6,Sixth device role group,Sixth device role group comment", + ) + + cls.csv_update_data = ( + "id,name,description,comments", + f"{device_role_groups[0].pk},Device Role Group 7,Fourth device role group7,Group 7 comment", + f"{device_role_groups[1].pk},Device Role Group 8,Fifth device role group8,", + f"{device_role_groups[2].pk},Device Role Group 0,Sixth device role group9,", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + 'comments': 'New comment', + } + + class DeviceRoleTestCase(ViewTestCases.OrganizationalObjectViewTestCase): model = DeviceRole