diff options
author | David Wobrock <david.wobrock@gmail.com> | 2022-09-26 22:59:25 +0200 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-10-31 09:55:51 +0100 |
commit | a320aab5129f4019b3c1d28b7a3b509582bc56f9 (patch) | |
tree | 31d140537fbf59616871a04eeb4d19fde54761f9 /tests/expressions | |
parent | c01e76c95caa1bd2995f1b6c186cbe8726c92ef9 (diff) | |
download | django-a320aab5129f4019b3c1d28b7a3b509582bc56f9.tar.gz |
Fixed #16211 -- Added logical NOT support to F expressions.
Diffstat (limited to 'tests/expressions')
-rw-r--r-- | tests/expressions/tests.py | 56 |
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( |