summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/lookup/tests.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/lookup/tests.py b/tests/lookup/tests.py
index 168a621a7e..8e9d2e70f0 100644
--- a/tests/lookup/tests.py
+++ b/tests/lookup/tests.py
@@ -2,6 +2,7 @@ import collections.abc
from datetime import datetime
from math import ceil
from operator import attrgetter
+from unittest import skipUnless
from django.core.exceptions import FieldError
from django.db import connection, models
@@ -927,6 +928,44 @@ class LookupTests(TestCase):
with self.assertRaisesMessage(ValueError, msg):
list(Article.objects.filter(author=Author.objects.all()[1:]))
+ @skipUnless(connection.vendor == 'mysql', 'MySQL-specific workaround.')
+ def test_exact_booleanfield(self):
+ # MySQL ignores indexes with boolean fields unless they're compared
+ # directly to a boolean value.
+ product = Product.objects.create(name='Paper', qty_target=5000)
+ Stock.objects.create(product=product, short=False, qty_available=5100)
+ stock_1 = Stock.objects.create(product=product, short=True, qty_available=180)
+ qs = Stock.objects.filter(short=True)
+ self.assertSequenceEqual(qs, [stock_1])
+ self.assertIn(
+ '%s = True' % connection.ops.quote_name('short'),
+ str(qs.query),
+ )
+
+ @skipUnless(connection.vendor == 'mysql', 'MySQL-specific workaround.')
+ def test_exact_booleanfield_annotation(self):
+ # MySQL ignores indexes with boolean fields unless they're compared
+ # directly to a boolean value.
+ qs = Author.objects.annotate(case=Case(
+ When(alias='a1', then=True),
+ default=False,
+ output_field=BooleanField(),
+ )).filter(case=True)
+ self.assertSequenceEqual(qs, [self.au1])
+ self.assertIn(' = True', str(qs.query))
+
+ qs = Author.objects.annotate(
+ wrapped=ExpressionWrapper(Q(alias='a1'), output_field=BooleanField()),
+ ).filter(wrapped=True)
+ self.assertSequenceEqual(qs, [self.au1])
+ self.assertIn(' = True', str(qs.query))
+ # EXISTS(...) shouldn't be compared to a boolean value.
+ qs = Author.objects.annotate(
+ exists=Exists(Author.objects.filter(alias='a1', pk=OuterRef('pk'))),
+ ).filter(exists=True)
+ self.assertSequenceEqual(qs, [self.au1])
+ self.assertNotIn(' = True', str(qs.query))
+
def test_custom_field_none_rhs(self):
"""
__exact=value is transformed to __isnull=True if Field.get_prep_value()