diff options
| author | Sergey Fedoseev <fedoseev.sergey@gmail.com> | 2016-06-05 20:28:15 +0500 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2016-06-06 11:49:45 -0400 |
| commit | 7fc4c1db627807874966e4f96b34cff7c9af886f (patch) | |
| tree | fc08be094beaa9aa37279908ecf8e4a5a0650f87 /tests | |
| parent | 316395d82874beea6af08a873e91b1880d0b982a (diff) | |
Fixed #26710 -- Made CreateModel.references_model() take app_label into account.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_optimizer.py | 57 |
1 files changed, 51 insertions, 6 deletions
diff --git a/tests/migrations/test_optimizer.py b/tests/migrations/test_optimizer.py index ce60bb32af..6bf09d0178 100644 --- a/tests/migrations/test_optimizer.py +++ b/tests/migrations/test_optimizer.py @@ -13,15 +13,15 @@ class OptimizerTests(SimpleTestCase): Tests the migration autodetector. """ - def optimize(self, operations): + def optimize(self, operations, app_label): """ Handy shortcut for getting results + number of loops """ optimizer = MigrationOptimizer() - return optimizer.optimize(operations), optimizer._iterations + return optimizer.optimize(operations, app_label), optimizer._iterations - def assertOptimizesTo(self, operations, expected, exact=None, less_than=None): - result, iterations = self.optimize(operations) + def assertOptimizesTo(self, operations, expected, exact=None, less_than=None, app_label=None): + result, iterations = self.optimize(operations, app_label) result = [repr(f.deconstruct()) for f in result] expected = [repr(f.deconstruct()) for f in expected] self.assertEqual(expected, result) @@ -34,8 +34,8 @@ class OptimizerTests(SimpleTestCase): "Optimization did not take less than %s iterations (it took %s)" % (less_than, iterations) ) - def assertDoesNotOptimize(self, operations): - self.assertOptimizesTo(operations, operations) + def assertDoesNotOptimize(self, operations, **kwargs): + self.assertOptimizesTo(operations, operations, **kwargs) def test_single(self): """ @@ -212,6 +212,29 @@ class OptimizerTests(SimpleTestCase): migrations.DeleteModel("Foo"), ], ) + # The same operations should be optimized if app_label is specified and + # a FK references a model from the other app. + self.assertOptimizesTo( + [ + migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), + migrations.CreateModel("Bar", [("other", models.ForeignKey("testapp.Foo", models.CASCADE))]), + migrations.DeleteModel("Foo"), + ], + [ + migrations.CreateModel("Bar", [("other", models.ForeignKey("testapp.Foo", models.CASCADE))]), + ], + app_label="otherapp", + ) + # But it shouldn't work if a FK references a model with the same + # app_label. + self.assertDoesNotOptimize( + [ + migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), + migrations.CreateModel("Bar", [("other", models.ForeignKey("testapp.Foo", models.CASCADE))]), + migrations.DeleteModel("Foo"), + ], + app_label="testapp", + ) # This should not work - bases should block it self.assertOptimizesTo( [ @@ -225,6 +248,28 @@ class OptimizerTests(SimpleTestCase): migrations.DeleteModel("Foo"), ], ) + # The same operations should be optimized if app_label and none of + # bases belong to that app. + self.assertOptimizesTo( + [ + migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), + migrations.CreateModel("Bar", [("size", models.IntegerField())], bases=("testapp.Foo", )), + migrations.DeleteModel("Foo"), + ], + [ + migrations.CreateModel("Bar", [("size", models.IntegerField())], bases=("testapp.Foo", )), + ], + app_label="otherapp", + ) + # But it shouldn't work if some of bases belongs to the specified app. + self.assertDoesNotOptimize( + [ + migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), + migrations.CreateModel("Bar", [("size", models.IntegerField())], bases=("testapp.Foo", )), + migrations.DeleteModel("Foo"), + ], + app_label="testapp", + ) def test_create_model_add_field(self): """ |
