diff options
Diffstat (limited to 'tests/constraints')
| -rw-r--r-- | tests/constraints/models.py | 7 | ||||
| -rw-r--r-- | tests/constraints/tests.py | 20 |
2 files changed, 27 insertions, 0 deletions
diff --git a/tests/constraints/models.py b/tests/constraints/models.py index ab3d4dc1e0..3ea5cf2323 100644 --- a/tests/constraints/models.py +++ b/tests/constraints/models.py @@ -121,3 +121,10 @@ class AbstractModel(models.Model): class ChildModel(AbstractModel): pass + + +class JSONFieldModel(models.Model): + data = models.JSONField(null=True) + + class Meta: + required_db_features = {"supports_json_field"} diff --git a/tests/constraints/tests.py b/tests/constraints/tests.py index 7e3d20e40c..f6571084b0 100644 --- a/tests/constraints/tests.py +++ b/tests/constraints/tests.py @@ -13,6 +13,7 @@ from django.utils.deprecation import RemovedInDjango60Warning from .models import ( ChildModel, ChildUniqueConstraintProduct, + JSONFieldModel, Product, UniqueConstraintConditionProduct, UniqueConstraintDeferrable, @@ -332,6 +333,25 @@ class CheckConstraintTests(TestCase): ) constraint.validate(Product, Product()) + @skipUnlessDBFeature("supports_json_field") + def test_validate_nullable_jsonfield(self): + is_null_constraint = models.CheckConstraint( + check=models.Q(data__isnull=True), + name="nullable_data", + ) + is_not_null_constraint = models.CheckConstraint( + check=models.Q(data__isnull=False), + name="nullable_data", + ) + is_null_constraint.validate(JSONFieldModel, JSONFieldModel(data=None)) + msg = f"Constraint “{is_null_constraint.name}” is violated." + with self.assertRaisesMessage(ValidationError, msg): + is_null_constraint.validate(JSONFieldModel, JSONFieldModel(data={})) + msg = f"Constraint “{is_not_null_constraint.name}” is violated." + with self.assertRaisesMessage(ValidationError, msg): + is_not_null_constraint.validate(JSONFieldModel, JSONFieldModel(data=None)) + is_not_null_constraint.validate(JSONFieldModel, JSONFieldModel(data={})) + class UniqueConstraintTests(TestCase): @classmethod |
