summaryrefslogtreecommitdiff
path: root/tests/expressions
diff options
context:
space:
mode:
authorDavid Wobrock <david.wobrock@gmail.com>2022-09-26 22:59:25 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2022-10-31 09:55:51 +0100
commita320aab5129f4019b3c1d28b7a3b509582bc56f9 (patch)
tree31d140537fbf59616871a04eeb4d19fde54761f9 /tests/expressions
parentc01e76c95caa1bd2995f1b6c186cbe8726c92ef9 (diff)
downloaddjango-a320aab5129f4019b3c1d28b7a3b509582bc56f9.tar.gz
Fixed #16211 -- Added logical NOT support to F expressions.
Diffstat (limited to 'tests/expressions')
-rw-r--r--tests/expressions/tests.py56
1 files changed, 56 insertions, 0 deletions
diff --git a/tests/expressions/tests.py b/tests/expressions/tests.py
index fd0094db63..465edc54b5 100644
--- a/tests/expressions/tests.py
+++ b/tests/expressions/tests.py
@@ -48,6 +48,7 @@ from django.db.models.expressions import (
Col,
Combinable,
CombinedExpression,
+ NegatedExpression,
RawSQL,
Ref,
)
@@ -2536,6 +2537,61 @@ class ExpressionWrapperTests(SimpleTestCase):
self.assertEqual(group_by_cols[0].output_field, expr.output_field)
+class NegatedExpressionTests(TestCase):
+ @classmethod
+ def setUpTestData(cls):
+ ceo = Employee.objects.create(firstname="Joe", lastname="Smith", salary=10)
+ cls.eu_company = Company.objects.create(
+ name="Example Inc.",
+ num_employees=2300,
+ num_chairs=5,
+ ceo=ceo,
+ based_in_eu=True,
+ )
+ cls.non_eu_company = Company.objects.create(
+ name="Foobar Ltd.",
+ num_employees=3,
+ num_chairs=4,
+ ceo=ceo,
+ based_in_eu=False,
+ )
+
+ def test_invert(self):
+ f = F("field")
+ self.assertEqual(~f, NegatedExpression(f))
+ self.assertIsNot(~~f, f)
+ self.assertEqual(~~f, f)
+
+ def test_filter(self):
+ self.assertSequenceEqual(
+ Company.objects.filter(~F("based_in_eu")),
+ [self.non_eu_company],
+ )
+
+ qs = Company.objects.annotate(eu_required=~Value(False))
+ self.assertSequenceEqual(
+ qs.filter(based_in_eu=F("eu_required")).order_by("eu_required"),
+ [self.eu_company],
+ )
+ self.assertSequenceEqual(
+ qs.filter(based_in_eu=~~F("eu_required")),
+ [self.eu_company],
+ )
+ self.assertSequenceEqual(
+ qs.filter(based_in_eu=~F("eu_required")),
+ [self.non_eu_company],
+ )
+ self.assertSequenceEqual(qs.filter(based_in_eu=~F("based_in_eu")), [])
+
+ def test_values(self):
+ self.assertSequenceEqual(
+ Company.objects.annotate(negated=~F("based_in_eu"))
+ .values_list("name", "negated")
+ .order_by("name"),
+ [("Example Inc.", False), ("Foobar Ltd.", True)],
+ )
+
+
class OrderByTests(SimpleTestCase):
def test_equal(self):
self.assertEqual(