diff options
| author | Michael Sinov <sihaelov@gmail.com> | 2016-12-13 21:38:09 +1000 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-03-21 12:28:16 -0400 |
| commit | 9aca67bea8d42e6c1889f16e5ce297cfc23b91a2 (patch) | |
| tree | 19b7ebd6b5a324a5be2a3a5da66d8b208635225b /tests/inspectdb | |
| parent | a170dac887ba17afb0adb7a837410dd26471f097 (diff) | |
Fixed #27533 -- Fixed inspectdb crash if a unique constraint uses an unsupported type.
Diffstat (limited to 'tests/inspectdb')
| -rw-r--r-- | tests/inspectdb/models.py | 1 | ||||
| -rw-r--r-- | tests/inspectdb/tests.py | 28 |
2 files changed, 27 insertions, 2 deletions
diff --git a/tests/inspectdb/models.py b/tests/inspectdb/models.py index 8c660658cd..20f6b5e940 100644 --- a/tests/inspectdb/models.py +++ b/tests/inspectdb/models.py @@ -17,6 +17,7 @@ class PeopleData(models.Model): class PeopleMoreData(models.Model): people_unique = models.ForeignKey(People, models.CASCADE, unique=True) + message = models.ForeignKey(Message, models.CASCADE, blank=True, null=True) license = models.CharField(max_length=255) diff --git a/tests/inspectdb/tests.py b/tests/inspectdb/tests.py index b6bbf0b2dd..e994b2cb74 100644 --- a/tests/inspectdb/tests.py +++ b/tests/inspectdb/tests.py @@ -7,6 +7,8 @@ from django.db import connection from django.db.backends.base.introspection import TableInfo from django.test import TestCase, TransactionTestCase, skipUnlessDBFeature +from .models import PeopleMoreData + def inspectdb_tables_only(table_name): """ @@ -21,6 +23,7 @@ def special_table_only(table_name): class InspectDBTestCase(TestCase): + unique_re = re.compile(r'.*unique_together = \((.+),\).*') def test_stealth_table_name_filter_option(self): out = StringIO() @@ -212,8 +215,7 @@ class InspectDBTestCase(TestCase): call_command('inspectdb', 'inspectdb_uniquetogether', stdout=out) output = out.getvalue() self.assertIn(" unique_together = (('", output) - unique_re = re.compile(r'.*unique_together = \((.+),\).*') - unique_together_match = re.findall(unique_re, output) + unique_together_match = re.findall(self.unique_re, output) # There should be one unique_together tuple. self.assertEqual(len(unique_together_match), 1) fields = unique_together_match[0] @@ -225,6 +227,28 @@ class InspectDBTestCase(TestCase): # are given an integer suffix. self.assertIn("('non_unique_column', 'non_unique_column_0')", fields) + @skipUnless(connection.vendor == 'postgresql', 'PostgreSQL specific SQL') + def test_unsupported_unique_together(self): + """Unsupported index types (COALESCE here) are skipped.""" + with connection.cursor() as c: + c.execute( + 'CREATE UNIQUE INDEX Findex ON %s ' + '(id, people_unique_id, COALESCE(message_id, -1))' % PeopleMoreData._meta.db_table + ) + try: + out = StringIO() + call_command( + 'inspectdb', + table_name_filter=lambda tn: tn.startswith(PeopleMoreData._meta.db_table), + stdout=out, + ) + output = out.getvalue() + self.assertIn('# A unique constraint could not be introspected.', output) + self.assertEqual(re.findall(self.unique_re, output), ["('id', 'people_unique')"]) + finally: + with connection.cursor() as c: + c.execute('DROP INDEX Findex') + @skipUnless(connection.vendor == 'sqlite', "Only patched sqlite's DatabaseIntrospection.data_types_reverse for this test") def test_custom_fields(self): |
