diff options
| author | Sage Abdullah <me@laymonage.com> | 2024-11-24 20:32:44 +0000 |
|---|---|---|
| committer | Sarah Boyce <42296566+sarahboyce@users.noreply.github.com> | 2024-12-03 11:19:55 +0100 |
| commit | b28438f379049e5ee1a89067e9cc14b7d0da07cf (patch) | |
| tree | fdff83975be8f443ffe2d1c29ef03de996ad4450 /tests/model_fields | |
| parent | ea34de3bd76fa87e84ae968f09105118ed360afb (diff) | |
Refs #35842 -- Fixed handling of quotes in JSONField key lookups on Oracle.
Diffstat (limited to 'tests/model_fields')
| -rw-r--r-- | tests/model_fields/test_jsonfield.py | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/model_fields/test_jsonfield.py b/tests/model_fields/test_jsonfield.py index ff42b1a14c..4c3dc61176 100644 --- a/tests/model_fields/test_jsonfield.py +++ b/tests/model_fields/test_jsonfield.py @@ -808,6 +808,59 @@ class TestQuerying(TestCase): ) self.assertIs(NullableJSONModel.objects.filter(value__c__lt=5).exists(), False) + def test_lookups_special_chars(self): + test_keys = [ + "CONTROL", + "single'", + "dollar$", + "dot.dot", + "with space", + "back\\slash", + "question?mark", + "user@name", + "emo🤡'ji", + "com,ma", + "curly{{{brace}}}s", + "escape\uffff'seq'\uffffue\uffff'nce", + ] + json_value = {key: "some value" for key in test_keys} + obj = NullableJSONModel.objects.create(value=json_value) + obj.refresh_from_db() + self.assertEqual(obj.value, json_value) + + for key in test_keys: + lookups = { + "has_key": Q(value__has_key=key), + "has_keys": Q(value__has_keys=[key, "CONTROL"]), + "has_any_keys": Q(value__has_any_keys=[key, "does_not_exist"]), + "exact": Q(**{f"value__{key}": "some value"}), + } + for lookup, condition in lookups.items(): + results = NullableJSONModel.objects.filter(condition) + with self.subTest(key=key, lookup=lookup): + self.assertSequenceEqual(results, [obj]) + + def test_lookups_special_chars_double_quotes(self): + test_keys = [ + 'double"', + "m\\i@x. m🤡'a,t{{{ch}}}e?d$\"'es\uffff'ca\uffff'pe", + ] + json_value = {key: "some value" for key in test_keys} + obj = NullableJSONModel.objects.create(value=json_value) + obj.refresh_from_db() + self.assertEqual(obj.value, json_value) + self.assertSequenceEqual( + NullableJSONModel.objects.filter(value__has_keys=test_keys), [obj] + ) + for key in test_keys: + with self.subTest(key=key): + results = NullableJSONModel.objects.filter( + Q(value__has_key=key), + Q(value__has_any_keys=[key, "does_not_exist"]), + Q(**{f"value__{key}": "some value"}), + ) + self.assertSequenceEqual(results, [obj]) + def test_lookup_exclude(self): tests = [ (Q(value__a="b"), [self.objs[0]]), |
