summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarkus Holtermann <info@markusholtermann.eu>2014-12-02 19:25:46 +0100
committerTim Graham <timograham@gmail.com>2014-12-29 13:41:12 -0500
commit623ccdd598625591d1a12fc1564cf3ef9a87581f (patch)
tree3f80ab62a49e7ac0824a59bf8e346ac0a73bc89b /tests
parent3c5d1edb39020f549c58e0696b8ab2f03a88d753 (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.py37
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