diff options
| author | Vytis Banaitis <vytis.banaitis@gmail.com> | 2016-05-10 23:20:27 +0300 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-05-30 10:27:28 -0400 |
| commit | b737c0f5db8fe8499d39c39d2442eaee595ca0fd (patch) | |
| tree | 180e9eed129bdae1633ba3d307d36dd23f24fb24 /tests | |
| parent | ab92351bc6b58316250c1748cc6dbf55cdba03d2 (diff) | |
[1.10.x] Fixed #25044 -- Fixed migrations for renaming ManyToManyField's through model.
Backport of f1e408ff40d2c1753f92515c70a44634b4d47467 from master
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_autodetector.py | 24 | ||||
| -rw-r--r-- | tests/migrations/test_operations.py | 41 |
2 files changed, 65 insertions, 0 deletions
diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index 42c84c0ced..74dcdae88d 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -259,6 +259,10 @@ class AutodetectorTests(TestCase): ("id", models.AutoField(primary_key=True)), ("publishers", models.ManyToManyField("testapp.Publisher", through="testapp.Contract")), ]) + author_with_renamed_m2m_through = ModelState("testapp", "Author", [ + ("id", models.AutoField(primary_key=True)), + ("publishers", models.ManyToManyField("testapp.Publisher", through="testapp.Deal")), + ]) author_with_former_m2m = ModelState("testapp", "Author", [ ("id", models.AutoField(primary_key=True)), ("publishers", models.CharField(max_length=100)), @@ -286,6 +290,11 @@ class AutodetectorTests(TestCase): ("author", models.ForeignKey("testapp.Author", models.CASCADE)), ("publisher", models.ForeignKey("testapp.Publisher", models.CASCADE)), ]) + contract_renamed = ModelState("testapp", "Deal", [ + ("id", models.AutoField(primary_key=True)), + ("author", models.ForeignKey("testapp.Author", models.CASCADE)), + ("publisher", models.ForeignKey("testapp.Publisher", models.CASCADE)), + ]) publisher = ModelState("testapp", "Publisher", [ ("id", models.AutoField(primary_key=True)), ("name", models.CharField(max_length=100)), @@ -848,6 +857,21 @@ class AutodetectorTests(TestCase): # no AlterField for the related field. self.assertNumberMigrations(changes, 'otherapp', 0) + def test_rename_m2m_through_model(self): + """ + Tests autodetection of renamed models that are used in M2M relations as + through models. + """ + # Make state + before = self.make_project_state([self.author_with_m2m_through, self.publisher, self.contract]) + after = self.make_project_state([self.author_with_renamed_m2m_through, self.publisher, self.contract_renamed]) + autodetector = MigrationAutodetector(before, after, MigrationQuestioner({'ask_rename_model': True})) + changes = autodetector._detect_changes() + # Right number/type of migrations? + self.assertNumberMigrations(changes, 'testapp', 1) + self.assertOperationTypes(changes, 'testapp', 0, ['RenameModel']) + self.assertOperationAttributes(changes, 'testapp', 0, 0, old_name='Contract', new_name='Deal') + def test_rename_model_with_renamed_rel_field(self): """ Tests autodetection of renamed models while simultaneously renaming one diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py index f86a39f5ee..e208ad5204 100644 --- a/tests/migrations/test_operations.py +++ b/tests/migrations/test_operations.py @@ -727,6 +727,47 @@ class OperationTests(OperationTestBase): self.assertEqual(Rider.objects.count(), 2) self.assertEqual(Pony._meta.get_field('riders').remote_field.through.objects.count(), 2) + def test_rename_m2m_through_model(self): + app_label = "test_rename_through" + project_state = self.apply_operations(app_label, ProjectState(), operations=[ + migrations.CreateModel("Rider", fields=[ + ("id", models.AutoField(primary_key=True)), + ]), + migrations.CreateModel("Pony", fields=[ + ("id", models.AutoField(primary_key=True)), + ]), + migrations.CreateModel("PonyRider", fields=[ + ("id", models.AutoField(primary_key=True)), + ("rider", models.ForeignKey("test_rename_through.Rider", models.CASCADE)), + ("pony", models.ForeignKey("test_rename_through.Pony", models.CASCADE)), + ]), + migrations.AddField( + "Pony", + "riders", + models.ManyToManyField("test_rename_through.Rider", through="test_rename_through.PonyRider"), + ), + ]) + Pony = project_state.apps.get_model(app_label, "Pony") + Rider = project_state.apps.get_model(app_label, "Rider") + PonyRider = project_state.apps.get_model(app_label, "PonyRider") + pony = Pony.objects.create() + rider = Rider.objects.create() + PonyRider.objects.create(pony=pony, rider=rider) + + project_state = self.apply_operations(app_label, project_state, operations=[ + migrations.RenameModel("PonyRider", "PonyRider2"), + ]) + Pony = project_state.apps.get_model(app_label, "Pony") + Rider = project_state.apps.get_model(app_label, "Rider") + PonyRider = project_state.apps.get_model(app_label, "PonyRider2") + pony = Pony.objects.first() + rider = Rider.objects.create() + PonyRider.objects.create(pony=pony, rider=rider) + self.assertEqual(Pony.objects.count(), 1) + self.assertEqual(Rider.objects.count(), 2) + self.assertEqual(PonyRider.objects.count(), 2) + self.assertEqual(pony.riders.count(), 2) + def test_add_field(self): """ Tests the AddField operation. |
