diff options
| author | Simon Charette <charette.s@gmail.com> | 2017-11-24 03:05:56 -0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-12-30 14:59:22 -0500 |
| commit | dcdd219ee1e062dc6189f382e0298e0adf5d5ddf (patch) | |
| tree | 7781d6cd4e8ede3dc234a7739cc939248d6a5b25 /tests | |
| parent | 2faeb21d2f618d5bfe9f8f6c574730d3f9407b2a (diff) | |
Fixed #25817 -- Made RenameField repoint to_field/to_fields references.
Also updated the autodetector to assume the RenameField operation will
perform the required repointing.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_autodetector.py | 96 | ||||
| -rw-r--r-- | tests/migrations/test_operations.py | 28 |
2 files changed, 124 insertions, 0 deletions
diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index bc828203f8..43c3a1941a 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -821,6 +821,102 @@ class AutodetectorTests(TestCase): self.assertOperationTypes(changes, 'testapp', 0, ["RenameField"]) self.assertOperationAttributes(changes, 'testapp', 0, 0, old_name="name", new_name="names") + def test_rename_field_foreign_key_to_field(self): + before = [ + ModelState('app', 'Foo', [ + ('id', models.AutoField(primary_key=True)), + ('field', models.IntegerField(unique=True)), + ]), + ModelState('app', 'Bar', [ + ('id', models.AutoField(primary_key=True)), + ('foo', models.ForeignKey('app.Foo', models.CASCADE, to_field='field')), + ]), + ] + after = [ + ModelState('app', 'Foo', [ + ('id', models.AutoField(primary_key=True)), + ('renamed_field', models.IntegerField(unique=True)), + ]), + ModelState('app', 'Bar', [ + ('id', models.AutoField(primary_key=True)), + ('foo', models.ForeignKey('app.Foo', models.CASCADE, to_field='renamed_field')), + ]), + ] + changes = self.get_changes(before, after, MigrationQuestioner({'ask_rename': True})) + # Right number/type of migrations? + self.assertNumberMigrations(changes, 'app', 1) + self.assertOperationTypes(changes, 'app', 0, ['RenameField']) + self.assertOperationAttributes(changes, 'app', 0, 0, old_name='field', new_name='renamed_field') + + def test_rename_foreign_object_fields(self): + fields = ('first', 'second') + renamed_fields = ('first_renamed', 'second_renamed') + before = [ + ModelState('app', 'Foo', [ + ('id', models.AutoField(primary_key=True)), + ('first', models.IntegerField()), + ('second', models.IntegerField()), + ], options={'unique_together': {fields}}), + ModelState('app', 'Bar', [ + ('id', models.AutoField(primary_key=True)), + ('first', models.IntegerField()), + ('second', models.IntegerField()), + ('foo', models.ForeignObject( + 'app.Foo', models.CASCADE, from_fields=fields, to_fields=fields, + )), + ]), + ] + # Case 1: to_fields renames. + after = [ + ModelState('app', 'Foo', [ + ('id', models.AutoField(primary_key=True)), + ('first_renamed', models.IntegerField()), + ('second_renamed', models.IntegerField()), + ], options={'unique_together': {renamed_fields}}), + ModelState('app', 'Bar', [ + ('id', models.AutoField(primary_key=True)), + ('first', models.IntegerField()), + ('second', models.IntegerField()), + ('foo', models.ForeignObject( + 'app.Foo', models.CASCADE, from_fields=fields, to_fields=renamed_fields, + )), + ]), + ] + changes = self.get_changes(before, after, MigrationQuestioner({'ask_rename': True})) + self.assertNumberMigrations(changes, 'app', 1) + self.assertOperationTypes(changes, 'app', 0, ['RenameField', 'RenameField', 'AlterUniqueTogether']) + self.assertOperationAttributes( + changes, 'app', 0, 0, model_name='foo', old_name='first', new_name='first_renamed', + ) + self.assertOperationAttributes( + changes, 'app', 0, 1, model_name='foo', old_name='second', new_name='second_renamed', + ) + # Case 2: from_fields renames. + after = [ + ModelState('app', 'Foo', [ + ('id', models.AutoField(primary_key=True)), + ('first', models.IntegerField()), + ('second', models.IntegerField()), + ], options={'unique_together': {fields}}), + ModelState('app', 'Bar', [ + ('id', models.AutoField(primary_key=True)), + ('first_renamed', models.IntegerField()), + ('second_renamed', models.IntegerField()), + ('foo', models.ForeignObject( + 'app.Foo', models.CASCADE, from_fields=renamed_fields, to_fields=fields, + )), + ]), + ] + changes = self.get_changes(before, after, MigrationQuestioner({'ask_rename': True})) + self.assertNumberMigrations(changes, 'app', 1) + self.assertOperationTypes(changes, 'app', 0, ['RenameField', 'RenameField']) + self.assertOperationAttributes( + changes, 'app', 0, 0, model_name='bar', old_name='first', new_name='first_renamed', + ) + self.assertOperationAttributes( + changes, 'app', 0, 1, model_name='bar', old_name='second', new_name='second_renamed', + ) + def test_rename_model(self): """Tests autodetection of renamed models.""" changes = self.get_changes( diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index fb429e19cf..b5c9fb1b3d 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -1455,6 +1455,34 @@ class OperationTests(OperationTestBase): with self.assertRaisesMessage(FieldDoesNotExist, "app.model has no field named 'field'"): migrations.RenameField('model', 'field', 'new_field').state_forwards('app', state) + def test_rename_referenced_field_state_forward(self): + state = ProjectState() + state.add_model(ModelState('app', 'Model', [ + ('id', models.AutoField(primary_key=True)), + ('field', models.IntegerField(unique=True)), + ])) + state.add_model(ModelState('app', 'OtherModel', [ + ('id', models.AutoField(primary_key=True)), + ('fk', models.ForeignKey('Model', models.CASCADE, to_field='field')), + ('fo', models.ForeignObject('Model', models.CASCADE, from_fields=('fk',), to_fields=('field',))), + ])) + operation = migrations.RenameField('Model', 'field', 'renamed') + new_state = state.clone() + operation.state_forwards('app', new_state) + self.assertEqual(new_state.models['app', 'othermodel'].fields[1][1].remote_field.field_name, 'renamed') + self.assertEqual(new_state.models['app', 'othermodel'].fields[1][1].from_fields, ['self']) + self.assertEqual(new_state.models['app', 'othermodel'].fields[1][1].to_fields, ('renamed',)) + self.assertEqual(new_state.models['app', 'othermodel'].fields[2][1].from_fields, ('fk',)) + self.assertEqual(new_state.models['app', 'othermodel'].fields[2][1].to_fields, ('renamed',)) + operation = migrations.RenameField('OtherModel', 'fk', 'renamed_fk') + new_state = state.clone() + operation.state_forwards('app', new_state) + self.assertEqual(new_state.models['app', 'othermodel'].fields[1][1].remote_field.field_name, 'renamed') + self.assertEqual(new_state.models['app', 'othermodel'].fields[1][1].from_fields, ('self',)) + self.assertEqual(new_state.models['app', 'othermodel'].fields[1][1].to_fields, ('renamed',)) + self.assertEqual(new_state.models['app', 'othermodel'].fields[2][1].from_fields, ('renamed_fk',)) + self.assertEqual(new_state.models['app', 'othermodel'].fields[2][1].to_fields, ('renamed',)) + def test_alter_unique_together(self): """ Tests the AlterUniqueTogether operation. |
