summaryrefslogtreecommitdiff
path: root/tests/get_earliest_or_latest
diff options
context:
space:
mode:
authorFlorian Apolloner <florian@apolloner.eu>2013-02-26 09:53:47 +0100
committerFlorian Apolloner <florian@apolloner.eu>2013-02-26 14:36:57 +0100
commit89f40e36246100df6a11316c31a76712ebc6c501 (patch)
tree6e65639683ddaf2027908d1ecb1739e0e2ff853b /tests/get_earliest_or_latest
parentb3d2ccb5bfbaf6e7fe1f98843baaa48c35a70950 (diff)
downloaddjango-89f40e36246100df6a11316c31a76712ebc6c501.tar.gz
Merged regressiontests and modeltests into the test root.
Diffstat (limited to 'tests/get_earliest_or_latest')
-rw-r--r--tests/get_earliest_or_latest/__init__.py0
-rw-r--r--tests/get_earliest_or_latest/models.py16
-rw-r--r--tests/get_earliest_or_latest/tests.py123
3 files changed, 139 insertions, 0 deletions
diff --git a/tests/get_earliest_or_latest/__init__.py b/tests/get_earliest_or_latest/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/tests/get_earliest_or_latest/__init__.py
diff --git a/tests/get_earliest_or_latest/models.py b/tests/get_earliest_or_latest/models.py
new file mode 100644
index 0000000000..cd62cf0104
--- /dev/null
+++ b/tests/get_earliest_or_latest/models.py
@@ -0,0 +1,16 @@
+from django.db import models
+
+
+class Article(models.Model):
+ headline = models.CharField(max_length=100)
+ pub_date = models.DateField()
+ expire_date = models.DateField()
+
+ class Meta:
+ get_latest_by = 'pub_date'
+
+
+class Person(models.Model):
+ name = models.CharField(max_length=30)
+ birthday = models.DateField()
+ # Note that this model doesn't have "get_latest_by" set.
diff --git a/tests/get_earliest_or_latest/tests.py b/tests/get_earliest_or_latest/tests.py
new file mode 100644
index 0000000000..6317a0974c
--- /dev/null
+++ b/tests/get_earliest_or_latest/tests.py
@@ -0,0 +1,123 @@
+from __future__ import absolute_import
+
+from datetime import datetime
+
+from django.test import TestCase
+
+from .models import Article, Person
+
+
+class EarliestOrLatestTests(TestCase):
+ """Tests for the earliest() and latest() objects methods"""
+
+ def tearDown(self):
+ """Makes sure Article has a get_latest_by"""
+ if not Article._meta.get_latest_by:
+ Article._meta.get_latest_by = 'pub_date'
+
+ def test_earliest(self):
+ # Because no Articles exist yet, earliest() raises ArticleDoesNotExist.
+ self.assertRaises(Article.DoesNotExist, Article.objects.earliest)
+
+ a1 = Article.objects.create(
+ headline="Article 1", pub_date=datetime(2005, 7, 26),
+ expire_date=datetime(2005, 9, 1)
+ )
+ a2 = Article.objects.create(
+ headline="Article 2", pub_date=datetime(2005, 7, 27),
+ expire_date=datetime(2005, 7, 28)
+ )
+ a3 = Article.objects.create(
+ headline="Article 3", pub_date=datetime(2005, 7, 28),
+ expire_date=datetime(2005, 8, 27)
+ )
+ a4 = Article.objects.create(
+ headline="Article 4", pub_date=datetime(2005, 7, 28),
+ expire_date=datetime(2005, 7, 30)
+ )
+
+ # Get the earliest Article.
+ self.assertEqual(Article.objects.earliest(), a1)
+ # Get the earliest Article that matches certain filters.
+ self.assertEqual(
+ Article.objects.filter(pub_date__gt=datetime(2005, 7, 26)).earliest(),
+ a2
+ )
+
+ # Pass a custom field name to earliest() to change the field that's used
+ # to determine the earliest object.
+ self.assertEqual(Article.objects.earliest('expire_date'), a2)
+ self.assertEqual(Article.objects.filter(
+ pub_date__gt=datetime(2005, 7, 26)).earliest('expire_date'), a2)
+
+ # Ensure that earliest() overrides any other ordering specified on the
+ # query. Refs #11283.
+ self.assertEqual(Article.objects.order_by('id').earliest(), a1)
+
+ # Ensure that error is raised if the user forgot to add a get_latest_by
+ # in the Model.Meta
+ Article.objects.model._meta.get_latest_by = None
+ self.assertRaisesMessage(
+ AssertionError,
+ "earliest() and latest() require either a field_name parameter or "
+ "'get_latest_by' in the model",
+ lambda: Article.objects.earliest(),
+ )
+
+ def test_latest(self):
+ # Because no Articles exist yet, latest() raises ArticleDoesNotExist.
+ self.assertRaises(Article.DoesNotExist, Article.objects.latest)
+
+ a1 = Article.objects.create(
+ headline="Article 1", pub_date=datetime(2005, 7, 26),
+ expire_date=datetime(2005, 9, 1)
+ )
+ a2 = Article.objects.create(
+ headline="Article 2", pub_date=datetime(2005, 7, 27),
+ expire_date=datetime(2005, 7, 28)
+ )
+ a3 = Article.objects.create(
+ headline="Article 3", pub_date=datetime(2005, 7, 27),
+ expire_date=datetime(2005, 8, 27)
+ )
+ a4 = Article.objects.create(
+ headline="Article 4", pub_date=datetime(2005, 7, 28),
+ expire_date=datetime(2005, 7, 30)
+ )
+
+ # Get the latest Article.
+ self.assertEqual(Article.objects.latest(), a4)
+ # Get the latest Article that matches certain filters.
+ self.assertEqual(
+ Article.objects.filter(pub_date__lt=datetime(2005, 7, 27)).latest(),
+ a1
+ )
+
+ # Pass a custom field name to latest() to change the field that's used
+ # to determine the latest object.
+ self.assertEqual(Article.objects.latest('expire_date'), a1)
+ self.assertEqual(
+ Article.objects.filter(pub_date__gt=datetime(2005, 7, 26)).latest('expire_date'),
+ a3,
+ )
+
+ # Ensure that latest() overrides any other ordering specified on the query. Refs #11283.
+ self.assertEqual(Article.objects.order_by('id').latest(), a4)
+
+ # Ensure that error is raised if the user forgot to add a get_latest_by
+ # in the Model.Meta
+ Article.objects.model._meta.get_latest_by = None
+ self.assertRaisesMessage(
+ AssertionError,
+ "earliest() and latest() require either a field_name parameter or "
+ "'get_latest_by' in the model",
+ lambda: Article.objects.latest(),
+ )
+
+ def test_latest_manual(self):
+ # You can still use latest() with a model that doesn't have
+ # "get_latest_by" set -- just pass in the field name manually.
+ p1 = Person.objects.create(name="Ralph", birthday=datetime(1950, 1, 1))
+ p2 = Person.objects.create(name="Stephanie", birthday=datetime(1960, 2, 3))
+ self.assertRaises(AssertionError, Person.objects.latest)
+ self.assertEqual(Person.objects.latest("birthday"), p2)