diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9a7220c21..340c2f4f3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -122,6 +122,10 @@ jobs: python -m pip install --upgrade pip pip install -r requirements.txt pip install coverage tblib + # dulwich is the optional 'git' extra, so it is absent from requirements.txt. + # The Git data backend tests mock dulwich.porcelain.clone and only need the + # module to be importable; without it they skip silently. + pip install dulwich - name: Check for missing migrations run: python netbox/manage.py makemigrations --check diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 81d609847..3fe724b6b 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -23,6 +23,9 @@ class ProviderTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'comments': 'New comments', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -79,6 +82,9 @@ class CircuitTypeTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -97,6 +103,9 @@ class CircuitTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'planned', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('circuits.view_provider', 'circuits.view_circuittype') @classmethod @@ -215,6 +224,9 @@ class CircuitTerminationTestCase(APIViewTestCases.APIViewTestCase): cls.bulk_update_data = { 'port_speed': 123456 } + cls.bulk_update_invalid_data = { + 'term_side': 'not-a-valid-term-side', + } class CircuitGroupTestCase(APIViewTestCases.APIViewTestCase): @@ -223,6 +235,9 @@ class CircuitGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'tenant': 99999, + } @classmethod def setUpTestData(cls): @@ -291,6 +306,9 @@ class ProviderAccountTestCase(APIViewTestCases.APIViewTestCase): 'provider': providers[1].pk, 'description': 'New description', } + cls.bulk_update_invalid_data = { + 'provider': 99999, + } class CircuitGroupAssignmentTestCase(APIViewTestCases.APIViewTestCase): @@ -299,6 +317,9 @@ class CircuitGroupAssignmentTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, } + bulk_update_invalid_data = { + 'priority': 'not-a-valid-priority', + } user_permissions = ('circuits.view_circuit', 'circuits.view_circuitgroup') @classmethod @@ -407,6 +428,9 @@ class ProviderNetworkTestCase(APIViewTestCases.APIViewTestCase): 'provider': providers[1].pk, 'description': 'New description', } + cls.bulk_update_invalid_data = { + 'provider': 99999, + } class VirtualCircuitTypeTestCase(APIViewTestCases.APIViewTestCase): @@ -429,6 +453,9 @@ class VirtualCircuitTypeTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -447,6 +474,9 @@ class VirtualCircuitTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'planned', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -511,6 +541,9 @@ class VirtualCircuitTerminationTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'role': 'not-a-valid-role', + } @classmethod def setUpTestData(cls): diff --git a/netbox/core/tests/test_api.py b/netbox/core/tests/test_api.py index 0c852636b..bf3d03c30 100644 --- a/netbox/core/tests/test_api.py +++ b/netbox/core/tests/test_api.py @@ -35,6 +35,9 @@ class DataSourceTestCase(APIViewTestCases.APIViewTestCase): 'enabled': False, 'description': 'foo bar baz', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 3e7287597..cbe24b9f6 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -106,6 +106,9 @@ class RegionTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'comments': 'New comments', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -139,6 +142,9 @@ class SiteGroupTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'comments': 'I do exist!', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -973,6 +979,9 @@ class LocationTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_site',) graphql_filter_tests = ( GraphQLFilterTest( @@ -1095,6 +1104,9 @@ class RackGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -1130,6 +1142,9 @@ class RackRoleTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -1150,6 +1165,9 @@ class RackTypeTestCase(APIViewTestCases.APIViewTestCase): 'cooling_capability': RackCoolingCapabilityChoices.CAPABILITY_HYBRID, 'cooling_capacity': 50, } + bulk_update_invalid_data = { + 'form_factor': 'not-a-valid-form-factor', + } user_permissions = ('dcim.view_manufacturer',) @classmethod @@ -1235,6 +1253,9 @@ class RackTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'planned', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_site', ) @classmethod @@ -1361,6 +1382,9 @@ class RackReservationTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_rack', 'users.view_user') @classmethod @@ -1450,6 +1474,9 @@ class ManufacturerTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -1469,6 +1496,9 @@ class DeviceTypeTestCase(APIViewTestCases.APIViewTestCase): 'part_number': 'ABC123', 'end_of_life': '2030-01-01', } + bulk_update_invalid_data = { + 'airflow': 'not-a-valid-airflow', + } user_permissions = ('dcim.view_manufacturer', ) @classmethod @@ -1517,6 +1547,9 @@ class ModuleTypeTestCase(APIViewTestCases.APIViewTestCase): 'part_number': 'ABC123', 'end_of_life': '2030-01-01', } + bulk_update_invalid_data = { + 'airflow': 'not-a-valid-airflow', + } user_permissions = ('dcim.view_manufacturer', ) @classmethod @@ -1606,6 +1639,9 @@ class ModuleTypeProfileTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'comments': 'New comments', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -1632,6 +1668,9 @@ class ModuleBayTypeTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -1673,6 +1712,9 @@ class ConsolePortTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } @classmethod def setUpTestData(cls): @@ -1717,6 +1759,9 @@ class ConsoleServerPortTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } @classmethod def setUpTestData(cls): @@ -1761,6 +1806,9 @@ class PowerPortTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } @classmethod def setUpTestData(cls): @@ -1805,6 +1853,9 @@ class PowerOutletTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } user_permissions = ('dcim.view_devicetype', ) @classmethod @@ -1863,6 +1914,9 @@ class InterfaceTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'poe_mode': 'not-a-valid-poe-mode', + } @classmethod def setUpTestData(cls): @@ -1928,6 +1982,9 @@ class FrontPortTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } user_permissions = ('dcim.view_rearporttemplate', ) @classmethod @@ -2045,6 +2102,9 @@ class RearPortTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -2161,6 +2221,9 @@ class ModuleBayTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'device_type': 99999, + } user_permissions = ('dcim.view_devicetype', ) @classmethod @@ -2213,6 +2276,9 @@ class DeviceBayTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'device_type': 99999, + } user_permissions = ('dcim.view_devicetype', ) @classmethod @@ -2255,6 +2321,9 @@ class InventoryItemTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'role': 99999, + } user_permissions = ('dcim.view_devicetype', 'dcim.view_manufacturer',) @classmethod @@ -2334,6 +2403,9 @@ class DeviceRoleTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -2365,6 +2437,9 @@ class PlatformTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -2384,6 +2459,9 @@ class DeviceTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'failed', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ( 'dcim.view_site', 'dcim.view_rack', 'dcim.view_location', 'dcim.view_devicerole', 'dcim.view_devicetype', ) @@ -2843,6 +2921,9 @@ class ModuleTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'serial': '1234ABCD', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ( 'dcim.view_modulebay', 'dcim.view_moduletype', 'dcim.view_moduletypeprofile', 'dcim.view_device' ) @@ -3339,6 +3420,9 @@ class ConsolePortTestCase(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTe bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } peer_termination_type = ConsoleServerPort user_permissions = ('dcim.view_device', ) @@ -3382,6 +3466,9 @@ class ConsoleServerPortTestCase(Mixins.ComponentTraceMixin, APIViewTestCases.API bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } peer_termination_type = ConsolePort user_permissions = ('dcim.view_device', ) @@ -3425,6 +3512,9 @@ class PowerPortTestCase(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTest bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } peer_termination_type = PowerOutlet user_permissions = ('dcim.view_device', ) @@ -3465,6 +3555,9 @@ class PowerOutletTestCase(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTe bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } peer_termination_type = PowerPort user_permissions = ('dcim.view_device', ) @@ -3514,6 +3607,9 @@ class InterfaceTestCase(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTest bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'poe_mode': 'not-a-valid-poe-mode', + } peer_termination_type = Interface user_permissions = ('dcim.view_device', ) @@ -4073,6 +4169,9 @@ class FrontPortTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } peer_termination_type = Interface user_permissions = ('dcim.view_device', 'dcim.view_rearport') @@ -4192,6 +4291,9 @@ class RearPortTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } peer_termination_type = Interface user_permissions = ('dcim.view_device', ) @@ -4308,6 +4410,9 @@ class ModuleBayTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } user_permissions = ('dcim.view_device', ) @classmethod @@ -4439,6 +4544,9 @@ class DeviceBayTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } user_permissions = ('dcim.view_device', ) @classmethod @@ -4503,6 +4611,9 @@ class InventoryItemTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_device', 'dcim.view_manufacturer') @classmethod @@ -4587,6 +4698,9 @@ class InventoryItemRoleTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -4610,6 +4724,9 @@ class CableBundleTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -4660,6 +4777,9 @@ class CableTestCase(APIViewTestCases.APIViewTestCase): 'length': 100, 'length_unit': 'm', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } # TODO: Allow updating cable terminations test_update_object = None @@ -5116,6 +5236,9 @@ class VirtualChassisTestCase(APIViewTestCases.APIViewTestCase): 'domain': 'newdomain', 'master': None } + cls.bulk_update_invalid_data = { + 'owner': 99999, + } class PowerPanelTestCase(APIViewTestCases.APIViewTestCase): @@ -5166,6 +5289,9 @@ class PowerPanelTestCase(APIViewTestCases.APIViewTestCase): 'site': sites[1].pk, 'location': locations[3].pk } + cls.bulk_update_invalid_data = { + 'owner': 99999, + } class PowerFeedTestCase(APIViewTestCases.APIViewTestCase): @@ -5174,6 +5300,9 @@ class PowerFeedTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'planned', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_powerpanel', ) @classmethod @@ -5230,6 +5359,9 @@ class CoolingIntakeTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } @classmethod def setUpTestData(cls): @@ -5275,6 +5407,9 @@ class CoolingOutflowTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } user_permissions = ('dcim.view_devicetype', ) @classmethod @@ -5334,6 +5469,9 @@ class CoolingIntakeTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } user_permissions = ('dcim.view_device', ) @classmethod @@ -5378,6 +5516,9 @@ class CoolingOutflowTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'type': 'not-a-valid-type', + } user_permissions = ('dcim.view_device', ) @classmethod @@ -5481,6 +5622,9 @@ class CoolingSourceTestCase(APIViewTestCases.APIViewTestCase): 'site': sites[1].pk, 'location': locations[3].pk } + cls.bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } class CoolingFeedTestCase(APIViewTestCases.APIViewTestCase): @@ -5489,6 +5633,9 @@ class CoolingFeedTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'planned', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_coolingsource', ) @classmethod @@ -5550,6 +5697,9 @@ class VirtualDeviceContextTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'planned', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -5673,6 +5823,9 @@ class MACAddressTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index 6123dcc36..72454126e 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -62,6 +62,9 @@ class WebhookTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'ssl_verification': False, } + bulk_update_invalid_data = { + 'http_method': 'not-a-valid-http-method', + } @classmethod def setUpTestData(cls): @@ -90,6 +93,9 @@ class EventRuleTestCase(APIViewTestCases.APIViewTestCase): 'enabled': False, 'description': 'New description', } + bulk_update_invalid_data = { + 'action_type': 'not-a-valid-action-type', + } update_data = { 'name': 'Event Rule X', 'enabled': False, @@ -308,6 +314,9 @@ class CustomFieldTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'nulls_first': False, } + bulk_update_invalid_data = { + 'filter_logic': 'not-a-valid-filter-logic', + } update_data = { 'object_types': ['dcim.device'], 'name': 'New_Name', @@ -377,6 +386,9 @@ class CustomFieldChoiceSetTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'base_choices': 'not-a-valid-base-choices', + } update_data = { 'name': 'Choice Set X', 'extra_choices': [ @@ -577,6 +589,9 @@ class CustomLinkTestCase(APIViewTestCases.APIViewTestCase): 'new_window': True, 'enabled': False, } + bulk_update_invalid_data = { + 'button_class': 'not-a-valid-button-class', + } @classmethod def setUpTestData(cls): @@ -661,6 +676,9 @@ class SavedFilterTestCase(SharedObjectAPITestMixin, APIViewTestCases.APIViewTest 'enabled': False, 'shared': False, } + bulk_update_invalid_data = { + 'object_types': ['dcim.notamodel'], + } @classmethod def setUpTestData(cls): @@ -753,6 +771,9 @@ class TableConfigTestCase(SharedObjectAPITestMixin, APIViewTestCases.APIViewTest 'enabled': False, 'shared': False, } + bulk_update_invalid_data = { + 'object_type': 'dcim.notamodel', + } @classmethod def setUpTestData(cls): @@ -942,6 +963,9 @@ class ExportTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'object_types': ['dcim.notamodel'], + } @classmethod def setUpTestData(cls): @@ -989,6 +1013,9 @@ class TagTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'color': 'not-a-color', + } @classmethod def setUpTestData(cls): @@ -1083,6 +1110,9 @@ class JournalEntryTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'comments': 'Overwritten', } + bulk_update_invalid_data = { + 'kind': 'not-a-valid-kind', + } @classmethod def setUpTestData(cls): @@ -1169,6 +1199,9 @@ class ConfigContextProfileTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'data_source': 99999, + } @classmethod def setUpTestData(cls): @@ -1281,6 +1314,9 @@ class ConfigContextTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'data_source': 99999, + } @classmethod def setUpTestData(cls): @@ -1411,6 +1447,9 @@ class ConfigTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'data_source': 99999, + } @classmethod def setUpTestData(cls): @@ -2226,6 +2265,9 @@ class SubscriptionTestCase(APIViewTestCases.APIViewTestCase): cls.bulk_update_data = { 'user': users[3].pk, } + cls.bulk_update_invalid_data = { + 'object_type': 'dcim.notamodel', + } class NotificationGroupTestCase(APIViewTestCases.APIViewTestCase): @@ -2257,6 +2299,9 @@ class NotificationGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'users': [99999], + } @classmethod def setUpTestData(cls): @@ -2311,6 +2356,9 @@ class NotificationTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'read': now(), } + bulk_update_invalid_data = { + 'event_type': 'not-a-valid-event-type', + } graphql_filter = { 'event_type': {'lookup': 'exact', 'value': OBJECT_CREATED}, } diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 2b04945fb..53b22f4fb 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -30,6 +30,9 @@ class ASNRangeTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -142,6 +145,9 @@ class ASNTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -220,6 +226,9 @@ class VRFTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -263,6 +272,9 @@ class RouteTargetTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -295,6 +307,9 @@ class RIRTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -313,6 +328,9 @@ class AggregateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'rir': 99999, + } @classmethod def setUpTestData(cls): @@ -415,6 +433,9 @@ class RoleTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -455,6 +476,9 @@ class PrefixTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -754,6 +778,9 @@ class IPRangeTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -909,6 +936,9 @@ class IPAddressTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } graphql_filter = { 'address': {'lookup': 'i_exact', 'value': '192.168.0.1/24'}, } @@ -1071,6 +1101,9 @@ class FHRPGroupTestCase(APIViewTestCases.APIViewTestCase): 'name': 'foobar-999', 'description': 'New description', } + bulk_update_invalid_data = { + 'protocol': 'not-a-valid-protocol', + } @classmethod def setUpTestData(cls): @@ -1117,6 +1150,9 @@ class FHRPGroupAssignmentTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'priority': 100, } + bulk_update_invalid_data = { + 'group': 99999, + } user_permissions = ('ipam.view_fhrpgroup', ) @classmethod @@ -1214,6 +1250,9 @@ class VLANGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -1320,6 +1359,9 @@ class VLANTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -1387,6 +1429,9 @@ class VLANTranslationPolicyTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -1523,6 +1568,9 @@ class VLANTranslationRuleTestCase(APIViewTestCases.APIViewTestCase): 'policy': vlan_translation_policies[2].pk, 'description': 'New description', } + cls.bulk_update_invalid_data = { + 'policy': 99999, + } def test_standard_fields_in_representation(self): """The standard URL, tag, custom-field and change-tracking names appear in the representation.""" @@ -1554,6 +1602,9 @@ class ServiceTemplateTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } graphql_base_name = 'service_template' @classmethod @@ -1838,6 +1889,9 @@ class ServiceTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } graphql_base_name = 'service' @classmethod diff --git a/netbox/tenancy/tests/test_api.py b/netbox/tenancy/tests/test_api.py index dcba0025b..f53b19810 100644 --- a/netbox/tenancy/tests/test_api.py +++ b/netbox/tenancy/tests/test_api.py @@ -28,6 +28,9 @@ class TenantGroupTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'comments': 'New Comment', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -119,6 +122,9 @@ class TenantTestCase(APIViewTestCases.APIViewTestCase): 'group': None, 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -160,6 +166,9 @@ class ContactGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -219,6 +228,9 @@ class ContactRoleTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -238,6 +250,9 @@ class ContactTestCase(APIViewTestCases.APIViewTestCase): 'groups': [], 'comments': 'New comments', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -277,6 +292,9 @@ class ContactAssignmentTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'priority': ContactPriorityChoices.PRIORITY_INACTIVE, } + bulk_update_invalid_data = { + 'priority': 'not-a-valid-priority', + } user_permissions = ('tenancy.view_contact', ) @classmethod diff --git a/netbox/users/tests/test_api.py b/netbox/users/tests/test_api.py index 1e5fd5ccf..22d6adf8b 100644 --- a/netbox/users/tests/test_api.py +++ b/netbox/users/tests/test_api.py @@ -24,6 +24,9 @@ class UserTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'email': 'test@example.com', } + bulk_update_invalid_data = { + 'email': 'not-an-email', + } @classmethod def setUpTestData(cls): @@ -202,6 +205,9 @@ class TokenTestCase( bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'expires': 'not-a-date', + } def setUp(self): super().setUp() @@ -588,6 +594,9 @@ class ObjectPermissionTestCase( cls.bulk_update_data = { 'description': 'New description', } + cls.bulk_update_invalid_data = { + 'users': [99999], + } class UserConfigTestCase(APITestCase): @@ -649,6 +658,11 @@ class OwnerGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + # OwnerGroupSerializer exposes only name, description, and a read-only member_count, so an + # over-length description is the only value available to trigger a validation error. + bulk_update_invalid_data = { + 'description': 'a' * 201, + } @classmethod def setUpTestData(cls): @@ -750,3 +764,7 @@ class OwnerTestCase(APIViewTestCases.APIViewTestCase): 'users': [users[3].pk], 'description': 'New description', } + + cls.bulk_update_invalid_data = { + 'group': 99999, + } diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index f20c58653..9f00d79aa 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -56,6 +56,9 @@ class ClusterTypeTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -88,6 +91,9 @@ class ClusterGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -107,6 +113,9 @@ class ClusterTestCase(APIViewTestCases.APIViewTestCase): 'status': 'offline', 'comments': 'New comment', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -235,6 +244,9 @@ class VirtualMachineTypeTestCase(APIViewTestCases.APIViewTestCase): 'default_memory': 8192, 'description': 'New description', } + cls.bulk_update_invalid_data = { + 'owner': 99999, + } class VirtualMachineTestCase(APIViewTestCases.APIViewTestCase): @@ -243,6 +255,9 @@ class VirtualMachineTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'status': 'staged', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_platform', 'virtualization.view_virtualmachinetype') @classmethod @@ -624,6 +639,9 @@ class VMInterfaceTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'mode': 'not-a-valid-mode', + } graphql_base_name = 'vm_interface' user_permissions = ('virtualization.view_virtualmachine', ) @@ -915,6 +933,9 @@ class VirtualDiskTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'size': 888, } + bulk_update_invalid_data = { + 'virtual_machine': 99999, + } graphql_base_name = 'virtual_disk' user_permissions = ('virtualization.view_virtualmachine', ) diff --git a/netbox/vpn/tests/test_api.py b/netbox/vpn/tests/test_api.py index 849eae3c5..02f729acb 100644 --- a/netbox/vpn/tests/test_api.py +++ b/netbox/vpn/tests/test_api.py @@ -38,6 +38,9 @@ class TunnelGroupTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -58,6 +61,9 @@ class TunnelTestCase(APIViewTestCases.APIViewTestCase): 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -117,6 +123,9 @@ class TunnelTerminationTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'role': TunnelTerminationRoleChoices.ROLE_PEER, } + bulk_update_invalid_data = { + 'role': 'not-a-valid-role', + } user_permissions = ('vpn.view_tunnel', ) @classmethod @@ -189,6 +198,9 @@ class IKEProposalTestCase(APIViewTestCases.APIViewTestCase): 'group': DHGroupChoices.GROUP_19, 'description': 'New description', } + bulk_update_invalid_data = { + 'authentication_algorithm': 'not-a-valid-authentication-algorithm', + } @classmethod def setUpTestData(cls): @@ -252,6 +264,9 @@ class IKEPolicyTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'preshared_key': 'New key', } + bulk_update_invalid_data = { + 'version': 'not-a-valid-version', + } @classmethod def setUpTestData(cls): @@ -325,6 +340,9 @@ class IPSecProposalTestCase(APIViewTestCases.APIViewTestCase): 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_MD5, 'description': 'New description', } + bulk_update_invalid_data = { + 'encryption_algorithm': 'not-a-valid-encryption-algorithm', + } @classmethod def setUpTestData(cls): @@ -374,6 +392,9 @@ class IPSecPolicyTestCase(APIViewTestCases.APIViewTestCase): 'pfs_group': DHGroupChoices.GROUP_5, 'description': 'New description', } + bulk_update_invalid_data = { + 'pfs_group': 'not-a-valid-pfs-group', + } @classmethod def setUpTestData(cls): @@ -519,6 +540,10 @@ class IPSecProfileTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', } + cls.bulk_update_invalid_data = { + 'mode': 'not-a-valid-mode', + } + class L2VPNTestCase(APIViewTestCases.APIViewTestCase): model = L2VPN @@ -549,6 +574,9 @@ class L2VPNTestCase(APIViewTestCases.APIViewTestCase): bulk_update_data = { 'description': 'New description', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } @classmethod def setUpTestData(cls): @@ -676,3 +704,7 @@ class L2VPNTerminationTestCase(APIViewTestCases.APIViewTestCase): cls.bulk_update_data = { 'l2vpn': l2vpns[2].pk } + + cls.bulk_update_invalid_data = { + 'l2vpn': 99999, + } diff --git a/netbox/wireless/tests/test_api.py b/netbox/wireless/tests/test_api.py index b5671db32..bbfed9327 100644 --- a/netbox/wireless/tests/test_api.py +++ b/netbox/wireless/tests/test_api.py @@ -40,6 +40,9 @@ class WirelessLANGroupTestCase(APIViewTestCases.APIViewTestCase): 'description': 'New description', 'comments': 'New comment', } + bulk_update_invalid_data = { + 'owner': 99999, + } @classmethod def setUpTestData(cls): @@ -118,6 +121,10 @@ class WirelessLANTestCase(APIViewTestCases.APIViewTestCase): 'auth_psk': 'abc123def456', } + cls.bulk_update_invalid_data = { + 'auth_type': 'not-a-valid-auth-type', + } + class WirelessLinkTestCase(APIViewTestCases.APIViewTestCase): model = WirelessLink @@ -127,6 +134,9 @@ class WirelessLinkTestCase(APIViewTestCases.APIViewTestCase): 'distance': 100, 'distance_unit': 'm', } + bulk_update_invalid_data = { + 'status': 'not-a-valid-status', + } user_permissions = ('dcim.view_interface', ) @classmethod