content: from django.test import TestCase
  
  from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, Site
  
  
  class NaturalOrderingTestCase(TestCase):
  
      @classmethod
      def setUpTestData(cls):
  
          site = Site.objects.create(name='Test Site 1', slug='test-site-1')
          manufacturer = Manufacturer.objects.create(name='Test Manufacturer 1', slug='test-manufacturer-1')
          devicetype = DeviceType.objects.create(
              manufacturer=manufacturer, model='Test Device Type 1', slug='test-device-type-1'
          )
          role = DeviceRole.objects.create(
              name='Test Device Role 1', slug='test-device-role-1', color='ff0000'
          )
          Device.objects.create(
              device_type=devicetype, role=role, name='Test Device 1', site=site
          )
  
      def test_interface_ordering_numeric(self):
          device = Device.objects.first()
          INTERFACES = [
              '0',
              '0.0',
              '0.1',
              '0.2',
              '0.10',
              '0.100',
              '0:1',
              '0:1.0',
              '0:1.1',
              '0:1.2',
              '0:1.10',
              '0:2',
              '0:2.0',
              '0:2.1',
              '0:2.2',
              '0:2.10',
              '1',
              '1.0',
              '1.1',
              '1.2',
              '1.10',
              '1.100',
              '1:1',
              '1:1.0',
              '1:1.1',
              '1:1.2',
              '1:1.10',
              '1:2',
              '1:2.0',
              '1:2.1',
              '1:2.2',
              '1:2.10',
          ]
  
          for name in INTERFACES:
              iface = Interface(device=device, name=name)
              iface.save()
  
          self.assertListEqual(
              list(Interface.objects.filter(device=device).values_list('name', flat=True)),
              INTERFACES
          )
  
      def test_interface_ordering_linux(self):
          device = Device.objects.first()
          INTERFACES = [
              'eth0',
              'eth0.1',
              'eth0.2',
              'eth0.10',
              'eth0.100',
              'eth1',
              'eth1.1',
              'eth1.2',
              'eth1.100',
              'lo0',
          ]
  
          for name in INTERFACES:
              iface = Interface(device=device, name=name)
              iface.save()
  
          self.assertListEqual(
              list(Interface.objects.filter(device=device).values_list('name', flat=True)),
              INTERFACES
          )
  
      def test_interface_ordering_junos(self):
          device = Device.objects.first()
          INTERFACES = [
              'xe-0/0/0',
              'xe-0/0/1',
              'xe-0/0/2',
              'xe-0/0/3',
              'xe-0/1/0',
              'xe-0/1/1',
              'xe-0/1/2',
              'xe-0/1/3',
              'xe-1/0/0',
              'xe-1/0/1',
              'xe-1/0/2',
              'xe-1/0/3',
              'xe-1/1/0',
              'xe-1/1/1',
              'xe-1/1/2',
              'xe-1/1/3',
              'xe-2/0/0.1',
              'xe-2/0/0.2',
              'xe-2/0/0.10',
              'xe-2/0/0.11',
              'xe-2/0/0.100',
              'xe-3/0/0:1',
              'xe-3/0/0:2',
              'xe-3/0/0:10',
              'xe-3/0/0:11',
              'xe-3/0/0:100',
              'xe-10/1/0',
              'xe-10/1/1',
              'xe-10/1/2',
              'xe-10/1/3',
              'ae1',
              'ae2',
              'ae10.1',
              'ae10.10',
              'irb.1',
              'irb.2',
              'irb.10',
              'irb.100',
              'lo0',
          ]
  
          for name in INTERFACES:
              iface = Interface(device=device, name=name)
              iface.save()
  
          self.assertListEqual(
              list(Interface.objects.filter(device=device).values_list('name', flat=True)),
              INTERFACES
          )
  
      def test_interface_ordering_ios(self):
          device = Device.objects.first()
          INTERFACES = [
              'GigabitEthernet0/1',
              'GigabitEthernet0/2',
              'GigabitEthernet0/10',
              'TenGigabitEthernet0/20',
              'TenGigabitEthernet0/21',
              'GigabitEthernet1/1',
              'GigabitEthernet1/2',
              'GigabitEthernet1/10',
              'TenGigabitEthernet1/20',
              'TenGigabitEthernet1/21',
              'FastEthernet1',
              'FastEthernet2',
              'FastEthernet10',
          ]
  
          for name in INTERFACES:
              iface = Interface(device=device, name=name)
              iface.save()
  
          self.assertListEqual(
              list(Interface.objects.filter(device=device).values_list('name', flat=True)),
              INTERFACES
          )
  