diff options
author | Gagaro <gagaro42@gmail.com> | 2022-01-31 16:04:13 +0100 |
---|---|---|
committer | Mariusz Felisiak <felisiak.mariusz@gmail.com> | 2022-05-04 08:47:52 +0200 |
commit | 5d91dc8ee3ff7e2230cfacf41005f61b8efbf057 (patch) | |
tree | dcf497a064eba43eaa6163b772f4f7873b5bfc42 /tests/queries | |
parent | 1109e669905d2011561e843f0ab7c2c02fb63c4d (diff) | |
download | django-5d91dc8ee3ff7e2230cfacf41005f61b8efbf057.tar.gz |
Refs #30581 -- Added Q.check() hook.
Diffstat (limited to 'tests/queries')
-rw-r--r-- | tests/queries/test_q.py | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/tests/queries/test_q.py b/tests/queries/test_q.py index 42a00da3eb..4801eb4807 100644 --- a/tests/queries/test_q.py +++ b/tests/queries/test_q.py @@ -1,3 +1,4 @@ +from django.core.exceptions import FieldError from django.db.models import ( BooleanField, Exists, @@ -10,7 +11,7 @@ from django.db.models import ( from django.db.models.expressions import RawSQL from django.db.models.functions import Lower from django.db.models.sql.where import NothingNode -from django.test import SimpleTestCase +from django.test import SimpleTestCase, TestCase from .models import Tag @@ -214,3 +215,40 @@ class QTests(SimpleTestCase): ) flatten = list(q.flatten()) self.assertEqual(len(flatten), 7) + + +class QCheckTests(TestCase): + def test_basic(self): + q = Q(price__gt=20) + self.assertIs(q.check({"price": 30}), True) + self.assertIs(q.check({"price": 10}), False) + + def test_expression(self): + q = Q(name="test") + self.assertIs(q.check({"name": Lower(Value("TeSt"))}), True) + self.assertIs(q.check({"name": Value("other")}), False) + + def test_missing_field(self): + q = Q(description__startswith="prefix") + msg = "Cannot resolve keyword 'description' into field." + with self.assertRaisesMessage(FieldError, msg): + q.check({"name": "test"}) + + def test_boolean_expression(self): + q = Q(ExpressionWrapper(Q(price__gt=20), output_field=BooleanField())) + self.assertIs(q.check({"price": 25}), True) + self.assertIs(q.check({"price": Value(10)}), False) + + def test_rawsql(self): + """ + RawSQL expressions cause a database error because "price" cannot be + replaced by its value. In this case, Q.check() logs a warning and + return True. + """ + q = Q(RawSQL("price > %s", params=(20,), output_field=BooleanField())) + with self.assertLogs("django.db.models", "WARNING") as cm: + self.assertIs(q.check({"price": 10}), True) + self.assertIn( + f"Got a database error calling check() on {q!r}: ", + cm.records[0].getMessage(), + ) |