Bläddra i källkod

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
bctiemann 2 månader sedan
förälder
incheckning
2699149016
2 ändrade filer med 10 tillägg och 3 borttagningar
  1. 3 0
      netbox/ipam/tests/test_api.py
  2. 7 3
      netbox/utilities/testing/base.py

+ 3 - 0
netbox/ipam/tests/test_api.py

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

+ 7 - 3
netbox/utilities/testing/base.py

@@ -141,8 +141,8 @@ class ModelTestCase(TestCase):
             elif value and type(field) is GenericForeignKey:
                 model_dict[key] = value.pk
 
+            # Handle API output
             elif api:
-
                 # Replace ContentType numeric IDs with <app_label>.<model>
                 if type(getattr(instance, key)) in (ContentType, ObjectType):
                     object_type = ObjectType.objects.get(pk=value)
@@ -152,9 +152,13 @@ class ModelTestCase(TestCase):
                 elif type(value) is IPNetwork:
                     model_dict[key] = str(value)
 
-            else:
-                field = instance._meta.get_field(key)
+                # Normalize arrays of numeric ranges (e.g. VLAN IDs or port ranges).
+                # 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
                 if type(field) is ArrayField:
                     if getattr(field.base_field, 'choices', None):