From f149ccb30277c5ed7d6f85cfaab7015eac28623c Mon Sep 17 00:00:00 2001 From: Martin Hauser Date: Mon, 18 May 2026 18:30:44 +0200 Subject: [PATCH] test(tables): Add validation for model table test classes (#22223) Add test ensuring each model-backed table has a corresponding test case inheriting from StandardTableTestCase with correct table attribute set. Includes helper method to import table test classes by model. Fixes #22110 --- netbox/dcim/tests/test_tables.py | 8 ++++ netbox/netbox/tests/test_base_classes.py | 46 ++++++++++++++++++++++ netbox/virtualization/tests/test_tables.py | 4 ++ 3 files changed, 58 insertions(+) diff --git a/netbox/dcim/tests/test_tables.py b/netbox/dcim/tests/test_tables.py index 90de72f7a..b21ab59c3 100644 --- a/netbox/dcim/tests/test_tables.py +++ b/netbox/dcim/tests/test_tables.py @@ -31,6 +31,10 @@ class RackRoleTableTestCase(TableTestCases.StandardTableTestCase): table = RackRoleTable +class RackGroupTableTestCase(TableTestCases.StandardTableTestCase): + table = RackGroupTable + + class RackTypeTableTestCase(TableTestCases.StandardTableTestCase): table = RackTypeTable @@ -171,6 +175,10 @@ class CableTableTestCase(TableTestCases.StandardTableTestCase): table = CableTable +class CableBundleTableTestCase(TableTestCases.StandardTableTestCase): + table = CableBundleTable + + # # Power # diff --git a/netbox/netbox/tests/test_base_classes.py b/netbox/netbox/tests/test_base_classes.py index 5fad1ccd5..cc1ab1de5 100644 --- a/netbox/netbox/tests/test_base_classes.py +++ b/netbox/netbox/tests/test_base_classes.py @@ -52,6 +52,7 @@ from netbox.tables import ( OrganizationalModelTable, PrimaryModelTable, ) +from utilities.testing import TableTestCases class FormClassesTestCase(TestCase): @@ -222,6 +223,15 @@ class TableClassesTestCase(TestCase): model_name = model.__name__ return import_string(f'{app_label}.tables.{model_name}Table') + @staticmethod + def get_table_test_for_model(model): + """ + Import and return the table test class for a given model. + """ + app_label = model._meta.app_label + model_name = model.__name__ + return import_string(f'{app_label}.tests.test_tables.{model_name}TableTestCase') + @staticmethod def get_model_table_base_class(model): """ @@ -255,6 +265,42 @@ class TableClassesTestCase(TestCase): f"{table}.Meta does not inherit from {base_class}.Meta", ) + def test_model_table_test_classes(self): + """ + Check that each model-backed table has a standard table test case. + """ + for model in apps.get_models(): + if self.get_model_table_base_class(model) is None: + continue + + with self.subTest(model=model.__name__): + app_label = model._meta.app_label + model_name = model.__name__ + try: + table = self.get_table_for_model(model) + except ImportError: + self.fail( + f"No table class found for {model_name} " + f"(expected {app_label}.tables.{model_name}Table)" + ) + try: + table_test = self.get_table_test_for_model(model) + except ImportError: + self.fail( + f"No table test case found for {model_name} " + f"(expected {app_label}.tests.test_tables.{model_name}TableTestCase)" + ) + + self.assertTrue( + issubclass(table_test, TableTestCases.StandardTableTestCase), + f"{table_test} does not inherit from {TableTestCases.StandardTableTestCase}", + ) + self.assertIs( + table_test.table, + table, + f"{table_test}.table is not set to {table}", + ) + class SerializerClassesTestCase(TestCase): diff --git a/netbox/virtualization/tests/test_tables.py b/netbox/virtualization/tests/test_tables.py index 26ab03062..2a233447f 100644 --- a/netbox/virtualization/tests/test_tables.py +++ b/netbox/virtualization/tests/test_tables.py @@ -14,6 +14,10 @@ class ClusterTableTestCase(TableTestCases.StandardTableTestCase): table = ClusterTable +class VirtualMachineTypeTableTestCase(TableTestCases.StandardTableTestCase): + table = VirtualMachineTypeTable + + class VirtualMachineTableTestCase(TableTestCases.StandardTableTestCase): table = VirtualMachineTable