Merge pull request #20963 from pheus/20491-normalize-arrayfield-values-to-inclusive-pairs-for-api-tests

Fixes #20491: Normalize numeric range array fields for API test comparisons
This commit is contained in:
bctiemann
2025-12-16 15:40:44 -05:00
committed by GitHub
2 changed files with 10 additions and 3 deletions

View File

@@ -1071,14 +1071,17 @@ class VLANGroupTest(APIViewTestCases.APIViewTestCase):
{ {
'name': 'VLAN Group 4', 'name': 'VLAN Group 4',
'slug': 'vlan-group-4', 'slug': 'vlan-group-4',
'vid_ranges': [[1, 4094]]
}, },
{ {
'name': 'VLAN Group 5', 'name': 'VLAN Group 5',
'slug': 'vlan-group-5', 'slug': 'vlan-group-5',
'vid_ranges': [[1, 4094]]
}, },
{ {
'name': 'VLAN Group 6', 'name': 'VLAN Group 6',
'slug': 'vlan-group-6', 'slug': 'vlan-group-6',
'vid_ranges': [[1, 4094]]
}, },
] ]
bulk_update_data = { bulk_update_data = {

View File

@@ -141,8 +141,8 @@ class ModelTestCase(TestCase):
elif value and type(field) is GenericForeignKey: elif value and type(field) is GenericForeignKey:
model_dict[key] = value.pk model_dict[key] = value.pk
# Handle API output
elif api: elif api:
# Replace ContentType numeric IDs with <app_label>.<model> # Replace ContentType numeric IDs with <app_label>.<model>
if type(getattr(instance, key)) in (ContentType, ObjectType): if type(getattr(instance, key)) in (ContentType, ObjectType):
object_type = ObjectType.objects.get(pk=value) object_type = ObjectType.objects.get(pk=value)
@@ -152,9 +152,13 @@ class ModelTestCase(TestCase):
elif type(value) is IPNetwork: elif type(value) is IPNetwork:
model_dict[key] = str(value) model_dict[key] = str(value)
else: # Normalize arrays of numeric ranges (e.g. VLAN IDs or port ranges).
field = instance._meta.get_field(key) # DB uses canonical half-open [lo, hi) via NumericRange; API uses inclusive [lo, hi].
# Convert to inclusive pairs for stable API comparisons.
elif type(field) is ArrayField and issubclass(type(field.base_field), RangeField):
model_dict[key] = [[r.lower, r.upper - 1] for r in value]
else:
# Convert ArrayFields to CSV strings # Convert ArrayFields to CSV strings
if type(field) is ArrayField: if type(field) is ArrayField:
if getattr(field.base_field, 'choices', None): if getattr(field.base_field, 'choices', None):