summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarkus Holtermann <info@markusholtermann.eu>2015-01-13 18:18:23 +0100
committerMarkus Holtermann <info@markusholtermann.eu>2015-01-14 16:09:33 +0100
commit88786afbffc5c095f6491e080afea394f63bb44a (patch)
tree631f1f1ca340a5641271ee058304244e153a4bfa /tests
parentec7ef5afbbd12abe74314d557aabb3d85d667749 (diff)
Fixed #24147 -- Prevented managers leaking model during migrations
Thanks Tim Graham for the review.
Diffstat (limited to 'tests')
-rw-r--r--tests/migrations/test_state.py38
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/migrations/test_state.py b/tests/migrations/test_state.py
index e069649810..6410477b36 100644
--- a/tests/migrations/test_state.py
+++ b/tests/migrations/test_state.py
@@ -1,5 +1,6 @@
from django.apps.registry import Apps
from django.db import models
+from django.db.migrations.operations import RemoveField
from django.db.migrations.state import ProjectState, ModelState, InvalidBasesError
from django.test import TestCase
@@ -505,6 +506,43 @@ class StateTests(TestCase):
["id", "author"],
)
+ def test_manager_refer_correct_model_version(self):
+ """
+ #24147 - Tests that managers refer to the correct version of a
+ historical model
+ """
+ project_state = ProjectState()
+ project_state.add_model(ModelState(
+ app_label="migrations",
+ name="Tag",
+ fields=[
+ ("id", models.AutoField(primary_key=True)),
+ ("hidden", models.BooleanField()),
+ ],
+ managers=[
+ ('food_mgr', FoodManager('a', 'b')),
+ ('food_qs', FoodQuerySet.as_manager()),
+ ]
+ ))
+
+ old_model = project_state.apps.get_model('migrations', 'tag')
+
+ new_state = project_state.clone()
+ operation = RemoveField("tag", "hidden")
+ operation.state_forwards("migrations", new_state)
+
+ new_model = new_state.apps.get_model('migrations', 'tag')
+
+ self.assertIsNot(old_model, new_model)
+ self.assertIs(old_model, old_model.food_mgr.model)
+ self.assertIs(old_model, old_model.food_qs.model)
+ self.assertIs(new_model, new_model.food_mgr.model)
+ self.assertIs(new_model, new_model.food_qs.model)
+ self.assertIsNot(old_model.food_mgr, new_model.food_mgr)
+ self.assertIsNot(old_model.food_qs, new_model.food_qs)
+ self.assertIsNot(old_model.food_mgr.model, new_model.food_mgr.model)
+ self.assertIsNot(old_model.food_qs.model, new_model.food_qs.model)
+
class ModelStateTests(TestCase):
def test_custom_model_base(self):