summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAndrew Godwin <andrew@aeracode.org>2013-10-02 17:33:41 +0100
committerAndrew Godwin <andrew@aeracode.org>2013-10-02 17:34:22 +0100
commita80d9ab0fe25abdf80fd78849ddf5dd977f14316 (patch)
tree009d2e019a774d1e6748a0d05aa531299695be6a /tests
parent75bb6ba96660e2a06e18d99120c05db2bb9fa9cc (diff)
Initial version of MigrationOptimizer and tests
Diffstat (limited to 'tests')
-rw-r--r--tests/migrations/test_optimizer.py95
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"),
+ ],
+ [],
+ )