summaryrefslogtreecommitdiff
path: root/tests/postgres_tests/test_array.py
diff options
context:
space:
mode:
authorFlávio Juvenal <flaviojuvenal@gmail.com>2017-08-17 16:21:35 -0700
committerTim Graham <timograham@gmail.com>2017-10-20 13:17:22 -0400
commitf6e1789654e82bac08cead5a2d2a9132f6403f52 (patch)
treeabc80ed75f7c67ac7e44125e25c9898ff89fd68b /tests/postgres_tests/test_array.py
parent5ceaf14686ce626404afb6a5fbd3d8286410bf13 (diff)
downloaddjango-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.py34
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.