Added BaseDatabaseSchemaEditor._effective_default() to allow testing without a connection.

This commit is contained in:
Tim Graham 2018-11-17 18:50:26 -05:00
parent e62f6e0968
commit 9cac10eee4
2 changed files with 13 additions and 12 deletions

View File

@ -199,8 +199,9 @@ class BaseDatabaseSchemaEditor:
'requires_literal_defaults must provide a prepare_default() method'
)
def effective_default(self, field):
"""Return a field's effective database default value."""
@classmethod
def _effective_default(self, field):
# This method allows testing its logic without a connection.
if field.has_default():
default = field.get_default()
elif not field.null and field.blank and field.empty_strings_allowed:
@ -219,8 +220,11 @@ class BaseDatabaseSchemaEditor:
default = timezone.now()
else:
default = None
# Convert the value so it can be sent to the database.
return field.get_db_prep_save(default, self.connection)
return default
def effective_default(self, field):
"""Return a field's effective database default value."""
return field.get_db_prep_save(self._effective_default(field), self.connection)
def quote_value(self, value):
"""

View File

@ -1,8 +1,9 @@
from django.db import connection, models
from django.test import TestCase
from django.db import models
from django.db.backends.base.schema import BaseDatabaseSchemaEditor
from django.test import SimpleTestCase
class SchemaEditorTests(TestCase):
class SchemaEditorTests(SimpleTestCase):
def test_effective_default_callable(self):
"""SchemaEditor.effective_default() shouldn't call callable defaults."""
@ -14,9 +15,5 @@ class SchemaEditorTests(TestCase):
def _get_default(self):
return self.default
def get_db_prep_save(self, default, connection):
return default
field = MyCharField(max_length=1, default=MyStr)
with connection.schema_editor() as editor:
self.assertEqual(editor.effective_default(field), MyStr)
self.assertEqual(BaseDatabaseSchemaEditor._effective_default(field), MyStr)