diff --git a/netbox/utilities/tests/test_managers.py b/netbox/utilities/tests/test_managers.py index e69de29bb..0bafaefde 100644 --- a/netbox/utilities/tests/test_managers.py +++ b/netbox/utilities/tests/test_managers.py @@ -0,0 +1,192 @@ +from __future__ import unicode_literals + +from django.test import TestCase + +from dcim.models import Site + + +class NaturalOrderByManagerTest(TestCase): + """ + Ensure consistent natural ordering given myriad sample data. We use dcim.Site as our guinea pig because it's simple. + """ + + def setUp(self): + return + + def evaluate_ordering(self, names): + + # Create the Sites + Site.objects.bulk_create( + Site(name=name, slug=name.lower()) for name in names + ) + + # Validate forward ordering + self.assertEqual( + names, + list(Site.objects.values_list('name', flat=True)) + ) + + # Validate reverse ordering + self.assertEqual( + list(reversed(names)), + list(Site.objects.reverse().values_list('name', flat=True)) + ) + + def test_leading_digits(self): + + self.evaluate_ordering([ + '1Alpha', + '1Bravo', + '1Charlie', + '9Alpha', + '9Bravo', + '9Charlie', + '10Alpha', + '10Bravo', + '10Charlie', + '99Alpha', + '99Bravo', + '99Charlie', + '100Alpha', + '100Bravo', + '100Charlie', + '999Alpha', + '999Bravo', + '999Charlie', + ]) + + def test_trailing_digits(self): + + self.evaluate_ordering([ + 'Alpha1', + 'Alpha9', + 'Alpha10', + 'Alpha99', + 'Alpha100', + 'Alpha999', + 'Bravo1', + 'Bravo9', + 'Bravo10', + 'Bravo99', + 'Bravo100', + 'Bravo999', + 'Charlie1', + 'Charlie9', + 'Charlie10', + 'Charlie99', + 'Charlie100', + 'Charlie999', + ]) + + def test_leading_and_trailing_digits(self): + + self.evaluate_ordering([ + '1Alpha1', + '1Alpha9', + '1Alpha10', + '1Alpha99', + '1Alpha100', + '1Alpha999', + '1Bravo1', + '1Bravo9', + '1Bravo10', + '1Bravo99', + '1Bravo100', + '1Bravo999', + '1Charlie1', + '1Charlie9', + '1Charlie10', + '1Charlie99', + '1Charlie100', + '1Charlie999', + '9Alpha1', + '9Alpha9', + '9Alpha10', + '9Alpha99', + '9Alpha100', + '9Alpha999', + '9Bravo1', + '9Bravo9', + '9Bravo10', + '9Bravo99', + '9Bravo100', + '9Bravo999', + '9Charlie1', + '9Charlie9', + '9Charlie10', + '9Charlie99', + '9Charlie100', + '9Charlie999', + '10Alpha1', + '10Alpha9', + '10Alpha10', + '10Alpha99', + '10Alpha100', + '10Alpha999', + '10Bravo1', + '10Bravo9', + '10Bravo10', + '10Bravo99', + '10Bravo100', + '10Bravo999', + '10Charlie1', + '10Charlie9', + '10Charlie10', + '10Charlie99', + '10Charlie100', + '10Charlie999', + '99Alpha1', + '99Alpha9', + '99Alpha10', + '99Alpha99', + '99Alpha100', + '99Alpha999', + '99Bravo1', + '99Bravo9', + '99Bravo10', + '99Bravo99', + '99Bravo100', + '99Bravo999', + '99Charlie1', + '99Charlie9', + '99Charlie10', + '99Charlie99', + '99Charlie100', + '99Charlie999', + '100Alpha1', + '100Alpha9', + '100Alpha10', + '100Alpha99', + '100Alpha100', + '100Alpha999', + '100Bravo1', + '100Bravo9', + '100Bravo10', + '100Bravo99', + '100Bravo100', + '100Bravo999', + '100Charlie1', + '100Charlie9', + '100Charlie10', + '100Charlie99', + '100Charlie100', + '100Charlie999', + '999Alpha1', + '999Alpha9', + '999Alpha10', + '999Alpha99', + '999Alpha100', + '999Alpha999', + '999Bravo1', + '999Bravo9', + '999Bravo10', + '999Bravo99', + '999Bravo100', + '999Bravo999', + '999Charlie1', + '999Charlie9', + '999Charlie10', + '999Charlie99', + '999Charlie100', + '999Charlie999', + ])