From 38c3e73dd20bdbc006d5d9a8413de887d7787480 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 18 Feb 2026 09:34:22 -0500 Subject: [PATCH] Add a test for dynamic table prefetching --- netbox/netbox/tests/test_tables.py | 47 ++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/netbox/netbox/tests/test_tables.py b/netbox/netbox/tests/test_tables.py index 17b9743cd..730874c49 100644 --- a/netbox/netbox/tests/test_tables.py +++ b/netbox/netbox/tests/test_tables.py @@ -1,9 +1,50 @@ from django.template import Context, Template -from django.test import TestCase +from django.test import RequestFactory, TestCase -from dcim.models import Site +from dcim.models import Device, Site +from dcim.tables import DeviceTable from netbox.tables import NetBoxTable, columns -from utilities.testing import create_tags +from utilities.testing import create_tags, create_test_device, create_test_user + + +class BaseTableTest(TestCase): + + @classmethod + def setUpTestData(cls): + create_test_device('Test Device 1') + cls.user = create_test_user('testuser') + + def test_prefetch_visible_columns(self): + """ + Verify that the table queryset's prefetch_related lookups correspond to the user's + visible column preferences. Columns referencing related fields should only be + prefetched when those columns are visible. + """ + request = RequestFactory().get('/') + request.user = self.user + + # Scenario 1: 'rack' (simple FK) and 'region' (nested accessor: site__region) are visible + self.user.config.set( + 'tables.DeviceTable.columns', + ['name', 'status', 'site', 'rack', 'region'], + commit=True, + ) + table = DeviceTable(Device.objects.all()) + table.configure(request) + prefetch_lookups = table.data.data._prefetch_related_lookups + self.assertIn('rack', prefetch_lookups) + self.assertIn('site__region', prefetch_lookups) + + # Scenario 2: Local fields only; no prefetching + self.user.config.set( + 'tables.DeviceTable.columns', + ['name', 'status', 'description'], + commit=True, + ) + table = DeviceTable(Device.objects.all()) + table.configure(request) + prefetch_lookups = table.data.data._prefetch_related_lookups + self.assertEqual(prefetch_lookups, tuple()) class TagColumnTable(NetBoxTable):