|  | 
|  | 1 | +from __future__ import annotations | 
|  | 2 | + | 
|  | 3 | +from django.db import connection | 
|  | 4 | +from django.test import SimpleTestCase, TransactionTestCase | 
|  | 5 | + | 
|  | 6 | +from django_mysql.models.indexes import ColumnPrefixIndex | 
|  | 7 | +from tests.testapp.models import CharSetModel | 
|  | 8 | + | 
|  | 9 | + | 
|  | 10 | +class ColumnPrefixIndexTests(SimpleTestCase): | 
|  | 11 | +    def test_deconstruct(self): | 
|  | 12 | +        index = ColumnPrefixIndex( | 
|  | 13 | +            fields=["field", "field2"], | 
|  | 14 | +            prefix_lengths=(10, 20), | 
|  | 15 | +            name="dm_field_field2_pfx", | 
|  | 16 | +        ) | 
|  | 17 | +        path, args, kwargs = index.deconstruct() | 
|  | 18 | +        self.assertEqual(path, "django_mysql.models.indexes.ColumnPrefixIndex") | 
|  | 19 | +        self.assertEqual(args, ()) | 
|  | 20 | +        self.assertEqual( | 
|  | 21 | +            kwargs, | 
|  | 22 | +            { | 
|  | 23 | +                "name": "dm_field_field2_pfx", | 
|  | 24 | +                "fields": ["field", "field2"], | 
|  | 25 | +                "prefix_lengths": (10, 20), | 
|  | 26 | +            }, | 
|  | 27 | +        ) | 
|  | 28 | + | 
|  | 29 | + | 
|  | 30 | +class SchemaTests(TransactionTestCase): | 
|  | 31 | +    def get_constraints(self, table): | 
|  | 32 | +        return connection.introspection.get_constraints(connection.cursor(), table) | 
|  | 33 | + | 
|  | 34 | +    def test_column_prefix_index_create_sql(self): | 
|  | 35 | +        index = ColumnPrefixIndex( | 
|  | 36 | +            fields=["field", "field2"], | 
|  | 37 | +            prefix_lengths=(10, 20), | 
|  | 38 | +            name="dm_name_email_pfx", | 
|  | 39 | +        ) | 
|  | 40 | +        with connection.schema_editor() as editor: | 
|  | 41 | +            statement = index.create_sql(CharSetModel, editor) | 
|  | 42 | +            sql = str(statement) | 
|  | 43 | + | 
|  | 44 | +        self.assertIn("`field`(10)", sql) | 
|  | 45 | +        self.assertIn("`field2`(20)", sql) | 
|  | 46 | + | 
|  | 47 | +    def test_column_prefix_index(self): | 
|  | 48 | +        table = CharSetModel._meta.db_table | 
|  | 49 | +        index_name = "dm_name_email_pfx" | 
|  | 50 | +        index = ColumnPrefixIndex( | 
|  | 51 | +            fields=["field", "field2"], prefix_lengths=(10, 20), name=index_name | 
|  | 52 | +        ) | 
|  | 53 | + | 
|  | 54 | +        # Ensure the table is there and doesn't have an index. | 
|  | 55 | +        self.assertNotIn(index_name, self.get_constraints(table)) | 
|  | 56 | + | 
|  | 57 | +        # Add the index. | 
|  | 58 | +        with connection.schema_editor() as editor: | 
|  | 59 | +            editor.add_index(CharSetModel, index) | 
|  | 60 | + | 
|  | 61 | +        constraints = self.get_constraints(table) | 
|  | 62 | +        self.assertIn(index_name, constraints) | 
|  | 63 | +        self.assertEqual(constraints[index_name]["type"], ColumnPrefixIndex.suffix) | 
|  | 64 | + | 
|  | 65 | +        # Drop the index. | 
|  | 66 | +        with connection.schema_editor() as editor: | 
|  | 67 | +            editor.remove_index(CharSetModel, index) | 
|  | 68 | +        self.assertNotIn(index_name, self.get_constraints(table)) | 
0 commit comments