summaryrefslogtreecommitdiff
path: root/tests/invalid_models_tests
diff options
context:
space:
mode:
authorsage <laymonage@gmail.com>2019-06-09 07:56:37 +0700
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-05-08 07:23:31 +0200
commit6789ded0a6ab797f0dcdfa6ad5d1cfa46e23abcd (patch)
tree1de598fc92480c64835b60b6ddbb461c3cd2e864 /tests/invalid_models_tests
parentf97f71f59249f1fbeebe84d4fc858d70fc456f7d (diff)
downloaddjango-6789ded0a6ab797f0dcdfa6ad5d1cfa46e23abcd.tar.gz
Fixed #12990, Refs #27694 -- Added JSONField model field.
Thanks to Adam Johnson, Carlton Gibson, Mariusz Felisiak, and Raphael Michel for mentoring this Google Summer of Code 2019 project and everyone else who helped with the patch. Special thanks to Mads Jensen, Nick Pope, and Simon Charette for extensive reviews. Co-authored-by: Mariusz Felisiak <felisiak.mariusz@gmail.com>
Diffstat (limited to 'tests/invalid_models_tests')
-rw-r--r--tests/invalid_models_tests/test_models.py36
-rw-r--r--tests/invalid_models_tests/test_ordinary_fields.py48
2 files changed, 82 insertions, 2 deletions
diff --git a/tests/invalid_models_tests/test_models.py b/tests/invalid_models_tests/test_models.py
index 5a1bb4cc7a..6c062b2990 100644
--- a/tests/invalid_models_tests/test_models.py
+++ b/tests/invalid_models_tests/test_models.py
@@ -5,7 +5,7 @@ from django.core.checks.model_checks import _check_lazy_references
from django.db import connection, connections, models
from django.db.models.functions import Lower
from django.db.models.signals import post_init
-from django.test import SimpleTestCase, TestCase
+from django.test import SimpleTestCase, TestCase, skipUnlessDBFeature
from django.test.utils import isolate_apps, override_settings, register_lookup
@@ -1350,6 +1350,40 @@ class OtherModelTests(SimpleTestCase):
@isolate_apps('invalid_models_tests')
+class JSONFieldTests(TestCase):
+ @skipUnlessDBFeature('supports_json_field')
+ def test_ordering_pointing_to_json_field_value(self):
+ class Model(models.Model):
+ field = models.JSONField()
+
+ class Meta:
+ ordering = ['field__value']
+
+ self.assertEqual(Model.check(databases=self.databases), [])
+
+ def test_check_jsonfield(self):
+ class Model(models.Model):
+ field = models.JSONField()
+
+ error = Error(
+ '%s does not support JSONFields.' % connection.display_name,
+ obj=Model,
+ id='fields.E180',
+ )
+ expected = [] if connection.features.supports_json_field else [error]
+ self.assertEqual(Model.check(databases=self.databases), expected)
+
+ def test_check_jsonfield_required_db_features(self):
+ class Model(models.Model):
+ field = models.JSONField()
+
+ class Meta:
+ required_db_features = {'supports_json_field'}
+
+ self.assertEqual(Model.check(databases=self.databases), [])
+
+
+@isolate_apps('invalid_models_tests')
class ConstraintsTests(TestCase):
def test_check_constraints(self):
class Model(models.Model):
diff --git a/tests/invalid_models_tests/test_ordinary_fields.py b/tests/invalid_models_tests/test_ordinary_fields.py
index d263dc5cc9..a81f9eed90 100644
--- a/tests/invalid_models_tests/test_ordinary_fields.py
+++ b/tests/invalid_models_tests/test_ordinary_fields.py
@@ -3,7 +3,9 @@ import uuid
from django.core.checks import Error, Warning as DjangoWarning
from django.db import connection, models
-from django.test import SimpleTestCase, TestCase, skipIfDBFeature
+from django.test import (
+ SimpleTestCase, TestCase, skipIfDBFeature, skipUnlessDBFeature,
+)
from django.test.utils import isolate_apps, override_settings
from django.utils.functional import lazy
from django.utils.timezone import now
@@ -793,3 +795,47 @@ class UUIDFieldTests(TestCase):
)
self.assertEqual(Model._meta.get_field('field').check(), [])
+
+
+@isolate_apps('invalid_models_tests')
+@skipUnlessDBFeature('supports_json_field')
+class JSONFieldTests(TestCase):
+ def test_invalid_default(self):
+ class Model(models.Model):
+ field = models.JSONField(default={})
+
+ self.assertEqual(Model._meta.get_field('field').check(), [
+ DjangoWarning(
+ msg=(
+ "JSONField default should be a callable instead of an "
+ "instance so that it's not shared between all field "
+ "instances."
+ ),
+ hint=(
+ 'Use a callable instead, e.g., use `dict` instead of `{}`.'
+ ),
+ obj=Model._meta.get_field('field'),
+ id='fields.E010',
+ )
+ ])
+
+ def test_valid_default(self):
+ class Model(models.Model):
+ field = models.JSONField(default=dict)
+
+ self.assertEqual(Model._meta.get_field('field').check(), [])
+
+ def test_valid_default_none(self):
+ class Model(models.Model):
+ field = models.JSONField(default=None)
+
+ self.assertEqual(Model._meta.get_field('field').check(), [])
+
+ def test_valid_callable_default(self):
+ def callable_default():
+ return {'it': 'works'}
+
+ class Model(models.Model):
+ field = models.JSONField(default=callable_default)
+
+ self.assertEqual(Model._meta.get_field('field').check(), [])