From e387f191f76777015b6ea687ce83cdb05ee47cee Mon Sep 17 00:00:00 2001 From: Tom Carrick Date: Sat, 18 Jul 2020 13:17:39 +0200 Subject: Fixed #31777 -- Added support for database collations to Char/TextFields. Thanks Simon Charette and Mariusz Felisiak for reviews. --- tests/inspectdb/models.py | 19 ++++++++++++++++++- tests/inspectdb/tests.py | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 54 insertions(+), 2 deletions(-) (limited to 'tests/inspectdb') diff --git a/tests/inspectdb/models.py b/tests/inspectdb/models.py index d0076ce94f..4d2c224da9 100644 --- a/tests/inspectdb/models.py +++ b/tests/inspectdb/models.py @@ -1,4 +1,4 @@ -from django.db import models +from django.db import connection, models class People(models.Model): @@ -79,6 +79,23 @@ class JSONFieldColumnType(models.Model): } +test_collation = connection.features.test_collations.get('non_default') + + +class CharFieldDbCollation(models.Model): + char_field = models.CharField(max_length=10, db_collation=test_collation) + + class Meta: + required_db_features = {'supports_collation_on_charfield'} + + +class TextFieldDbCollation(models.Model): + text_field = models.TextField(db_collation=test_collation) + + class Meta: + required_db_features = {'supports_collation_on_textfield'} + + class UniqueTogether(models.Model): field1 = models.IntegerField() field2 = models.CharField(max_length=10) diff --git a/tests/inspectdb/tests.py b/tests/inspectdb/tests.py index fa3a7ac21f..6815629e95 100644 --- a/tests/inspectdb/tests.py +++ b/tests/inspectdb/tests.py @@ -8,7 +8,7 @@ from django.db import connection from django.db.backends.base.introspection import TableInfo from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature -from .models import PeopleMoreData +from .models import PeopleMoreData, test_collation def inspectdb_tables_only(table_name): @@ -104,6 +104,41 @@ class InspectDBTestCase(TestCase): self.assertIn('json_field = models.JSONField()', output) self.assertIn('null_json_field = models.JSONField(blank=True, null=True)', output) + @skipUnlessDBFeature('supports_collation_on_charfield') + def test_char_field_db_collation(self): + out = StringIO() + call_command('inspectdb', 'inspectdb_charfielddbcollation', stdout=out) + output = out.getvalue() + if not connection.features.interprets_empty_strings_as_nulls: + self.assertIn( + "char_field = models.CharField(max_length=10, " + "db_collation='%s')" % test_collation, + output, + ) + else: + self.assertIn( + "char_field = models.CharField(max_length=10, " + "db_collation='%s', blank=True, null=True)" % test_collation, + output, + ) + + @skipUnlessDBFeature('supports_collation_on_textfield') + def test_text_field_db_collation(self): + out = StringIO() + call_command('inspectdb', 'inspectdb_textfielddbcollation', stdout=out) + output = out.getvalue() + if not connection.features.interprets_empty_strings_as_nulls: + self.assertIn( + "text_field = models.TextField(db_collation='%s')" % test_collation, + output, + ) + else: + self.assertIn( + "text_field = models.TextField(db_collation='%s, blank=True, " + "null=True)" % test_collation, + output, + ) + def test_number_field_types(self): """Test introspection of various Django field types""" assertFieldType = self.make_field_type_asserter() -- cgit v1.3