summaryrefslogtreecommitdiff
path: root/tests/custom_lookups
diff options
context:
space:
mode:
authorAnssi Kääriäinen <akaariai@gmail.com>2014-03-01 21:21:57 +0200
committerMarc Tamlyn <marc.tamlyn@gmail.com>2014-03-07 14:52:13 +0000
commit219d928852c256a81d09dbaa29ed4cec42d2fdfa (patch)
tree579c7d7fe66591e66c96fb406ba2d25a8ede5a91 /tests/custom_lookups
parenta0f252520291924f8fb7cb0d85f1680294508560 (diff)
Fixed #21863 -- supplemented get_lookup() with get_transform()
Also fixed #22124 -- Expanded explanation of exactly what is going on in as_sql() methods.
Diffstat (limited to 'tests/custom_lookups')
-rw-r--r--tests/custom_lookups/tests.py56
1 files changed, 54 insertions, 2 deletions
diff --git a/tests/custom_lookups/tests.py b/tests/custom_lookups/tests.py
index 0ac1780796..396974b4b1 100644
--- a/tests/custom_lookups/tests.py
+++ b/tests/custom_lookups/tests.py
@@ -3,10 +3,11 @@ from __future__ import unicode_literals
from datetime import date
import unittest
-from django.test import TestCase
-from .models import Author
+from django.core.exceptions import FieldError
from django.db import models
from django.db import connection
+from django.test import TestCase
+from .models import Author
class Div3Lookup(models.Lookup):
@@ -289,3 +290,54 @@ class YearLteTests(TestCase):
finally:
YearTransform._unregister_lookup(CustomYearExact)
YearTransform.register_lookup(YearExact)
+
+
+class TrackCallsYearTransform(YearTransform):
+ lookup_name = 'year'
+ call_order = []
+
+ def as_sql(self, qn, connection):
+ lhs_sql, params = qn.compile(self.lhs)
+ return connection.ops.date_extract_sql('year', lhs_sql), params
+
+ @property
+ def output_type(self):
+ return models.IntegerField()
+
+ def get_lookup(self, lookup_name):
+ self.call_order.append('lookup')
+ return super(TrackCallsYearTransform, self).get_lookup(lookup_name)
+
+ def get_transform(self, lookup_name):
+ self.call_order.append('transform')
+ return super(TrackCallsYearTransform, self).get_transform(lookup_name)
+
+
+class LookupTransformCallOrderTests(TestCase):
+ def test_call_order(self):
+ models.DateField.register_lookup(TrackCallsYearTransform)
+ try:
+ # junk lookup - tries lookup, then transform, then fails
+ with self.assertRaises(FieldError):
+ Author.objects.filter(birthdate__year__junk=2012)
+ self.assertEqual(TrackCallsYearTransform.call_order,
+ ['lookup', 'transform'])
+ TrackCallsYearTransform.call_order = []
+ # junk transform - tries transform only, then fails
+ with self.assertRaises(FieldError):
+ Author.objects.filter(birthdate__year__junk__more_junk=2012)
+ self.assertEqual(TrackCallsYearTransform.call_order,
+ ['transform'])
+ TrackCallsYearTransform.call_order = []
+ # Just getting the year (implied __exact) - lookup only
+ Author.objects.filter(birthdate__year=2012)
+ self.assertEqual(TrackCallsYearTransform.call_order,
+ ['lookup'])
+ TrackCallsYearTransform.call_order = []
+ # Just getting the year (explicit __exact) - lookup only
+ Author.objects.filter(birthdate__year__exact=2012)
+ self.assertEqual(TrackCallsYearTransform.call_order,
+ ['lookup'])
+
+ finally:
+ models.DateField._unregister_lookup(TrackCallsYearTransform)