summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAmos Onn <amosonn@gmail.com>2015-12-08 19:03:31 +0200
committerTim Graham <timograham@gmail.com>2015-12-09 11:08:01 -0500
commitf076cf07effe54af8a28f22431c3c76a8af61fc5 (patch)
tree05006a0eaef69ece0fcdbbf04713355723c38f78 /tests
parentbc8bc8a0123b9a4c14beb62f71616a925538ca5c (diff)
[1.9.x] Fixed #25896 -- Fixed state bug in SeparateDatabaseAndState.database_backwards().
Backport of 542b7f6c50df18f2aa201cf1de81577c1bee643c from master
Diffstat (limited to 'tests')
-rw-r--r--tests/migrations/test_operations.py76
1 files changed, 76 insertions, 0 deletions
diff --git a/tests/migrations/test_operations.py b/tests/migrations/test_operations.py
index c8f1189b3c..7118996ff7 100644
--- a/tests/migrations/test_operations.py
+++ b/tests/migrations/test_operations.py
@@ -1850,6 +1850,82 @@ class OperationTests(OperationTestBase):
self.assertEqual(definition[1], [])
self.assertEqual(sorted(definition[2]), ["database_operations", "state_operations"])
+ def test_separate_database_and_state2(self):
+ """
+ A complex SeparateDatabaseAndState operation: Multiple operations both
+ for state and database. Verify the state dependencies within each list
+ and that state ops don't affect the database.
+ """
+ app_label = "test_separatedatabaseandstate2"
+ project_state = self.set_up_test_model(app_label)
+ # Create the operation
+ database_operations = [
+ migrations.CreateModel(
+ "ILovePonies",
+ [("id", models.AutoField(primary_key=True))],
+ options={"db_table": "iloveponies"},
+ ),
+ migrations.CreateModel(
+ "ILoveMorePonies",
+ [("id", models.AutoField(primary_key=True))],
+ options={"db_table": "ilovemoreponies"},
+ ),
+ migrations.DeleteModel("ILoveMorePonies"),
+ migrations.CreateModel(
+ "ILoveEvenMorePonies",
+ [("id", models.AutoField(primary_key=True))],
+ options={"db_table": "iloveevenmoreponies"},
+ ),
+ ]
+ state_operations = [
+ migrations.CreateModel(
+ "SomethingElse",
+ [("id", models.AutoField(primary_key=True))],
+ options={"db_table": "somethingelse"},
+ ),
+ migrations.DeleteModel("SomethingElse"),
+ migrations.CreateModel(
+ "SomethingCompletelyDifferent",
+ [("id", models.AutoField(primary_key=True))],
+ options={"db_table": "somethingcompletelydifferent"},
+ ),
+ ]
+ operation = migrations.SeparateDatabaseAndState(
+ state_operations=state_operations,
+ database_operations=database_operations,
+ )
+ # Test the state alteration
+ new_state = project_state.clone()
+ operation.state_forwards(app_label, new_state)
+
+ def assertModelsAndTables(after_db):
+ # Check that tables and models exist, or don't, as they should:
+ self.assertNotIn((app_label, "somethingelse"), new_state.models)
+ self.assertEqual(len(new_state.models[app_label, "somethingcompletelydifferent"].fields), 1)
+ self.assertNotIn((app_label, "iloveponiesonies"), new_state.models)
+ self.assertNotIn((app_label, "ilovemoreponies"), new_state.models)
+ self.assertNotIn((app_label, "iloveevenmoreponies"), new_state.models)
+ self.assertTableNotExists("somethingelse")
+ self.assertTableNotExists("somethingcompletelydifferent")
+ self.assertTableNotExists("ilovemoreponies")
+ if after_db:
+ self.assertTableExists("iloveponies")
+ self.assertTableExists("iloveevenmoreponies")
+ else:
+ self.assertTableNotExists("iloveponies")
+ self.assertTableNotExists("iloveevenmoreponies")
+
+ assertModelsAndTables(after_db=False)
+ # Test the database alteration
+ with connection.schema_editor() as editor:
+ operation.database_forwards(app_label, editor, project_state, new_state)
+ assertModelsAndTables(after_db=True)
+ # And test reversal
+ self.assertTrue(operation.reversible)
+ with connection.schema_editor() as editor:
+ operation.database_backwards(app_label, editor, new_state, project_state)
+ assertModelsAndTables(after_db=False)
+
class SwappableOperationTests(OperationTestBase):
"""