diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_operations.py | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index 64ae395d94..0899e92a3d 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -1324,6 +1324,83 @@ class OperationTests(OperationTestBase): operation.database_backwards("test_alflpkfk", editor, new_state, project_state) assertIdTypeEqualsFkType() + def test_alter_field_reloads_state_on_fk_target_changes(self): + """ + If AlterField doesn't reload state appropriately, the second AlterField + crashes on MySQL due to not dropping the PonyRider.pony foreign key + constraint before modifying the column. + """ + app_label = 'alter_alter_field_reloads_state_on_fk_target_changes' + project_state = self.apply_operations(app_label, ProjectState(), operations=[ + migrations.CreateModel('Rider', fields=[ + ('id', models.CharField(primary_key=True, max_length=100)), + ]), + migrations.CreateModel('Pony', fields=[ + ('id', models.CharField(primary_key=True, max_length=100)), + ('rider', models.ForeignKey('%s.Rider' % app_label, models.CASCADE)), + ]), + migrations.CreateModel('PonyRider', fields=[ + ('id', models.AutoField(primary_key=True)), + ('pony', models.ForeignKey('%s.Pony' % app_label, models.CASCADE)), + ]), + ]) + project_state = self.apply_operations(app_label, project_state, operations=[ + migrations.AlterField('Rider', 'id', models.CharField(primary_key=True, max_length=99)), + migrations.AlterField('Pony', 'id', models.CharField(primary_key=True, max_length=99)), + ]) + + def test_alter_field_reloads_state_on_fk_with_to_field_target_changes(self): + """ + If AlterField doesn't reload state appropriately, the second AlterField + crashes on MySQL due to not dropping the PonyRider.pony foreign key + constraint before modifying the column. + """ + app_label = 'alter_alter_field_reloads_state_on_fk_with_to_field_target_changes' + project_state = self.apply_operations(app_label, ProjectState(), operations=[ + migrations.CreateModel('Rider', fields=[ + ('id', models.CharField(primary_key=True, max_length=100)), + ('slug', models.CharField(unique=True, max_length=100)), + ]), + migrations.CreateModel('Pony', fields=[ + ('id', models.CharField(primary_key=True, max_length=100)), + ('rider', models.ForeignKey('%s.Rider' % app_label, models.CASCADE, to_field='slug')), + ('slug', models.CharField(unique=True, max_length=100)), + ]), + migrations.CreateModel('PonyRider', fields=[ + ('id', models.AutoField(primary_key=True)), + ('pony', models.ForeignKey('%s.Pony' % app_label, models.CASCADE, to_field='slug')), + ]), + ]) + project_state = self.apply_operations(app_label, project_state, operations=[ + migrations.AlterField('Rider', 'slug', models.CharField(unique=True, max_length=99)), + migrations.AlterField('Pony', 'slug', models.CharField(unique=True, max_length=99)), + ]) + + def test_rename_field_reloads_state_on_fk_target_changes(self): + """ + If RenameField doesn't reload state appropriately, the AlterField + crashes on MySQL due to not dropping the PonyRider.pony foreign key + constraint before modifying the column. + """ + app_label = 'alter_rename_field_reloads_state_on_fk_target_changes' + project_state = self.apply_operations(app_label, ProjectState(), operations=[ + migrations.CreateModel('Rider', fields=[ + ('id', models.CharField(primary_key=True, max_length=100)), + ]), + migrations.CreateModel('Pony', fields=[ + ('id', models.CharField(primary_key=True, max_length=100)), + ('rider', models.ForeignKey('%s.Rider' % app_label, models.CASCADE)), + ]), + migrations.CreateModel('PonyRider', fields=[ + ('id', models.AutoField(primary_key=True)), + ('pony', models.ForeignKey('%s.Pony' % app_label, models.CASCADE)), + ]), + ]) + project_state = self.apply_operations(app_label, project_state, operations=[ + migrations.RenameField('Rider', 'id', 'id2'), + migrations.AlterField('Pony', 'id', models.CharField(primary_key=True, max_length=99)), + ]) + def test_rename_field(self): """ Tests the RenameField operation. |
