summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarkus Holtermann <info@markusholtermann.eu>2015-04-03 18:42:44 +0200
committerMarkus Holtermann <info@markusholtermann.eu>2015-04-21 12:06:11 +0200
commit0cacb8f8ba94b06a78dcdfa22dc406a8a20a7f88 (patch)
treee83617279600d789bf791ebdbb9b9d8a6b55a5cd /tests
parent697317f3340b1d1f40586262098ad4dbae9aebaf (diff)
[1.8.x] Fixed #24573 -- Considered new related models for reloading
Thanks tttomekkk for the report. Backport of b93690c4652a108b4305c0df34509bfc267fd927 from master
Diffstat (limited to 'tests')
-rw-r--r--tests/migrations/test_state.py53
1 files changed, 52 insertions, 1 deletions
diff --git a/tests/migrations/test_state.py b/tests/migrations/test_state.py
index 663815d6f9..33016fdfce 100644
--- a/tests/migrations/test_state.py
+++ b/tests/migrations/test_state.py
@@ -1,7 +1,7 @@
from django.apps.registry import Apps
from django.db import models
from django.db.migrations.operations import (
- AlterField, DeleteModel, RemoveField,
+ AddField, AlterField, DeleteModel, RemoveField,
)
from django.db.migrations.state import (
InvalidBasesError, ModelState, ProjectState, get_related_models_recursive,
@@ -368,6 +368,57 @@ class StateTests(TestCase):
project_state.add_model(ModelState.from_model(B))
self.assertEqual(len(project_state.apps.get_models()), 2)
+ def test_add_relations(self):
+ """
+ #24573 - Adding relations to existing models should reload the
+ referenced models too.
+ """
+ class A(models.Model):
+ class Meta:
+ app_label = 'something'
+
+ class B(A):
+ class Meta:
+ app_label = 'something'
+
+ class C(models.Model):
+ class Meta:
+ app_label = 'something'
+
+ project_state = ProjectState()
+ project_state.add_model(ModelState.from_model(A))
+ project_state.add_model(ModelState.from_model(B))
+ project_state.add_model(ModelState.from_model(C))
+
+ project_state.apps # We need to work with rendered models
+
+ old_state = project_state.clone()
+ model_a_old = old_state.apps.get_model('something', 'A')
+ model_b_old = old_state.apps.get_model('something', 'B')
+ model_c_old = old_state.apps.get_model('something', 'C')
+ # Check that the relations between the old models are correct
+ self.assertIs(model_a_old._meta.get_field('b').related_model, model_b_old)
+ self.assertIs(model_b_old._meta.get_field('a_ptr').related_model, model_a_old)
+
+ operation = AddField('c', 'to_a', models.OneToOneField('something.A', related_name='from_c'))
+ operation.state_forwards('something', project_state)
+ model_a_new = project_state.apps.get_model('something', 'A')
+ model_b_new = project_state.apps.get_model('something', 'B')
+ model_c_new = project_state.apps.get_model('something', 'C')
+
+ # Check that all models have changed
+ self.assertIsNot(model_a_old, model_a_new)
+ self.assertIsNot(model_b_old, model_b_new)
+ self.assertIsNot(model_c_old, model_c_new)
+ # Check that the relations between the old models still hold
+ self.assertIs(model_a_old._meta.get_field('b').related_model, model_b_old)
+ self.assertIs(model_b_old._meta.get_field('a_ptr').related_model, model_a_old)
+ # Check that the relations between the new models correct
+ self.assertIs(model_a_new._meta.get_field('b').related_model, model_b_new)
+ self.assertIs(model_b_new._meta.get_field('a_ptr').related_model, model_a_new)
+ self.assertIs(model_a_new._meta.get_field('from_c').related_model, model_c_new)
+ self.assertIs(model_c_new._meta.get_field('to_a').related_model, model_a_new)
+
def test_remove_relations(self):
"""
#24225 - Tests that relations between models are updated while