From 088d3bc2f84b6b68fee7e5de053b58049bd110e7 Mon Sep 17 00:00:00 2001 From: Anssi Kääriäinen Date: Thu, 13 Dec 2012 13:33:11 +0200 Subject: Fixed #19462 -- Made assertQuerysetEqual detect undefined ordering If there are more than one values to compare against and the qs isn't ordered then assertQuerysetEqual will raise a ValueError. --- tests/regressiontests/expressions_regress/tests.py | 37 +++++++++++--------- tests/regressiontests/extra_regress/tests.py | 9 +++-- tests/regressiontests/m2m_regress/tests.py | 2 +- tests/regressiontests/m2m_through_regress/tests.py | 9 +++-- tests/regressiontests/managers_regress/tests.py | 3 +- tests/regressiontests/model_regress/tests.py | 9 +++-- tests/regressiontests/queries/tests.py | 37 +++++++++++++------- tests/regressiontests/test_utils/models.py | 6 +++- tests/regressiontests/test_utils/tests.py | 40 ++++++++++++++++++++++ 9 files changed, 110 insertions(+), 42 deletions(-) (limited to 'tests/regressiontests') diff --git a/tests/regressiontests/expressions_regress/tests.py b/tests/regressiontests/expressions_regress/tests.py index 508a497151..ddb2c83b4f 100644 --- a/tests/regressiontests/expressions_regress/tests.py +++ b/tests/regressiontests/expressions_regress/tests.py @@ -26,12 +26,13 @@ class ExpressionsRegressTests(TestCase): same object. """ self.assertQuerysetEqual( - Number.objects.all(), - [ - '', - '', - '' - ] + Number.objects.all(), + [ + '', + '', + '' + ], + ordered=False ) def test_increment_value(self): @@ -44,12 +45,13 @@ class ExpressionsRegressTests(TestCase): 2) self.assertQuerysetEqual( - Number.objects.all(), - [ - '', - '', - '' - ] + Number.objects.all(), + [ + '', + '', + '' + ], + ordered=False ) def test_filter_not_equals_other_field(self): @@ -62,11 +64,12 @@ class ExpressionsRegressTests(TestCase): .update(integer=F('integer') + 1), 2) self.assertQuerysetEqual( - Number.objects.exclude(float=F('integer')), - [ - '', - '' - ] + Number.objects.exclude(float=F('integer')), + [ + '', + '' + ], + ordered=False ) def test_complex_expressions(self): diff --git a/tests/regressiontests/extra_regress/tests.py b/tests/regressiontests/extra_regress/tests.py index f591900afe..1bc6789edd 100644 --- a/tests/regressiontests/extra_regress/tests.py +++ b/tests/regressiontests/extra_regress/tests.py @@ -58,13 +58,15 @@ class ExtraRegressTests(TestCase): ('First Revision', 'First Revision'), ('Second Revision', 'First Revision'), ], - transform=lambda r: (r.title, r.base.title) + transform=lambda r: (r.title, r.base.title), + ordered=False ) # Following queryset should return the most recent revision: self.assertQuerysetEqual(qs & qs2, [('Second Revision', 'First Revision')], - transform=lambda r: (r.title, r.base.title) + transform=lambda r: (r.title, r.base.title), + ordered=False ) def test_extra_stay_tied(self): @@ -342,5 +344,6 @@ class ExtraRegressTests(TestCase): TestObject.objects.extra( where=["first = 'a' OR second = 'a'", "third = 'a'"], ), - ['', ''] + ['', ''], + ordered=False ) diff --git a/tests/regressiontests/m2m_regress/tests.py b/tests/regressiontests/m2m_regress/tests.py index c39d883de4..3dc1d2417c 100644 --- a/tests/regressiontests/m2m_regress/tests.py +++ b/tests/regressiontests/m2m_regress/tests.py @@ -74,7 +74,7 @@ class M2MRegressionTests(TestCase): c1.tags = [t1, t2] c1 = TagCollection.objects.get(name='c1') - self.assertQuerysetEqual(c1.tags.all(), ["", ""]) + self.assertQuerysetEqual(c1.tags.all(), ["", ""], ordered=False) self.assertQuerysetEqual(t1.tag_collections.all(), [""]) def test_manager_class_caching(self): diff --git a/tests/regressiontests/m2m_through_regress/tests.py b/tests/regressiontests/m2m_through_regress/tests.py index eba956b3ba..17a4525442 100644 --- a/tests/regressiontests/m2m_through_regress/tests.py +++ b/tests/regressiontests/m2m_through_regress/tests.py @@ -28,7 +28,8 @@ class M2MThroughTestCase(TestCase): bob.group_set.all(), [ "", "", - ] + ], + ordered=False ) self.assertQuerysetEqual( @@ -51,7 +52,8 @@ class M2MThroughTestCase(TestCase): frank.group_set.all(), [ "", "", - ] + ], + ordered=False ) self.assertQuerysetEqual( @@ -190,7 +192,8 @@ class ToFieldThroughTests(TestCase): self.driver.car_set._add_items('driver', 'car', car2) self.assertQuerysetEqual( self.driver.car_set.all(), - ["", ""] + ["", ""], + ordered=False ) def test_add_null_reverse(self): diff --git a/tests/regressiontests/managers_regress/tests.py b/tests/regressiontests/managers_regress/tests.py index f3721a4c01..45059be4e5 100644 --- a/tests/regressiontests/managers_regress/tests.py +++ b/tests/regressiontests/managers_regress/tests.py @@ -61,7 +61,8 @@ class ManagersRegressionTests(TestCase): self.assertQuerysetEqual(Child4.manager1.all(), [ "", "" - ] + ], + ordered=False ) self.assertQuerysetEqual(Child5._default_manager.all(), [""]) self.assertQuerysetEqual(Child6._default_manager.all(), [""]) diff --git a/tests/regressiontests/model_regress/tests.py b/tests/regressiontests/model_regress/tests.py index 6a45a83052..c90fe98658 100644 --- a/tests/regressiontests/model_regress/tests.py +++ b/tests/regressiontests/model_regress/tests.py @@ -71,7 +71,8 @@ class ModelTests(TestCase): datetime.date(1999, 12, 31), datetime.date(1998, 12, 31), ], - attrgetter("when") + attrgetter("when"), + ordered=False ) self.assertQuerysetEqual( Party.objects.filter(when__year=1998), [ @@ -85,14 +86,16 @@ class ModelTests(TestCase): datetime.date(1999, 12, 31), datetime.date(1998, 12, 31), ], - attrgetter("when") + attrgetter("when"), + ordered=False ) self.assertQuerysetEqual( Party.objects.filter(when__month="12"), [ datetime.date(1999, 12, 31), datetime.date(1998, 12, 31), ], - attrgetter("when") + attrgetter("when"), + ordered=False ) self.assertQuerysetEqual( Party.objects.filter(when__year="1998"), [ diff --git a/tests/regressiontests/queries/tests.py b/tests/regressiontests/queries/tests.py index eea5fead55..e4009cdf20 100644 --- a/tests/regressiontests/queries/tests.py +++ b/tests/regressiontests/queries/tests.py @@ -841,11 +841,14 @@ class Queries1Tests(BaseQuerysetTest): """ original_ordering = Tag._meta.ordering Tag._meta.ordering = None - self.assertQuerysetEqual( - Tag.objects.all(), - ['', '', '', '', ''], - ) - Tag._meta.ordering = original_ordering + try: + self.assertQuerysetEqual( + Tag.objects.all(), + ['', '', '', '', ''], + ordered=False + ) + finally: + Tag._meta.ordering = original_ordering def test_exclude(self): self.assertQuerysetEqual( @@ -925,15 +928,18 @@ class Queries2Tests(TestCase): self.assertQuerysetEqual(Number.objects.filter(num__gt=12.1), []) self.assertQuerysetEqual( Number.objects.filter(num__lt=12), - ['', ''] + ['', ''], + ordered=False ) self.assertQuerysetEqual( Number.objects.filter(num__lt=12.0), - ['', ''] + ['', ''], + ordered=False ) self.assertQuerysetEqual( Number.objects.filter(num__lt=12.1), - ['', '', ''] + ['', '', ''], + ordered=False ) self.assertQuerysetEqual( Number.objects.filter(num__gte=11.9), @@ -951,23 +957,28 @@ class Queries2Tests(TestCase): self.assertQuerysetEqual(Number.objects.filter(num__gte=12.9), []) self.assertQuerysetEqual( Number.objects.filter(num__lte=11.9), - ['', ''] + ['', ''], + ordered=False ) self.assertQuerysetEqual( Number.objects.filter(num__lte=12), - ['', '', ''] + ['', '', ''], + ordered=False ) self.assertQuerysetEqual( Number.objects.filter(num__lte=12.0), - ['', '', ''] + ['', '', ''], + ordered=False ) self.assertQuerysetEqual( Number.objects.filter(num__lte=12.1), - ['', '', ''] + ['', '', ''], + ordered=False ) self.assertQuerysetEqual( Number.objects.filter(num__lte=12.9), - ['', '', ''] + ['', '', ''], + ordered=False ) def test_ticket7411(self): diff --git a/tests/regressiontests/test_utils/models.py b/tests/regressiontests/test_utils/models.py index 4da7a07bbf..85a1031c02 100644 --- a/tests/regressiontests/test_utils/models.py +++ b/tests/regressiontests/test_utils/models.py @@ -1,5 +1,9 @@ from django.db import models +from django.utils.encoding import python_2_unicode_compatible - +@python_2_unicode_compatible class Person(models.Model): name = models.CharField(max_length=100) + + def __str__(self): + return self.name diff --git a/tests/regressiontests/test_utils/tests.py b/tests/regressiontests/test_utils/tests.py index 95913b5aab..d5d49b2104 100644 --- a/tests/regressiontests/test_utils/tests.py +++ b/tests/regressiontests/test_utils/tests.py @@ -54,6 +54,46 @@ class AssertNumQueriesTests(TestCase): self.assertNumQueries(2, test_func) +class AssertQuerysetEqualTests(TestCase): + def setUp(self): + self.p1 = Person.objects.create(name='p1') + self.p2 = Person.objects.create(name='p2') + + def test_ordered(self): + self.assertQuerysetEqual( + Person.objects.all().order_by('name'), + [repr(self.p1), repr(self.p2)] + ) + + def test_unordered(self): + self.assertQuerysetEqual( + Person.objects.all().order_by('name'), + [repr(self.p2), repr(self.p1)], + ordered=False + ) + + def test_transform(self): + self.assertQuerysetEqual( + Person.objects.all().order_by('name'), + [self.p1.pk, self.p2.pk], + transform=lambda x: x.pk + ) + + def test_undefined_order(self): + # Using an unordered queryset with more than one ordered value + # is an error. + with self.assertRaises(ValueError): + self.assertQuerysetEqual( + Person.objects.all(), + [repr(self.p1), repr(self.p2)] + ) + # No error for one value. + self.assertQuerysetEqual( + Person.objects.filter(name='p1'), + [repr(self.p1)] + ) + + class AssertNumQueriesContextManagerTests(TestCase): urls = 'regressiontests.test_utils.urls' -- cgit v1.3