summaryrefslogtreecommitdiff
path: root/tests/postgres_tests/test_json.py
diff options
context:
space:
mode:
authorLouise Grandjonc <louve.grandjonc@gmail.com>2019-10-01 16:25:40 -0700
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2019-10-11 11:57:16 +0200
commit522af9d6737550ef035a173c08a8276028b68917 (patch)
treee7ec5df9d1f8253ee1667c1d6ade10be366e361d /tests/postgres_tests/test_json.py
parent608b787135da9d2366af7a095ec388ba0eb4690d (diff)
[2.1.x] Fixed #30826 -- Fixed crash of many JSONField lookups when one hand side is key transform.
Regression in 6c3dfba89215fc56fc27ef61829a6fff88be4abb. Backport of 7d1bf29977bb368d7c28e7c6eb146db3b3009ae7 from master.
Diffstat (limited to 'tests/postgres_tests/test_json.py')
-rw-r--r--tests/postgres_tests/test_json.py31
1 files changed, 29 insertions, 2 deletions
diff --git a/tests/postgres_tests/test_json.py b/tests/postgres_tests/test_json.py
index e893e1a75a..32626e3fc1 100644
--- a/tests/postgres_tests/test_json.py
+++ b/tests/postgres_tests/test_json.py
@@ -18,7 +18,9 @@ from .models import JSONModel, PostgreSQLModel
try:
from django.contrib.postgres import forms
from django.contrib.postgres.fields import JSONField
- from django.contrib.postgres.fields.jsonb import KeyTransform
+ from django.contrib.postgres.fields.jsonb import (
+ KeyTextTransform, KeyTransform,
+ )
except ImportError:
pass
@@ -125,7 +127,12 @@ class TestQuerying(PostgreSQLTestCase):
'k': True,
'l': False,
}),
- JSONModel.objects.create(field={'foo': 'bar'}),
+ JSONModel.objects.create(field={
+ 'foo': 'bar',
+ 'baz': {'a': 'b', 'c': 'd'},
+ 'bar': ['foo', 'bar'],
+ 'bax': {'foo': 'bar'},
+ }),
]
def test_exact(self):
@@ -339,6 +346,26 @@ class TestQuerying(PostgreSQLTestCase):
queries[0]['sql'],
)
+ def test_lookups_with_key_transform(self):
+ tests = (
+ ('field__d__contains', 'e'),
+ ('field__baz__contained_by', {'a': 'b', 'c': 'd', 'e': 'f'}),
+ ('field__baz__has_key', 'c'),
+ ('field__baz__has_keys', ['a', 'c']),
+ ('field__baz__has_any_keys', ['a', 'x']),
+ ('field__contains', KeyTransform('bax', 'field')),
+ (
+ 'field__contained_by',
+ KeyTransform('x', RawSQL('%s::jsonb', ['{"x": {"a": "b", "c": 1, "d": "e"}}'])),
+ ),
+ ('field__has_key', KeyTextTransform('foo', 'field')),
+ )
+ for lookup, value in tests:
+ with self.subTest(lookup=lookup):
+ self.assertTrue(JSONModel.objects.filter(
+ **{lookup: value},
+ ).exists())
+
@isolate_apps('postgres_tests')
class TestChecks(PostgreSQLTestCase):