diff options
| author | Andrew Godwin <andrew@aeracode.org> | 2013-10-02 17:33:41 +0100 |
|---|---|---|
| committer | Andrew Godwin <andrew@aeracode.org> | 2013-10-02 17:34:22 +0100 |
| commit | a80d9ab0fe25abdf80fd78849ddf5dd977f14316 (patch) | |
| tree | 009d2e019a774d1e6748a0d05aa531299695be6a /tests | |
| parent | 75bb6ba96660e2a06e18d99120c05db2bb9fa9cc (diff) | |
Initial version of MigrationOptimizer and tests
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/migrations/test_optimizer.py | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/tests/migrations/test_optimizer.py b/tests/migrations/test_optimizer.py new file mode 100644 index 0000000000..f2b6e58a84 --- /dev/null +++ b/tests/migrations/test_optimizer.py @@ -0,0 +1,95 @@ +# encoding: utf8 +import operator +from django.test import TestCase +from django.db.migrations.optimizer import MigrationOptimizer +from django.db import migrations +from django.db import models + + +class OptimizerTests(TestCase): + """ + Tests the migration autodetector. + """ + + def optimize(self, operations): + """ + Handy shortcut for getting results + number of loops + """ + optimizer = MigrationOptimizer() + return optimizer.optimize(operations), optimizer._iterations + + def assertOptimizesTo(self, operations, expected, exact=None, less_than=None): + result, iterations = self.optimize(operations) + self.assertEqual(expected, result) + if exact is not None and iterations != exact: + raise self.failureException("Optimization did not take exactly %s iterations (it took %s)" % (exact, iterations)) + if less_than is not None and iterations >= less_than: + raise self.failureException("Optimization did not take less than %s iterations (it took %s)" % (less_than, iterations)) + + def test_operation_equality(self): + """ + Tests the equality operator on lists of operations. + If this is broken, then the optimizer will get stuck in an + infinite loop, so it's kind of important. + """ + self.assertEqual( + [migrations.DeleteModel("Test")], + [migrations.DeleteModel("Test")], + ) + self.assertEqual( + [migrations.CreateModel("Test", [("name", models.CharField(max_length=255))])], + [migrations.CreateModel("Test", [("name", models.CharField(max_length=255))])], + ) + self.assertNotEqual( + [migrations.CreateModel("Test", [("name", models.CharField(max_length=255))])], + [migrations.CreateModel("Test", [("name", models.CharField(max_length=100))])], + ) + self.assertEqual( + [migrations.AddField("Test", "name", models.CharField(max_length=255))], + [migrations.AddField("Test", "name", models.CharField(max_length=255))], + ) + self.assertNotEqual( + [migrations.AddField("Test", "name", models.CharField(max_length=255))], + [migrations.AddField("Test", "name", models.CharField(max_length=100))], + ) + self.assertNotEqual( + [migrations.AddField("Test", "name", models.CharField(max_length=255))], + [migrations.AlterField("Test", "name", models.CharField(max_length=255))], + ) + + def test_single(self): + """ + Tests that the optimizer does nothing on a single operation, + and that it does it in just one pass. + """ + self.assertOptimizesTo( + [migrations.DeleteModel("Foo")], + [migrations.DeleteModel("Foo")], + exact = 1, + ) + + def test_create_delete_model(self): + """ + CreateModel and DeleteModel should collapse into nothing. + """ + self.assertOptimizesTo( + [ + migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), + migrations.DeleteModel("Foo"), + ], + [], + ) + + def test_create_alter_delete_model(self): + """ + CreateModel, AlterModelTable, AlterUniqueTogether, and DeleteModel should collapse into nothing. + """ + self.assertOptimizesTo( + [ + migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]), + migrations.AlterModelTable("Foo", "woohoo"), + migrations.AlterUniqueTogether("Foo", [["a", "b"]]), + migrations.DeleteModel("Foo"), + ], + [], + ) |
