diff options
author | Flávio Juvenal <flaviojuvenal@gmail.com> | 2017-08-17 16:21:35 -0700 |
---|---|---|
committer | Tim Graham <timograham@gmail.com> | 2017-10-20 13:17:22 -0400 |
commit | f6e1789654e82bac08cead5a2d2a9132f6403f52 (patch) | |
tree | abc80ed75f7c67ac7e44125e25c9898ff89fd68b /tests/postgres_tests/test_array.py | |
parent | 5ceaf14686ce626404afb6a5fbd3d8286410bf13 (diff) | |
download | django-f6e1789654e82bac08cead5a2d2a9132f6403f52.tar.gz |
Fixed #28577 -- Added checks for ArrayField and JSONField to prevent mutable defaults.
Diffstat (limited to 'tests/postgres_tests/test_array.py')
-rw-r--r-- | tests/postgres_tests/test_array.py | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/tests/postgres_tests/test_array.py b/tests/postgres_tests/test_array.py index e2e4ccdeb2..77ac049ce4 100644 --- a/tests/postgres_tests/test_array.py +++ b/tests/postgres_tests/test_array.py @@ -4,7 +4,7 @@ import unittest import uuid from django import forms -from django.core import exceptions, serializers, validators +from django.core import checks, exceptions, serializers, validators from django.core.exceptions import FieldError from django.core.management import call_command from django.db import IntegrityError, connection, models @@ -424,6 +424,38 @@ class TestChecks(PostgreSQLTestCase): self.assertEqual(len(errors), 1) self.assertEqual(errors[0].id, 'postgres.E002') + def test_invalid_default(self): + class MyModel(PostgreSQLModel): + field = ArrayField(models.IntegerField(), default=[]) + + model = MyModel() + self.assertEqual(model.check(), [ + checks.Warning( + msg=( + "ArrayField 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 `list` instead of `[]`.', + obj=MyModel._meta.get_field('field'), + id='postgres.E003', + ) + ]) + + def test_valid_default(self): + class MyModel(PostgreSQLModel): + field = ArrayField(models.IntegerField(), default=list) + + model = MyModel() + self.assertEqual(model.check(), []) + + def test_valid_default_none(self): + class MyModel(PostgreSQLModel): + field = ArrayField(models.IntegerField(), default=None) + + model = MyModel() + self.assertEqual(model.check(), []) + def test_nested_field_checks(self): """ Nested ArrayFields are permitted. |