diff options
| author | Markus Holtermann <info@markusholtermann.eu> | 2014-12-02 19:25:46 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2014-12-29 13:41:12 -0500 |
| commit | 623ccdd598625591d1a12fc1564cf3ef9a87581f (patch) | |
| tree | 3f80ab62a49e7ac0824a59bf8e346ac0a73bc89b /tests | |
| parent | 3c5d1edb39020f549c58e0696b8ab2f03a88d753 (diff) | |
Fixed #23938 -- Added migration support for m2m to concrete fields and vice versa
Thanks to Michael D. Hoyle for the report and Tim Graham for the review.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_autodetector.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/migrations/test_autodetector.py b/tests/migrations/test_autodetector.py index 328ccf05db..c022a2e0d8 100644 --- a/tests/migrations/test_autodetector.py +++ b/tests/migrations/test_autodetector.py @@ -126,6 +126,10 @@ class AutodetectorTests(TestCase): ("id", models.AutoField(primary_key=True)), ("publishers", models.ManyToManyField("testapp.Publisher", through="testapp.Contract")), ]) + author_with_former_m2m = ModelState("testapp", "Author", [ + ("id", models.AutoField(primary_key=True)), + ("publishers", models.CharField(max_length=100)), + ]) author_with_options = ModelState("testapp", "Author", [ ("id", models.AutoField(primary_key=True)), ], { @@ -1326,6 +1330,39 @@ class AutodetectorTests(TestCase): self.assertOperationAttributes(changes, "testapp", 0, 3, name="Author") self.assertOperationAttributes(changes, "testapp", 0, 4, name="Contract") + def test_concrete_field_changed_to_many_to_many(self): + """ + #23938 - Tests that changing a concrete field into a ManyToManyField + first removes the concrete field and then adds the m2m field. + """ + before = self.make_project_state([self.author_with_former_m2m]) + after = self.make_project_state([self.author_with_m2m, self.publisher]) + autodetector = MigrationAutodetector(before, after) + changes = autodetector._detect_changes() + # Right number/type of migrations? + self.assertNumberMigrations(changes, "testapp", 1) + self.assertOperationTypes(changes, "testapp", 0, ["CreateModel", "RemoveField", "AddField"]) + self.assertOperationAttributes(changes, 'testapp', 0, 0, name='Publisher') + self.assertOperationAttributes(changes, 'testapp', 0, 1, name="publishers", model_name='author') + self.assertOperationAttributes(changes, 'testapp', 0, 2, name="publishers", model_name='author') + + def test_many_to_many_changed_to_concrete_field(self): + """ + #23938 - Tests that changing a ManyToManyField into a concrete field + first removes the m2m field and then adds the concrete field. + """ + before = self.make_project_state([self.author_with_m2m, self.publisher]) + after = self.make_project_state([self.author_with_former_m2m]) + autodetector = MigrationAutodetector(before, after) + changes = autodetector._detect_changes() + # Right number/type of migrations? + self.assertNumberMigrations(changes, "testapp", 1) + self.assertOperationTypes(changes, "testapp", 0, ["RemoveField", "AddField", "DeleteModel"]) + self.assertOperationAttributes(changes, 'testapp', 0, 0, name="publishers", model_name='author') + self.assertOperationAttributes(changes, 'testapp', 0, 1, name="publishers", model_name='author') + self.assertOperationAttributes(changes, 'testapp', 0, 2, name='Publisher') + self.assertOperationFieldAttributes(changes, 'testapp', 0, 1, max_length=100) + def test_non_circular_foreignkey_dependency_removal(self): """ If two models with a ForeignKey from one to the other are removed at the |
